1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* -*- mode: C; c-basic-offset: 3; -*- */
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------------------------------------------------------*/
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- begin                                 guest_s390_toIR.c ---*/
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------------------------------------------------------*/
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This file is part of Valgrind, a dynamic binary instrumentation
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   framework.
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Copyright IBM Corp. 2010-2013
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 and Christian Borntraeger */
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Translates s390 code to IR. */
34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "libvex_basictypes.h"
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "libvex_ir.h"
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex_emnote.h"
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "libvex_s390x_common.h"
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "main_util.h"               /* vassert */
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "main_globals.h"            /* vex_traceflags */
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "guest_generic_bb_to_IR.h"  /* DisResult */
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "guest_s390_defs.h"         /* prototypes for this file's functions */
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "s390_disasm.h"
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "s390_defs.h"               /* S390_BFP_ROUND_xyzzy */
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "host_s390_defs.h"          /* s390_host_has_xyzzy */
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Forward declarations                                 ---*/
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic UInt s390_decode_and_irgen(UChar *, UInt, DisResult *);
52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void s390_irgen_xonc(IROp, IRTemp, IRTemp, IRTemp);
53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void s390_irgen_CLC_EX(IRTemp, IRTemp, IRTemp);
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Globals                                              ---*/
58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The IRSB* into which we're generating code. */
61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRSB *irsb;
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The guest address for the instruction currently being
64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   translated. */
65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic Addr64 guest_IA_curr_instr;
66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The guest address for the instruction following the current instruction. */
68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic Addr64 guest_IA_next_instr;
69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Result of disassembly step. */
71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic DisResult *dis_res;
72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Resteer function and callback data */
74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic Bool (*resteer_fn)(void *, Addr64);
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void *resteer_data;
76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Whether to print diagnostics for illegal instructions. */
78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic Bool sigill_diag;
79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The last seen execute target instruction */
81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovULong last_execute_target;
82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The possible outcomes of a decoding operation */
84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef enum {
85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_DECODE_OK,
86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_DECODE_UNKNOWN_INSN,
87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_DECODE_UNIMPLEMENTED_INSN,
88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_DECODE_UNKNOWN_SPECIAL_INSN,
89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_DECODE_ERROR
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} s390_decode_t;
91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
92663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Helpers for constructing IR.                         ---*/
95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Sign extend a value with the given number of bits. This is a
98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   macro because it allows us to overload the type of the value.
99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Note that VALUE must have a signed type! */
100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#undef sign_extend
101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define sign_extend(value,num_bits) \
102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov(((value) << (sizeof(__typeof__(value)) * 8 - (num_bits))) >> \
103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (sizeof(__typeof__(value)) * 8 - (num_bits)))
104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Add a statement to the current irsb. */
107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstmt(IRStmt *st)
109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   addStmtToIRSB(irsb, st);
111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Allocate a new temporary of the given type. */
114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRTemp
115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovnewTemp(IRType type)
116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(isPlausibleIRType(type));
118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return newIRTemp(irsb->tyenv, type);
120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression node for a temporary */
123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmkexpr(IRTemp tmp)
125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_RdTmp(tmp);
127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Generate an expression node for an address. */
130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic __inline__ IRExpr *
131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengmkaddr_expr(Addr64 addr)
132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return IRExpr_Const(IRConst_U64(addr));
134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Add a statement that assigns to a temporary */
137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovassign(IRTemp dst, IRExpr *expr)
139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_WrTmp(dst, expr));
141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Write an address into the guest_IA */
144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic __inline__ void
145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengput_IA(IRExpr *address)
146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_IA), address));
148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create a temporary of the given type and assign the expression to it */
151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRTemp
152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmktemp(IRType type, IRExpr *expr)
153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp temp = newTemp(type);
155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(temp, expr);
157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return temp;
159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create a unary expression */
162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunop(IROp kind, IRExpr *op)
164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Unop(kind, op);
166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create a binary expression */
169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovbinop(IROp kind, IRExpr *op1, IRExpr *op2)
171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Binop(kind, op1, op2);
173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create a ternary expression */
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtriop(IROp kind, IRExpr *op1, IRExpr *op2, IRExpr *op3)
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Triop(kind, op1, op2, op3);
180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create a quaternary expression */
183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__  IRExpr *
184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovqop(IROp kind, IRExpr *op1, IRExpr *op2, IRExpr *op3, IRExpr *op4)
185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Qop(kind, op1, op2, op3, op4);
187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression node for an 8-bit integer constant */
190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovmkU8(UInt value)
192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(value < 256);
194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Const(IRConst_U8((UChar)value));
196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression node for a 16-bit integer constant */
199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovmkU16(UInt value)
201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(value < 65536);
203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Const(IRConst_U16((UShort)value));
205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression node for a 32-bit integer constant */
208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovmkU32(UInt value)
210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Const(IRConst_U32(value));
212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression node for a 64-bit integer constant */
215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovmkU64(ULong value)
217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Const(IRConst_U64(value));
219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression node for a 32-bit floating point constant
222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   whose value is given by a bit pattern. */
223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovmkF32i(UInt value)
225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Const(IRConst_F32i(value));
227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression node for a 32-bit floating point constant
230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   whose value is given by a bit pattern. */
231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovmkF64i(ULong value)
233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Const(IRConst_F64i(value));
235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Little helper function for my sanity. ITE = if-then-else */
238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRExpr *
239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmkite(IRExpr *condition, IRExpr *iftrue, IRExpr *iffalse)
240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, condition) == Ity_I1);
242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return IRExpr_ITE(condition, iftrue, iffalse);
244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Add a statement that stores DATA at ADDR. This is a big-endian machine. */
247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void __inline__
248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstore(IRExpr *addr, IRExpr *data)
249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Store(Iend_BE, addr, data));
251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression that loads a TYPE sized value from ADDR.
254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This is a big-endian machine. */
255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovload(IRType type, IRExpr *addr)
257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Load(Iend_BE, type, addr);
259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Function call */
262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcall_function(IRExpr *callee_address)
264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_IA(callee_address);
266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->whatNext    = Dis_StopHere;
268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->jk_StopHere = Ijk_Call;
269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Function call with known target. */
272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcall_function_and_chase(Addr64 callee_address)
274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (resteer_fn(resteer_data, callee_address)) {
276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      dis_res->whatNext   = Dis_ResteerU;
277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      dis_res->continueAt = callee_address;
278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      put_IA(mkaddr_expr(callee_address));
280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      dis_res->whatNext = Dis_StopHere;
282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dis_res->jk_StopHere = Ijk_Call;
283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Function return sequence */
287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn_from_function(IRExpr *return_address)
289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_IA(return_address);
291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->whatNext    = Dis_StopHere;
293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->jk_StopHere = Ijk_Ret;
294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* A conditional branch whose target is not known at instrumentation time.
297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (condition) goto computed_target;
299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Needs to be represented as:
301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (! condition) goto next_instruction;
303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   goto computed_target;
304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengif_condition_goto_computed(IRExpr *condition, IRExpr *target)
307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, condition) == Ity_I1);
309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   condition = unop(Iop_Not1, condition);
311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Exit(condition, Ijk_Boring, IRConst_U64(guest_IA_next_instr),
313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    S390X_GUEST_OFFSET(guest_IA)));
314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_IA(target);
316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->whatNext    = Dis_StopHere;
318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->jk_StopHere = Ijk_Boring;
319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* A conditional branch whose target is known at instrumentation time. */
322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovif_condition_goto(IRExpr *condition, Addr64 target)
324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, condition) == Ity_I1);
326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Exit(condition, Ijk_Boring, IRConst_U64(target),
328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    S390X_GUEST_OFFSET(guest_IA)));
329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_IA(mkaddr_expr(guest_IA_next_instr));
331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->whatNext    = Dis_StopHere;
333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->jk_StopHere = Ijk_Boring;
334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* An unconditional branch. Target may or may not be known at instrumentation
337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   time. */
338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovalways_goto(IRExpr *target)
340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_IA(target);
342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->whatNext    = Dis_StopHere;
344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->jk_StopHere = Ijk_Boring;
345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* An unconditional branch to a known target. */
349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovalways_goto_and_chase(Addr64 target)
351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (resteer_fn(resteer_data, target)) {
353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Follow into the target */
354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      dis_res->whatNext   = Dis_ResteerU;
355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      dis_res->continueAt = target;
356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      put_IA(mkaddr_expr(target));
358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dis_res->whatNext    = Dis_StopHere;
360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dis_res->jk_StopHere = Ijk_Boring;
361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* A system call */
365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovsystem_call(IRExpr *sysno)
367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Store the system call number in the pseudo register. */
369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_SYSNO), sysno));
370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Store the current IA into guest_IP_AT_SYSCALL. libvex_ir.h says so. */
372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_IP_AT_SYSCALL),
373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                   mkU64(guest_IA_curr_instr)));
374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_IA(mkaddr_expr(guest_IA_next_instr));
376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* It's important that all ArchRegs carry their up-to-date value
378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      at this point.  So we declare an end-of-block here, which
379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      forces any TempRegs caching ArchRegs to be flushed. */
380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->whatNext    = Dis_StopHere;
381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->jk_StopHere = Ijk_Sys_syscall;
382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* A side exit that branches back to the current insn if CONDITION is
385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   true. Does not set DisResult. */
386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengiterate_if(IRExpr *condition)
388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(typeOfIRExpr(irsb->tyenv, condition) == Ity_I1);
390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Exit(condition, Ijk_Boring, IRConst_U64(guest_IA_curr_instr),
392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    S390X_GUEST_OFFSET(guest_IA)));
393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* A side exit that branches back to the current insn.
396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Does not set DisResult. */
397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic __inline__ void
398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengiterate(void)
399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(IRExpr_Const(IRConst_U1(True)));
401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* A side exit that branches back to the insn immediately following the
404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   current insn if CONDITION is true. Does not set DisResult. */
405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengnext_insn_if(IRExpr *condition)
407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(typeOfIRExpr(irsb->tyenv, condition) == Ity_I1);
409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Exit(condition, Ijk_Boring, IRConst_U64(guest_IA_next_instr),
411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    S390X_GUEST_OFFSET(guest_IA)));
412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Convenience function to restart the current insn */
415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengrestart_if(IRExpr *condition)
417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(typeOfIRExpr(irsb->tyenv, condition) == Ity_I1);
419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
420eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   stmt(IRStmt_Exit(condition, Ijk_InvalICache,
421eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                    IRConst_U64(guest_IA_curr_instr),
422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    S390X_GUEST_OFFSET(guest_IA)));
423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Convenience function to yield to thread scheduler */
426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengyield_if(IRExpr *condition)
428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Exit(condition, Ijk_Yield, IRConst_U64(guest_IA_next_instr),
430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    S390X_GUEST_OFFSET(guest_IA)));
431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *get_fpr_dw0(UInt);
434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void    put_fpr_dw0(UInt, IRExpr *);
435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic __inline__ IRExpr *get_dpr_dw0(UInt);
436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic __inline__ void    put_dpr_dw0(UInt, IRExpr *);
437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read a floating point register pair and combine their contents into a
439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   128-bit value */
440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRExpr *
441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_fpr_pair(UInt archreg)
442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *high = get_fpr_dw0(archreg);
444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *low  = get_fpr_dw0(archreg + 2);
445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return binop(Iop_F64HLtoF128, high, low);
447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write a 128-bit floating point value into a register pair. */
450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_fpr_pair(UInt archreg, IRExpr *expr)
452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *high = unop(Iop_F128HItoF64, expr);
454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *low  = unop(Iop_F128LOtoF64, expr);
455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(archreg,     high);
457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(archreg + 2, low);
458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Read a floating point register pair cointaining DFP value
461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   and combine their contents into a 128-bit value */
462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr *
464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovget_dpr_pair(UInt archreg)
465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr *high = get_dpr_dw0(archreg);
467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr *low  = get_dpr_dw0(archreg + 2);
468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return binop(Iop_D64HLtoD128, high, low);
470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Write a 128-bit decimal floating point value into a register pair. */
473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovput_dpr_pair(UInt archreg, IRExpr *expr)
475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr *high = unop(Iop_D128HItoD64, expr);
477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr *low  = unop(Iop_D128LOtoD64, expr);
478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(archreg,     high);
480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(archreg + 2, low);
481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Terminate the current IRSB with an emulation failure. */
484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovemulation_failure(VexEmNote fail_kind)
486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_EMNOTE), mkU32(fail_kind)));
488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   dis_res->whatNext = Dis_StopHere;
489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   dis_res->jk_StopHere = Ijk_EmFail;
490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Terminate the current IRSB with an emulation warning. */
493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovemulation_warning(VexEmNote warn_kind)
495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_EMNOTE), mkU32(warn_kind)));
497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   dis_res->whatNext = Dis_StopHere;
498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   dis_res->jk_StopHere = Ijk_EmWarn;
499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- IR Debugging aids.                                   ---*/
503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if 0
505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic ULong
507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_do_print(HChar *text, ULong value)
508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_printf("%s %llu\n", text, value);
510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return 0;
511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_print(HChar *text, IRExpr *value)
515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRDirty *d;
517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   d = unsafeIRDirty_0_N(0 /* regparms */, "s390_do_print", &s390_do_print,
519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         mkIRExprVec_2(mkU64((ULong)text), value));
520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Dirty(d));
521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Build the flags thunk.                               ---*/
527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Completely fill the flags thunk. We're always filling all fields.
530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Apparently, that is better for redundant PUT elimination. */
531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_thunk_fill(IRExpr *op, IRExpr *dep1, IRExpr *dep2, IRExpr *ndep)
533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op_off, dep1_off, dep2_off, ndep_off;
535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   op_off   = S390X_GUEST_OFFSET(guest_CC_OP);
537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dep1_off = S390X_GUEST_OFFSET(guest_CC_DEP1);
538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dep2_off = S390X_GUEST_OFFSET(guest_CC_DEP2);
539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ndep_off = S390X_GUEST_OFFSET(guest_CC_NDEP);
540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(op_off,   op));
542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(dep1_off, dep1));
543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(dep2_off, dep2));
544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(ndep_off, ndep));
545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression for V and widen the result to 64 bit. */
549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRExpr *
550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_widen(IRTemp v, Bool sign_extend)
551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *expr;
553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   expr = mkexpr(v);
555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (typeOfIRTemp(irsb->tyenv, v)) {
557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case Ity_I64:
558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case Ity_I32:
560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      expr = unop(sign_extend ? Iop_32Sto64 : Iop_32Uto64, expr);
561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case Ity_I16:
563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      expr = unop(sign_extend ? Iop_16Sto64 : Iop_16Uto64, expr);
564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case Ity_I8:
566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      expr = unop(sign_extend ? Iop_8Sto64 : Iop_8Uto64, expr);
567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   default:
569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      vpanic("s390_cc_widen");
570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return expr;
573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_thunk_put1(UInt opc, IRTemp d1, Bool sign_extend)
577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op, *dep1, *dep2, *ndep;
579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op   = mkU64(opc);
581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep1 = s390_cc_widen(d1, sign_extend);
582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep2 = mkU64(0);
583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ndep = mkU64(0);
584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(op, dep1, dep2, ndep);
586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_thunk_put2(UInt opc, IRTemp d1, IRTemp d2, Bool sign_extend)
591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op, *dep1, *dep2, *ndep;
593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op   = mkU64(opc);
595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep1 = s390_cc_widen(d1, sign_extend);
596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep2 = s390_cc_widen(d2, sign_extend);
597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ndep = mkU64(0);
598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(op, dep1, dep2, ndep);
600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* memcheck believes that the NDEP field in the flags thunk is always
604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   defined. But for some flag computations (e.g. add with carry) that is
605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   just not true. We therefore need to convey to memcheck that the value
606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   of the ndep field does matter and therefore we make the DEP2 field
607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   depend on it:
608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   DEP2 = original_DEP2 ^ NDEP
610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   In s390_calculate_cc we exploit that  (a^b)^b == a
612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   I.e. we xor the DEP2 value with the NDEP value to recover the
613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   original_DEP2 value. */
614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_thunk_put3(UInt opc, IRTemp d1, IRTemp d2, IRTemp nd, Bool sign_extend)
616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op, *dep1, *dep2, *ndep, *dep2x;
618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op   = mkU64(opc);
620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep1 = s390_cc_widen(d1, sign_extend);
621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep2 = s390_cc_widen(d2, sign_extend);
622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ndep = s390_cc_widen(nd, sign_extend);
623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep2x = binop(Iop_Xor64, dep2, ndep);
625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(op, dep1, dep2x, ndep);
627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write one floating point value into the flags thunk */
631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_thunk_put1f(UInt opc, IRTemp d1)
633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op, *dep1, *dep2, *ndep;
635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Make the CC_DEP1 slot appear completely defined.
637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Otherwise, assigning a 32-bit value will cause memcheck
638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      to trigger an undefinedness error.
639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   */
640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (sizeofIRType(typeOfIRTemp(irsb->tyenv, d1)) == 4) {
641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt dep1_off = S390X_GUEST_OFFSET(guest_CC_DEP1);
642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_Put(dep1_off, mkU64(0)));
643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op   = mkU64(opc);
645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep1 = mkexpr(d1);
646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep2 = mkU64(0);
647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ndep = mkU64(0);
648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(op, dep1, dep2, ndep);
650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write a floating point value and an integer into the flags thunk. The
654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   integer value is zero-extended first. */
655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_thunk_putFZ(UInt opc, IRTemp d1, IRTemp d2)
657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op, *dep1, *dep2, *ndep;
659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Make the CC_DEP1 slot appear completely defined.
661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Otherwise, assigning a 32-bit value will cause memcheck
662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      to trigger an undefinedness error.
663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   */
664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (sizeofIRType(typeOfIRTemp(irsb->tyenv, d1)) == 4) {
665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt dep1_off = S390X_GUEST_OFFSET(guest_CC_DEP1);
666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_Put(dep1_off, mkU64(0)));
667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op   = mkU64(opc);
669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep1 = mkexpr(d1);
670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep2 = s390_cc_widen(d2, False);
671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ndep = mkU64(0);
672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(op, dep1, dep2, ndep);
674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write a 128-bit floating point value into the flags thunk. This is
678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   done by splitting the value into two 64-bits values. */
679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_thunk_put1f128(UInt opc, IRTemp d1)
681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op, *hi, *lo, *ndep;
683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op   = mkU64(opc);
685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   hi   = unop(Iop_F128HItoF64, mkexpr(d1));
686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   lo   = unop(Iop_F128LOtoF64, mkexpr(d1));
687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ndep = mkU64(0);
688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(op, hi, lo, ndep);
690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write a 128-bit floating point value and an integer into the flags thunk.
694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   The integer value is zero-extended first. */
695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_thunk_put1f128Z(UInt opc, IRTemp d1, IRTemp nd)
697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op, *hi, *lo, *lox, *ndep;
699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op   = mkU64(opc);
701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   hi   = unop(Iop_F128HItoF64, mkexpr(d1));
702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   lo   = unop(Iop_ReinterpF64asI64, unop(Iop_F128LOtoF64, mkexpr(d1)));
703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ndep = s390_cc_widen(nd, False);
704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   lox = binop(Iop_Xor64, lo, ndep);  /* convey dependency */
706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(op, hi, lox, ndep);
708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Write a 128-bit decimal floating point value into the flags thunk.
712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   This is done by splitting the value into two 64-bits values. */
713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_cc_thunk_put1d128(UInt opc, IRTemp d1)
715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr *op, *hi, *lo, *ndep;
717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   op   = mkU64(opc);
719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   hi   = unop(Iop_D128HItoD64, mkexpr(d1));
720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   lo   = unop(Iop_D128LOtoD64, mkexpr(d1));
721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ndep = mkU64(0);
722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_fill(op, hi, lo, ndep);
724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Write a 128-bit decimal floating point value and an integer into the flags
728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   thunk. The integer value is zero-extended first. */
729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_cc_thunk_put1d128Z(UInt opc, IRTemp d1, IRTemp nd)
731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr *op, *hi, *lo, *lox, *ndep;
733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   op   = mkU64(opc);
735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   hi   = unop(Iop_D128HItoD64, mkexpr(d1));
736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   lo   = unop(Iop_ReinterpD64asI64, unop(Iop_D128LOtoD64, mkexpr(d1)));
737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ndep = s390_cc_widen(nd, False);
738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   lox = binop(Iop_Xor64, lo, ndep);  /* convey dependency */
740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_fill(op, hi, lox, ndep);
742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_set(UInt val)
747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(mkU64(S390_CC_OP_SET),
749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      mkU64(val), mkU64(0), mkU64(0));
750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Build IR to calculate the condition code from flags thunk.
753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Returns an expression of type Ity_I32 */
754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRExpr *
755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_call_calculate_cc(void)
756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr **args, *call, *op, *dep1, *dep2, *ndep;
758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   op   = IRExpr_Get(S390X_GUEST_OFFSET(guest_CC_OP),   Ity_I64);
760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dep1 = IRExpr_Get(S390X_GUEST_OFFSET(guest_CC_DEP1), Ity_I64);
761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dep2 = IRExpr_Get(S390X_GUEST_OFFSET(guest_CC_DEP2), Ity_I64);
762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ndep = IRExpr_Get(S390X_GUEST_OFFSET(guest_CC_NDEP), Ity_I64);
763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   args = mkIRExprVec_4(op, dep1, dep2, ndep);
765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call = mkIRExprCCall(Ity_I32, 0 /*regparm*/,
766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        "s390_calculate_cc", &s390_calculate_cc, args);
767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Exclude OP and NDEP from definedness checking.  We're only
769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      interested in DEP1 and DEP2. */
770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call->Iex.CCall.cee->mcx_mask = (1<<0) | (1<<3);
771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return call;
773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Build IR to calculate the internal condition code for a "compare and branch"
776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   insn. Returns an expression of type Ity_I32 */
777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRExpr *
778663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_calculate_icc(UInt m, UInt opc, IRTemp op1, IRTemp op2)
779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
780663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call, *op, *dep1, *dep2, *mask;
781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   switch (opc) {
783663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case S390_CC_OP_SIGNED_COMPARE:
784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dep1 = s390_cc_widen(op1, True);
785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dep2 = s390_cc_widen(op2, True);
786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
787663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case S390_CC_OP_UNSIGNED_COMPARE:
789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dep1 = s390_cc_widen(op1, False);
790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dep2 = s390_cc_widen(op2, False);
791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   default:
794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vpanic("s390_call_calculate_icc");
795663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mask = mkU64(m);
798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op   = mkU64(opc);
799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   args = mkIRExprVec_5(mask, op, dep1, dep2, mkU64(0) /* unused */);
801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call = mkIRExprCCall(Ity_I32, 0 /*regparm*/,
802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        "s390_calculate_cond", &s390_calculate_cond, args);
803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Exclude the requested condition, OP and NDEP from definedness
805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      checking.  We're only interested in DEP1 and DEP2. */
806663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call->Iex.CCall.cee->mcx_mask = (1<<0) | (1<<1) | (1<<4);
807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return call;
809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Build IR to calculate the condition code from flags thunk.
812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Returns an expression of type Ity_I32 */
813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRExpr *
814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_call_calculate_cond(UInt m)
815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr **args, *call, *op, *dep1, *dep2, *ndep, *mask;
817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = mkU64(m);
819663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   op   = IRExpr_Get(S390X_GUEST_OFFSET(guest_CC_OP),   Ity_I64);
820663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dep1 = IRExpr_Get(S390X_GUEST_OFFSET(guest_CC_DEP1), Ity_I64);
821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dep2 = IRExpr_Get(S390X_GUEST_OFFSET(guest_CC_DEP2), Ity_I64);
822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ndep = IRExpr_Get(S390X_GUEST_OFFSET(guest_CC_NDEP), Ity_I64);
823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   args = mkIRExprVec_5(mask, op, dep1, dep2, ndep);
825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call = mkIRExprCCall(Ity_I32, 0 /*regparm*/,
826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        "s390_calculate_cond", &s390_calculate_cond, args);
827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Exclude the requested condition, OP and NDEP from definedness
829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      checking.  We're only interested in DEP1 and DEP2. */
830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call->Iex.CCall.cee->mcx_mask = (1<<0) | (1<<1) | (1<<4);
831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return call;
833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_cc_thunk_putZ(op,dep1)  s390_cc_thunk_put1(op,dep1,False)
836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_cc_thunk_putS(op,dep1)  s390_cc_thunk_put1(op,dep1,True)
837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_cc_thunk_putF(op,dep1)  s390_cc_thunk_put1f(op,dep1)
838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_cc_thunk_putZZ(op,dep1,dep2) s390_cc_thunk_put2(op,dep1,dep2,False)
839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_cc_thunk_putSS(op,dep1,dep2) s390_cc_thunk_put2(op,dep1,dep2,True)
840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_cc_thunk_putFF(op,dep1,dep2) s390_cc_thunk_put2f(op,dep1,dep2)
841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_cc_thunk_putZZZ(op,dep1,dep2,ndep) \
842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        s390_cc_thunk_put3(op,dep1,dep2,ndep,False)
843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_cc_thunk_putSSS(op,dep1,dep2,ndep) \
844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        s390_cc_thunk_put3(op,dep1,dep2,ndep,True)
845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Guest register access                                ---*/
851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- ar registers                                         ---*/
856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of a ar register. */
859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic UInt
860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovar_offset(UInt archreg)
861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   static const UInt offset[16] = {
863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a0),
864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a1),
865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a2),
866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a3),
867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a4),
868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a5),
869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a6),
870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a7),
871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a8),
872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a9),
873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a10),
874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a11),
875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a12),
876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a13),
877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a14),
878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a15),
879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   };
880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(archreg < 16);
882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return offset[archreg];
884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of word #0 of a ar register. */
888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovar_w0_offset(UInt archreg)
890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return ar_offset(archreg) + 0;
892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write word #0 of a ar to the guest state. */
895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_ar_w0(UInt archreg, IRExpr *expr)
897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(ar_w0_offset(archreg), expr));
901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read word #0 of a ar register. */
904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_ar_w0(UInt archreg)
906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(ar_w0_offset(archreg), Ity_I32);
908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- fpr registers                                        ---*/
913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of a fpr register. */
916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic UInt
917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfpr_offset(UInt archreg)
918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   static const UInt offset[16] = {
920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f0),
921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f1),
922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f2),
923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f3),
924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f4),
925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f5),
926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f6),
927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f7),
928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f8),
929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f9),
930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f10),
931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f11),
932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f12),
933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f13),
934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f14),
935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f15),
936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   };
937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(archreg < 16);
939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return offset[archreg];
941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of word #0 of a fpr register. */
945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfpr_w0_offset(UInt archreg)
947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return fpr_offset(archreg) + 0;
949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write word #0 of a fpr to the guest state. */
952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_fpr_w0(UInt archreg, IRExpr *expr)
954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_F32);
956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(fpr_w0_offset(archreg), expr));
958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read word #0 of a fpr register. */
961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_fpr_w0(UInt archreg)
963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(fpr_w0_offset(archreg), Ity_F32);
965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of double word #0 of a fpr register. */
968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfpr_dw0_offset(UInt archreg)
970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return fpr_offset(archreg) + 0;
972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write double word #0 of a fpr to the guest state. */
975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_fpr_dw0(UInt archreg, IRExpr *expr)
977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_F64);
979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(fpr_dw0_offset(archreg), expr));
981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read double word #0 of a fpr register. */
984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_fpr_dw0(UInt archreg)
986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(fpr_dw0_offset(archreg), Ity_F64);
988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Write word #0 of a dpr to the guest state. */
991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic __inline__ void
992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovput_dpr_w0(UInt archreg, IRExpr *expr)
993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_D32);
995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   stmt(IRStmt_Put(fpr_w0_offset(archreg), expr));
997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Read word #0 of a dpr register. */
1000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic __inline__ IRExpr *
1001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovget_dpr_w0(UInt archreg)
1002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return IRExpr_Get(fpr_w0_offset(archreg), Ity_D32);
1004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Write double word #0 of a fpr containg DFP value to the guest state. */
1007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic __inline__ void
1008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovput_dpr_dw0(UInt archreg, IRExpr *expr)
1009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_D64);
1011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   stmt(IRStmt_Put(fpr_dw0_offset(archreg), expr));
1013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Read double word #0 of a fpr register containing DFP value. */
1016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic __inline__ IRExpr *
1017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovget_dpr_dw0(UInt archreg)
1018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return IRExpr_Get(fpr_dw0_offset(archreg), Ity_D64);
1020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
1023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- gpr registers                                        ---*/
1024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
1025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of a gpr register. */
1027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic UInt
1028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_offset(UInt archreg)
1029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   static const UInt offset[16] = {
1031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r0),
1032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r1),
1033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r2),
1034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r3),
1035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r4),
1036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r5),
1037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r6),
1038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r7),
1039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r8),
1040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r9),
1041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r10),
1042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r11),
1043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r12),
1044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r13),
1045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r14),
1046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r15),
1047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   };
1048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(archreg < 16);
1050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return offset[archreg];
1052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of word #0 of a gpr register. */
1056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_w0_offset(UInt archreg)
1058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 0;
1060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write word #0 of a gpr to the guest state. */
1063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_w0(UInt archreg, IRExpr *expr)
1065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
1067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_w0_offset(archreg), expr));
1069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read word #0 of a gpr register. */
1072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_w0(UInt archreg)
1074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_w0_offset(archreg), Ity_I32);
1076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of double word #0 of a gpr register. */
1079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_dw0_offset(UInt archreg)
1081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 0;
1083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write double word #0 of a gpr to the guest state. */
1086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_dw0(UInt archreg, IRExpr *expr)
1088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I64);
1090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_dw0_offset(archreg), expr));
1092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read double word #0 of a gpr register. */
1095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_dw0(UInt archreg)
1097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_dw0_offset(archreg), Ity_I64);
1099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of half word #1 of a gpr register. */
1102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_hw1_offset(UInt archreg)
1104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 2;
1106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write half word #1 of a gpr to the guest state. */
1109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_hw1(UInt archreg, IRExpr *expr)
1111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I16);
1113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_hw1_offset(archreg), expr));
1115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read half word #1 of a gpr register. */
1118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_hw1(UInt archreg)
1120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_hw1_offset(archreg), Ity_I16);
1122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of byte #6 of a gpr register. */
1125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_b6_offset(UInt archreg)
1127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 6;
1129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write byte #6 of a gpr to the guest state. */
1132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_b6(UInt archreg, IRExpr *expr)
1134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_b6_offset(archreg), expr));
1138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read byte #6 of a gpr register. */
1141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_b6(UInt archreg)
1143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_b6_offset(archreg), Ity_I8);
1145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of byte #3 of a gpr register. */
1148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_b3_offset(UInt archreg)
1150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 3;
1152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write byte #3 of a gpr to the guest state. */
1155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_b3(UInt archreg, IRExpr *expr)
1157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_b3_offset(archreg), expr));
1161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read byte #3 of a gpr register. */
1164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_b3(UInt archreg)
1166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_b3_offset(archreg), Ity_I8);
1168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of byte #0 of a gpr register. */
1171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_b0_offset(UInt archreg)
1173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 0;
1175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write byte #0 of a gpr to the guest state. */
1178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_b0(UInt archreg, IRExpr *expr)
1180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_b0_offset(archreg), expr));
1184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read byte #0 of a gpr register. */
1187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_b0(UInt archreg)
1189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_b0_offset(archreg), Ity_I8);
1191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of word #1 of a gpr register. */
1194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_w1_offset(UInt archreg)
1196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 4;
1198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write word #1 of a gpr to the guest state. */
1201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_w1(UInt archreg, IRExpr *expr)
1203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
1205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_w1_offset(archreg), expr));
1207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read word #1 of a gpr register. */
1210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_w1(UInt archreg)
1212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_w1_offset(archreg), Ity_I32);
1214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of half word #3 of a gpr register. */
1217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_hw3_offset(UInt archreg)
1219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 6;
1221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write half word #3 of a gpr to the guest state. */
1224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_hw3(UInt archreg, IRExpr *expr)
1226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I16);
1228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_hw3_offset(archreg), expr));
1230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read half word #3 of a gpr register. */
1233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_hw3(UInt archreg)
1235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_hw3_offset(archreg), Ity_I16);
1237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of byte #7 of a gpr register. */
1240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_b7_offset(UInt archreg)
1242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 7;
1244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write byte #7 of a gpr to the guest state. */
1247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_b7(UInt archreg, IRExpr *expr)
1249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_b7_offset(archreg), expr));
1253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read byte #7 of a gpr register. */
1256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_b7(UInt archreg)
1258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_b7_offset(archreg), Ity_I8);
1260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of half word #0 of a gpr register. */
1263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_hw0_offset(UInt archreg)
1265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 0;
1267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write half word #0 of a gpr to the guest state. */
1270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_hw0(UInt archreg, IRExpr *expr)
1272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I16);
1274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_hw0_offset(archreg), expr));
1276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read half word #0 of a gpr register. */
1279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_hw0(UInt archreg)
1281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_hw0_offset(archreg), Ity_I16);
1283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of byte #4 of a gpr register. */
1286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_b4_offset(UInt archreg)
1288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 4;
1290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write byte #4 of a gpr to the guest state. */
1293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_b4(UInt archreg, IRExpr *expr)
1295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_b4_offset(archreg), expr));
1299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read byte #4 of a gpr register. */
1302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_b4(UInt archreg)
1304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_b4_offset(archreg), Ity_I8);
1306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of byte #1 of a gpr register. */
1309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_b1_offset(UInt archreg)
1311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 1;
1313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write byte #1 of a gpr to the guest state. */
1316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_b1(UInt archreg, IRExpr *expr)
1318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_b1_offset(archreg), expr));
1322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read byte #1 of a gpr register. */
1325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_b1(UInt archreg)
1327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_b1_offset(archreg), Ity_I8);
1329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of half word #2 of a gpr register. */
1332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_hw2_offset(UInt archreg)
1334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 4;
1336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write half word #2 of a gpr to the guest state. */
1339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_hw2(UInt archreg, IRExpr *expr)
1341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I16);
1343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_hw2_offset(archreg), expr));
1345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read half word #2 of a gpr register. */
1348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_hw2(UInt archreg)
1350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_hw2_offset(archreg), Ity_I16);
1352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of byte #5 of a gpr register. */
1355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_b5_offset(UInt archreg)
1357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 5;
1359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write byte #5 of a gpr to the guest state. */
1362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_b5(UInt archreg, IRExpr *expr)
1364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_b5_offset(archreg), expr));
1368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read byte #5 of a gpr register. */
1371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_b5(UInt archreg)
1373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_b5_offset(archreg), Ity_I8);
1375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of byte #2 of a gpr register. */
1378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_b2_offset(UInt archreg)
1380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 2;
1382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write byte #2 of a gpr to the guest state. */
1385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_b2(UInt archreg, IRExpr *expr)
1387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_b2_offset(archreg), expr));
1391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read byte #2 of a gpr register. */
1394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_b2(UInt archreg)
1396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_b2_offset(archreg), Ity_I8);
1398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of the counter register. */
1401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic UInt
1402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcounter_offset(void)
1403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390X_GUEST_OFFSET(guest_counter);
1405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of double word #0 of the counter register. */
1408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcounter_dw0_offset(void)
1410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return counter_offset() + 0;
1412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write double word #0 of the counter to the guest state. */
1415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_counter_dw0(IRExpr *expr)
1417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I64);
1419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(counter_dw0_offset(), expr));
1421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read double word #0 of the counter register. */
1424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_counter_dw0(void)
1426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(counter_dw0_offset(), Ity_I64);
1428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of word #0 of the counter register. */
1431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcounter_w0_offset(void)
1433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return counter_offset() + 0;
1435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of word #1 of the counter register. */
1438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcounter_w1_offset(void)
1440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return counter_offset() + 4;
1442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write word #0 of the counter to the guest state. */
1445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_counter_w0(IRExpr *expr)
1447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
1449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(counter_w0_offset(), expr));
1451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read word #0 of the counter register. */
1454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_counter_w0(void)
1456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(counter_w0_offset(), Ity_I32);
1458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write word #1 of the counter to the guest state. */
1461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_counter_w1(IRExpr *expr)
1463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
1465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(counter_w1_offset(), expr));
1467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read word #1 of the counter register. */
1470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_counter_w1(void)
1472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(counter_w1_offset(), Ity_I32);
1474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of the fpc register. */
1477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic UInt
1478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfpc_offset(void)
1479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390X_GUEST_OFFSET(guest_fpc);
1481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of word #0 of the fpc register. */
1484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfpc_w0_offset(void)
1486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return fpc_offset() + 0;
1488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write word #0 of the fpc to the guest state. */
1491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_fpc_w0(IRExpr *expr)
1493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
1495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(fpc_w0_offset(), expr));
1497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read word #0 of the fpc register. */
1500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_fpc_w0(void)
1502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(fpc_w0_offset(), Ity_I32);
1504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
1508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- Rounding modes                                       ---*/
1509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*------------------------------------------------------------*/
1510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Extract the bfp rounding mode from the guest FPC reg and encode it as an
1512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRRoundingMode:
1513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rounding mode | s390 | IR
1515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   -------------------------
1516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   to nearest    |  00  | 00
1517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   to zero       |  01  | 11
1518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   to +infinity  |  10  | 10
1519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   to -infinity  |  11  | 01
1520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   So:  IR = (4 - s390) & 3
1522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov*/
1523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr *
1524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovget_bfp_rounding_mode_from_fpc(void)
1525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp fpc_bits = newTemp(Ity_I32);
1527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* For z196 and later the bfp rounding mode is stored in bits [29:31].
1529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Prior to that bits [30:31] contained the bfp rounding mode with
1530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      bit 29 being unused and having a value of 0. So we can always
1531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      extract the least significant 3 bits. */
1532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(fpc_bits, binop(Iop_And32, get_fpc_w0(), mkU32(7)));
1533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* fixs390:
1535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (! s390_host_has_fpext && rounding_mode > 3) {
1538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         emulation warning @ runtime and
1539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         set fpc to round nearest
1540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
1541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   */
1542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* For now silently adjust an unsupported rounding mode to "nearest" */
1544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr *rm_s390 = mkite(binop(Iop_CmpLE32S, mkexpr(fpc_bits), mkU32(3)),
1545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           mkexpr(fpc_bits),
1546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           mkU32(S390_FPC_BFP_ROUND_NEAREST_EVEN));
1547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // rm_IR = (4 - rm_s390) & 3;
1549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return binop(Iop_And32, binop(Iop_Sub32, mkU32(4), rm_s390), mkU32(3));
1550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Encode the s390 rounding mode as it appears in the m3 field of certain
1553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   instructions to VEX's IRRoundingMode. Rounding modes that cannot be
1554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   represented in VEX are converted to Irrm_NEAREST. The rationale is, that
1555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Irrm_NEAREST refers to IEEE 754's roundTiesToEven which the standard
1556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   considers the default rounding mode (4.3.3). */
1557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRTemp
1558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovencode_bfp_rounding_mode(UChar mode)
1559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr *rm;
1561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (mode) {
1563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_BFP_ROUND_PER_FPC:
1564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rm = get_bfp_rounding_mode_from_fpc();
1565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
1566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_BFP_ROUND_NEAREST_AWAY:  /* not supported */
1567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_BFP_ROUND_PREPARE_SHORT: /* not supported */
1568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_BFP_ROUND_NEAREST_EVEN:  rm = mkU32(Irrm_NEAREST); break;
1569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_BFP_ROUND_ZERO:          rm = mkU32(Irrm_ZERO);    break;
1570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_BFP_ROUND_POSINF:        rm = mkU32(Irrm_PosINF);  break;
1571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_BFP_ROUND_NEGINF:        rm = mkU32(Irrm_NegINF);  break;
1572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   default:
1573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vpanic("encode_bfp_rounding_mode");
1574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return mktemp(Ity_I32, rm);
1577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Extract the DFP rounding mode from the guest FPC reg and encode it as an
1580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRRoundingMode:
1581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rounding mode                     | s390  | IR
1583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ------------------------------------------------
1584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   to nearest, ties to even          |  000  | 000
1585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   to zero                           |  001  | 011
1586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   to +infinity                      |  010  | 010
1587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   to -infinity                      |  011  | 001
1588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   to nearest, ties away from 0      |  100  | 100
1589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   to nearest, ties toward 0         |  101  | 111
1590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   to away from 0                    |  110  | 110
1591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   to prepare for shorter precision  |  111  | 101
1592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   So:  IR = (s390 ^ ((s390 << 1) & 2))
1594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov*/
1595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr *
1596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovget_dfp_rounding_mode_from_fpc(void)
1597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp fpc_bits = newTemp(Ity_I32);
1599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* The dfp rounding mode is stored in bits [25:27].
1601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      extract the bits at 25:27 and right shift 4 times. */
1602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(fpc_bits, binop(Iop_Shr32,
1603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          binop(Iop_And32, get_fpc_w0(), mkU32(0x70)),
1604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          mkU8(4)));
1605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr *rm_s390 = mkexpr(fpc_bits);
1607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // rm_IR = (rm_s390 ^ ((rm_s390 << 1) & 2));
1608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return binop(Iop_Xor32, rm_s390,
1610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                binop( Iop_And32,
1611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       binop(Iop_Shl32, rm_s390, mkU8(1)),
1612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       mkU32(2)));
1613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Encode the s390 rounding mode as it appears in the m3 field of certain
1616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   instructions to VEX's IRRoundingMode. */
1617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRTemp
1618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovencode_dfp_rounding_mode(UChar mode)
1619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr *rm;
1621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (mode) {
1623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_DFP_ROUND_PER_FPC_0:
1624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_DFP_ROUND_PER_FPC_2:
1625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rm = get_dfp_rounding_mode_from_fpc(); break;
1626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_DFP_ROUND_NEAREST_EVEN_4:
1627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_DFP_ROUND_NEAREST_EVEN_8:
1628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rm = mkU32(Irrm_NEAREST); break;
1629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_DFP_ROUND_NEAREST_TIE_AWAY_0_1:
1630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_DFP_ROUND_NEAREST_TIE_AWAY_0_12:
1631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rm = mkU32(Irrm_NEAREST_TIE_AWAY_0); break;
1632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_DFP_ROUND_PREPARE_SHORT_3:
1633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_DFP_ROUND_PREPARE_SHORT_15:
1634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rm = mkU32(Irrm_PREPARE_SHORTER); break;
1635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_DFP_ROUND_ZERO_5:
1636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_DFP_ROUND_ZERO_9:
1637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rm = mkU32(Irrm_ZERO ); break;
1638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_DFP_ROUND_POSINF_6:
1639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_DFP_ROUND_POSINF_10:
1640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rm = mkU32(Irrm_PosINF); break;
1641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_DFP_ROUND_NEGINF_7:
1642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_DFP_ROUND_NEGINF_11:
1643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rm = mkU32(Irrm_NegINF); break;
1644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_DFP_ROUND_NEAREST_TIE_TOWARD_0:
1645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rm = mkU32(Irrm_NEAREST_TIE_TOWARD_0); break;
1646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case S390_DFP_ROUND_AWAY_0:
1647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rm = mkU32(Irrm_AWAY_FROM_ZERO); break;
1648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   default:
1649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vpanic("encode_dfp_rounding_mode");
1650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return mktemp(Ity_I32, rm);
1653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*------------------------------------------------------------*/
1657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- Condition code helpers                               ---*/
1658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*------------------------------------------------------------*/
1659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* The result of a Iop_CmpFxx operation is a condition code. It is
1661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   encoded using the values defined in type IRCmpFxxResult.
1662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Before we can store the condition code into the guest state (or do
1663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   anything else with it for that matter) we need to convert it to
1664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   the encoding that s390 uses. This is what this function does.
1665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390     VEX                b6 b2 b0   cc.1  cc.0
1667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   0      0x40 EQ             1  0  0     0     0
1668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   1      0x01 LT             0  0  1     0     1
1669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   2      0x00 GT             0  0  0     1     0
1670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   3      0x45 Unordered      1  1  1     1     1
1671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   The following bits from the VEX encoding are interesting:
1673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   b0, b2, b6  with b0 being the LSB. We observe:
1674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   cc.0 = b0;
1676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   cc.1 = b2 | (~b0 & ~b6)
1677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   with cc being the s390 condition code.
1679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov*/
1680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr *
1681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconvert_vex_bfpcc_to_s390(IRTemp vex_cc)
1682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp cc0  = newTemp(Ity_I32);
1684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp cc1  = newTemp(Ity_I32);
1685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp b0   = newTemp(Ity_I32);
1686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp b2   = newTemp(Ity_I32);
1687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp b6   = newTemp(Ity_I32);
1688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(b0, binop(Iop_And32, mkexpr(vex_cc), mkU32(1)));
1690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(b2, binop(Iop_And32, binop(Iop_Shr32, mkexpr(vex_cc), mkU8(2)),
1691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    mkU32(1)));
1692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(b6, binop(Iop_And32, binop(Iop_Shr32, mkexpr(vex_cc), mkU8(6)),
1693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    mkU32(1)));
1694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(cc0, mkexpr(b0));
1696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(cc1, binop(Iop_Or32, mkexpr(b2),
1697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     binop(Iop_And32,
1698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           binop(Iop_Sub32, mkU32(1), mkexpr(b0)), /* ~b0 */
1699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           binop(Iop_Sub32, mkU32(1), mkexpr(b6))  /* ~b6 */
1700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           )));
1701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return binop(Iop_Or32, mkexpr(cc0), binop(Iop_Shl32, mkexpr(cc1), mkU8(1)));
1703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* The result of a Iop_CmpDxx operation is a condition code. It is
1707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   encoded using the values defined in type IRCmpDxxResult.
1708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Before we can store the condition code into the guest state (or do
1709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   anything else with it for that matter) we need to convert it to
1710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   the encoding that s390 uses. This is what this function does. */
1711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr *
1712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconvert_vex_dfpcc_to_s390(IRTemp vex_cc)
1713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* The VEX encodings for IRCmpDxxResult and IRCmpFxxResult are the
1715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      same. currently. */
1716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return convert_vex_bfpcc_to_s390(vex_cc);
1717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*------------------------------------------------------------*/
1721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Build IR for formats                                 ---*/
1722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
1723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_I(const HChar *(*irgen)(UChar i),
1725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              UChar i)
1726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(i);
1728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC2(MNM, UINT), mnm, i);
1731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_E(const HChar *(*irgen)(void))
1735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen();
1737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_disasm(ENC1(MNM), mnm);
1740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
1743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RI(const HChar *(*irgen)(UChar r1, UShort i2),
1744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               UChar r1, UShort i2)
1745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irgen(r1, i2);
1747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RI_RU(const HChar *(*irgen)(UChar r1, UShort i2),
1751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  UChar r1, UShort i2)
1752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, i2);
1754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, UINT), mnm, r1, i2);
1757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RI_RI(const HChar *(*irgen)(UChar r1, UShort i2),
1761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  UChar r1, UShort i2)
1762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, i2);
1764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, INT), mnm, r1, (Int)(Short)i2);
1767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RI_RP(const HChar *(*irgen)(UChar r1, UShort i2),
1771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  UChar r1, UShort i2)
1772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, i2);
1774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, PCREL), mnm, r1, (Int)(Short)i2);
1777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RIE_RRP(const HChar *(*irgen)(UChar r1, UChar r3, UShort i2),
1781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar r1, UChar r3, UShort i2)
1782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, r3, i2);
1784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, GPR, GPR, PCREL), mnm, r1, r3, (Int)(Short)i2);
1787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RIE_RRI0(const HChar *(*irgen)(UChar r1, UChar r3, UShort i2),
1791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar r3, UShort i2)
1792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, r3, i2);
1794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, GPR, GPR, INT), mnm, r1, r3, (Int)(Short)i2);
1797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RIE_RRUUU(const HChar *(*irgen)(UChar r1, UChar r2, UChar i3,
1801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            UChar i4, UChar i5),
1802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      UChar r1, UChar r2, UChar i3, UChar i4, UChar i5)
1803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, r2, i3, i4, i5);
1805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC6(MNM, GPR, GPR, UINT, UINT, UINT), mnm, r1, r2, i3, i4,
1808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  i5);
1809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RIE_RRPU(const HChar *(*irgen)(UChar r1, UChar r2, UShort i4,
1813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           UChar m3),
1814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar r2, UShort i4, UChar m3)
1815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, r2, i4, m3);
1817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC5(XMNM, GPR, GPR, CABM, PCREL), S390_XMNM_CAB, mnm, m3, r1,
1820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  r2, m3, (Int)(Short)i4);
1821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RIE_RUPU(const HChar *(*irgen)(UChar r1, UChar m3, UShort i4,
1825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           UChar i2),
1826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar m3, UShort i4, UChar i2)
1827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, m3, i4, i2);
1829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC5(XMNM, GPR, UINT, CABM, PCREL), S390_XMNM_CAB, mnm, m3,
1832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  r1, i2, m3, (Int)(Short)i4);
1833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RIE_RUPI(const HChar *(*irgen)(UChar r1, UChar m3, UShort i4,
1837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           UChar i2),
1838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar m3, UShort i4, UChar i2)
1839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, m3, i4, i2);
1841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC5(XMNM, GPR, INT, CABM, PCREL), S390_XMNM_CAB, mnm, m3, r1,
1844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  (Int)(Char)i2, m3, (Int)(Short)i4);
1845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RIL(const HChar *(*irgen)(UChar r1, UInt i2),
1849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                UChar r1, UInt i2)
1850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irgen(r1, i2);
1852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RIL_RU(const HChar *(*irgen)(UChar r1, UInt i2),
1856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1, UInt i2)
1857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, i2);
1859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, UINT), mnm, r1, i2);
1862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RIL_RI(const HChar *(*irgen)(UChar r1, UInt i2),
1866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1, UInt i2)
1867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, i2);
1869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, INT), mnm, r1, i2);
1872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RIL_RP(const HChar *(*irgen)(UChar r1, UInt i2),
1876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1, UInt i2)
1877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, i2);
1879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, PCREL), mnm, r1, i2);
1882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RIL_UP(const HChar *(*irgen)(void),
1886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1, UInt i2)
1887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen();
1889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, UINT, PCREL), mnm, r1, i2);
1892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RIS_RURDI(const HChar *(*irgen)(UChar r1, UChar m3, UChar i2,
1896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      IRTemp op4addr),
1897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      UChar r1, UChar m3, UChar b4, UShort d4, UChar i2)
1898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
1900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op4addr = newTemp(Ity_I64);
1901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op4addr, binop(Iop_Add64, mkU64(d4), b4 != 0 ? get_gpr_dw0(b4) :
1903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, m3, i2, op4addr);
1906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC5(XMNM, GPR, INT, CABM, UDXB), S390_XMNM_CAB, mnm, m3, r1,
1909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  (Int)(Char)i2, m3, d4, 0, b4);
1910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RIS_RURDU(const HChar *(*irgen)(UChar r1, UChar m3, UChar i2,
1914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      IRTemp op4addr),
1915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      UChar r1, UChar m3, UChar b4, UShort d4, UChar i2)
1916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
1918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op4addr = newTemp(Ity_I64);
1919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op4addr, binop(Iop_Add64, mkU64(d4), b4 != 0 ? get_gpr_dw0(b4) :
1921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, m3, i2, op4addr);
1924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC5(XMNM, GPR, UINT, CABM, UDXB), S390_XMNM_CAB, mnm, m3, r1,
1927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  i2, m3, d4, 0, b4);
1928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RR(const HChar *(*irgen)(UChar r1, UChar r2),
1932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               UChar r1, UChar r2)
1933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irgen(r1, r2);
1935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RR_RR(const HChar *(*irgen)(UChar r1, UChar r2),
1939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  UChar r1, UChar r2)
1940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, r2);
1942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, GPR), mnm, r1, r2);
1945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RR_FF(const HChar *(*irgen)(UChar r1, UChar r2),
1949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  UChar r1, UChar r2)
1950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, r2);
1952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, FPR, FPR), mnm, r1, r2);
1955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRE(const HChar *(*irgen)(UChar r1, UChar r2),
1959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                UChar r1, UChar r2)
1960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irgen(r1, r2);
1962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRE_RR(const HChar *(*irgen)(UChar r1, UChar r2),
1966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1, UChar r2)
1967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, r2);
1969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, GPR), mnm, r1, r2);
1972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRE_FF(const HChar *(*irgen)(UChar r1, UChar r2),
1976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1, UChar r2)
1977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, r2);
1979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, FPR, FPR), mnm, r1, r2);
1982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRE_RF(const HChar *(*irgen)(UChar, UChar),
1986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1, UChar r2)
1987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, r2);
1989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, FPR), mnm, r1, r2);
1992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRE_FR(const HChar *(*irgen)(UChar r1, UChar r2),
1996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1, UChar r2)
1997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, r2);
1999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, FPR, GPR), mnm, r1, r2);
2002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRE_R0(const HChar *(*irgen)(UChar r1),
2006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1)
2007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1);
2009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC2(MNM, GPR), mnm, r1);
2012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRE_F0(const HChar *(*irgen)(UChar r1),
2016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1)
2017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1);
2019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC2(MNM, FPR), mnm, r1);
2022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRF_M0RERE(const HChar *(*irgen)(UChar m3, UChar r1, UChar r2),
2026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       UChar m3, UChar r1, UChar r2)
2027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
2028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(m3, r1, r2);
2029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_disasm(ENC4(MNM, GPR, GPR, UINT), mnm, r1, r2, m3);
2032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
2033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
2035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRF_F0FF(const HChar *(*irgen)(UChar, UChar, UChar),
2036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar r3, UChar r2)
2037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, r3, r2);
2039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, FPR, FPR, FPR), mnm, r1, r3, r2);
2042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRF_F0FR(const HChar *(*irgen)(UChar, UChar, UChar),
2046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     UChar r3, UChar r1, UChar r2)
2047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
2048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r3, r1, r2);
2049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_disasm(ENC4(MNM, FPR, FPR, GPR), mnm, r1, r3, r2);
2052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
2053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
2055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRF_UUFF(const HChar *(*irgen)(UChar m3, UChar m4, UChar r1,
2056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           UChar r2),
2057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     UChar m3, UChar m4, UChar r1, UChar r2)
2058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
2059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(m3, m4, r1, r2);
2060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_disasm(ENC5(MNM, FPR, UINT, FPR, UINT), mnm, r1, m3, r2, m4);
2063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
2064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
2066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRF_0UFF(const HChar *(*irgen)(UChar m4, UChar r1, UChar r2),
2067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     UChar m4, UChar r1, UChar r2)
2068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
2069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(m4, r1, r2);
2070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_disasm(ENC4(MNM, FPR, FPR, UINT), mnm, r1, r2, m4);
2073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
2074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
2076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRF_UUFR(const HChar *(*irgen)(UChar m3, UChar m4, UChar r1,
2077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           UChar r2),
2078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     UChar m3, UChar m4, UChar r1, UChar r2)
2079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
2080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(m3, m4, r1, r2);
2081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_disasm(ENC5(MNM, FPR, UINT, GPR, UINT), mnm, r1, m3, r2, m4);
2084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
2085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
2087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRF_UURF(const HChar *(*irgen)(UChar m3, UChar m4, UChar r1,
2088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           UChar r2),
2089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     UChar m3, UChar m4, UChar r1, UChar r2)
2090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
2091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(m3, m4, r1, r2);
2092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_disasm(ENC5(MNM, GPR, UINT, FPR, UINT), mnm, r1, m3, r2, m4);
2095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
2096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
2099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRF_U0RR(const HChar *(*irgen)(UChar m3, UChar r1, UChar r2),
2100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar m3, UChar r1, UChar r2, Int xmnm_kind)
2101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irgen(m3, r1, r2);
2103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(XMNM, GPR, GPR), xmnm_kind, m3, r1, r2);
2106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRF_F0FF2(const HChar *(*irgen)(UChar, UChar, UChar),
2110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      UChar r3, UChar r1, UChar r2)
2111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r3, r1, r2);
2113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_disasm(ENC4(MNM, FPR, FPR, FPR), mnm, r1, r3, r2);
2116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRF_FFRU(const HChar *(*irgen)(UChar, UChar, UChar, UChar),
2120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     UChar r3, UChar m4, UChar r1, UChar r2)
2121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r3, m4, r1, r2);
2123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_disasm(ENC5(MNM, FPR, FPR, GPR, UINT), mnm, r1, r3, r2, m4);
2126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
2127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
2129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRF_FUFF(const HChar *(*irgen)(UChar, UChar, UChar, UChar),
2130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     UChar r3, UChar m4, UChar r1, UChar r2)
2131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
2132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r3, m4, r1, r2);
2133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_disasm(ENC5(MNM, FPR, FPR, FPR, UINT), mnm, r1, r3, r2, m4);
2136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
2137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
2139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRF_FUFF2(const HChar *(*irgen)(UChar, UChar, UChar, UChar),
2140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      UChar r3, UChar m4, UChar r1, UChar r2)
2141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
2142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r3, m4, r1, r2);
2143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_disasm(ENC5(MNM, FPR, FPR, FPR, UINT), mnm, r1, r2, r3, m4);
2146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRF_R0RR2(const HChar *(*irgen)(UChar r3, UChar r1, UChar r2),
2150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      UChar r3, UChar r1, UChar r2)
2151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r3, r1, r2);
2153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, GPR, GPR, GPR), mnm, r1, r2, r3);
2156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RRS(const HChar *(*irgen)(UChar r1, UChar r2, UChar m3,
2160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      IRTemp op4addr),
2161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                UChar r1, UChar r2, UChar b4, UShort d4, UChar m3)
2162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op4addr = newTemp(Ity_I64);
2165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op4addr, binop(Iop_Add64, mkU64(d4), b4 != 0 ? get_gpr_dw0(b4) :
2167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, r2, m3, op4addr);
2170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC5(XMNM, GPR, GPR, CABM, UDXB), S390_XMNM_CAB, mnm, m3, r1,
2173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  r2, m3, d4, 0, b4);
2174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RS_R0RD(const HChar *(*irgen)(UChar r1, IRTemp op2addr),
2178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar r1, UChar b2, UShort d2)
2179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
2184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, op2addr);
2187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, UDXB), mnm, r1, d2, 0, b2);
2190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RS_RRRD(const HChar *(*irgen)(UChar r1, UChar r3, IRTemp op2addr),
2194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar r1, UChar r3, UChar b2, UShort d2)
2195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
2200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, r3, op2addr);
2203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, GPR, GPR, UDXB), mnm, r1, r3, d2, 0, b2);
2206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RS_RURD(const HChar *(*irgen)(UChar r1, UChar r3, IRTemp op2addr),
2210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar r1, UChar r3, UChar b2, UShort d2)
2211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
2216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, r3, op2addr);
2219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, GPR, UINT, UDXB), mnm, r1, r3, d2, 0, b2);
2222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RS_AARD(const HChar *(*irgen)(UChar, UChar, IRTemp),
2226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar r1, UChar r3, UChar b2, UShort d2)
2227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
2232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, r3, op2addr);
2235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, AR, AR, UDXB), mnm, r1, r3, d2, 0, b2);
2238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RSI_RRP(const HChar *(*irgen)(UChar r1, UChar r3, UShort i2),
2242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar r1, UChar r3, UShort i2)
2243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm = irgen(r1, r3, i2);
2245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, GPR, GPR, PCREL), mnm, r1, r3, (Int)(Short)i2);
2248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RSY_RRRD(const HChar *(*irgen)(UChar r1, UChar r3, IRTemp op2addr),
2252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar r3, UChar b2, UShort dl2, UChar dh2)
2253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d2 = newTemp(Ity_I64);
2257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
2259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkexpr(d2), b2 != 0 ? get_gpr_dw0(b2) :
2260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, r3, op2addr);
2263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, GPR, GPR, SDXB), mnm, r1, r3, dh2, dl2, 0, b2);
2266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RSY_AARD(const HChar *(*irgen)(UChar, UChar, IRTemp),
2270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar r3, UChar b2, UShort dl2, UChar dh2)
2271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d2 = newTemp(Ity_I64);
2275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
2277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkexpr(d2), b2 != 0 ? get_gpr_dw0(b2) :
2278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, r3, op2addr);
2281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, AR, AR, SDXB), mnm, r1, r3, dh2, dl2, 0, b2);
2284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RSY_RURD(const HChar *(*irgen)(UChar r1, UChar r3, IRTemp op2addr),
2288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar r3, UChar b2, UShort dl2, UChar dh2)
2289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d2 = newTemp(Ity_I64);
2293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
2295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkexpr(d2), b2 != 0 ? get_gpr_dw0(b2) :
2296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, r3, op2addr);
2299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, GPR, UINT, SDXB), mnm, r1, r3, dh2, dl2, 0, b2);
2302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RSY_RDRM(const HChar *(*irgen)(UChar r1, IRTemp op2addr),
2306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar m3, UChar b2, UShort dl2, UChar dh2,
2307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     Int xmnm_kind)
2308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d2 = newTemp(Ity_I64);
2311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ32, s390_call_calculate_cond(m3), mkU32(0)));
2313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
2315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkexpr(d2), b2 != 0 ? get_gpr_dw0(b2) :
2316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irgen(r1, op2addr);
2319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(dis_res->whatNext == Dis_Continue);
2321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(XMNM, GPR, SDXB), xmnm_kind, m3, r1, dh2, dl2, 0, b2);
2324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RX(const HChar *(*irgen)(UChar r1, UChar x2, UChar b2, UShort d2,
2328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               IRTemp op2addr),
2329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               UChar r1, UChar x2, UChar b2, UShort d2)
2330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkU64(d2),
2334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
2335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irgen(r1, x2, b2, d2, op2addr);
2338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RX_RRRD(const HChar *(*irgen)(UChar r1, IRTemp op2addr),
2342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar r1, UChar x2, UChar b2, UShort d2)
2343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkU64(d2),
2348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
2349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, op2addr);
2352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, UDXB), mnm, r1, d2, x2, b2);
2355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RX_FRRD(const HChar *(*irgen)(UChar r1, IRTemp op2addr),
2359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar r1, UChar x2, UChar b2, UShort d2)
2360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkU64(d2),
2365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
2366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, op2addr);
2369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, FPR, UDXB), mnm, r1, d2, x2, b2);
2372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RXE_FRRD(const HChar *(*irgen)(UChar r1, IRTemp op2addr),
2376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar x2, UChar b2, UShort d2)
2377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkU64(d2),
2382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
2383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, op2addr);
2386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, FPR, UDXB), mnm, r1, d2, x2, b2);
2389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RXF_FRRDF(const HChar *(*irgen)(UChar, IRTemp, UChar),
2393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      UChar r3, UChar x2, UChar b2, UShort d2, UChar r1)
2394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkU64(d2),
2399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
2400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r3, op2addr, r1);
2403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, FPR, FPR, UDXB), mnm, r1, r3, d2, x2, b2);
2406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RXY_RRRD(const HChar *(*irgen)(UChar r1, IRTemp op2addr),
2410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
2411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d2 = newTemp(Ity_I64);
2415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
2417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkexpr(d2),
2418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
2419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, op2addr);
2422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, SDXB), mnm, r1, dh2, dl2, x2, b2);
2425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RXY_FRRD(const HChar *(*irgen)(UChar r1, IRTemp op2addr),
2429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
2430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d2 = newTemp(Ity_I64);
2434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
2436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkexpr(d2),
2437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
2438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, op2addr);
2441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, FPR, SDXB), mnm, r1, dh2, dl2, x2, b2);
2444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_RXY_URRD(const HChar *(*irgen)(void),
2448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
2449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d2 = newTemp(Ity_I64);
2453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
2455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkexpr(d2),
2456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
2457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen();
2460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, UINT, SDXB), mnm, r1, dh2, dl2, x2, b2);
2463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_S_RD(const HChar *(*irgen)(IRTemp op2addr),
2467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 UChar b2, UShort d2)
2468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
2473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(op2addr);
2476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC2(MNM, UDXB), mnm, d2, 0, b2);
2479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_SI_URD(const HChar *(*irgen)(UChar i2, IRTemp op1addr),
2483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar i2, UChar b1, UShort d1)
2484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1addr = newTemp(Ity_I64);
2487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1addr, binop(Iop_Add64, mkU64(d1), b1 != 0 ? get_gpr_dw0(b1) :
2489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(i2, op1addr);
2492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, UDXB, UINT), mnm, d1, 0, b1, i2);
2495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_SIY_URD(const HChar *(*irgen)(UChar i2, IRTemp op1addr),
2499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar i2, UChar b1, UShort dl1, UChar dh1)
2500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1addr = newTemp(Ity_I64);
2503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d1 = newTemp(Ity_I64);
2504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d1, mkU64(((ULong)(Long)(Char)dh1 << 12) | ((ULong)dl1)));
2506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1addr, binop(Iop_Add64, mkexpr(d1), b1 != 0 ? get_gpr_dw0(b1) :
2507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(i2, op1addr);
2510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, SDXB, UINT), mnm, dh1, dl1, 0, b1, i2);
2513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_SIY_IRD(const HChar *(*irgen)(UChar i2, IRTemp op1addr),
2517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar i2, UChar b1, UShort dl1, UChar dh1)
2518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1addr = newTemp(Ity_I64);
2521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d1 = newTemp(Ity_I64);
2522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d1, mkU64(((ULong)(Long)(Char)dh1 << 12) | ((ULong)dl1)));
2524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1addr, binop(Iop_Add64, mkexpr(d1), b1 != 0 ? get_gpr_dw0(b1) :
2525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(i2, op1addr);
2528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, SDXB, INT), mnm, dh1, dl1, 0, b1, (Int)(Char)i2);
2531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_SS_L0RDRD(const HChar *(*irgen)(UChar, IRTemp, IRTemp),
2535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      UChar l, UChar b1, UShort d1, UChar b2, UShort d2)
2536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1addr = newTemp(Ity_I64);
2539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1addr, binop(Iop_Add64, mkU64(d1), b1 != 0 ? get_gpr_dw0(b1) :
2542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
2544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(l, op1addr, op2addr);
2547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, UDLB, UDXB), mnm, d1, l, b1, d2, 0, b2);
2550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_SIL_RDI(const HChar *(*irgen)(UShort i2, IRTemp op1addr),
2554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar b1, UShort d1, UShort i2)
2555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1addr = newTemp(Ity_I64);
2558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1addr, binop(Iop_Add64, mkU64(d1), b1 != 0 ? get_gpr_dw0(b1) :
2560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(i2, op1addr);
2563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, UDXB, INT), mnm, d1, 0, b1, (Int)(Short)i2);
2566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_format_SIL_RDU(const HChar *(*irgen)(UShort i2, IRTemp op1addr),
2570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar b1, UShort d1, UShort i2)
2571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar *mnm;
2573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1addr = newTemp(Ity_I64);
2574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1addr, binop(Iop_Add64, mkU64(d1), b1 != 0 ? get_gpr_dw0(b1) :
2576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(i2, op1addr);
2579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, UDXB, UINT), mnm, d1, 0, b1, i2);
2582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
2587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Build IR for opcodes                                 ---*/
2588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
2589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AR(UChar r1, UChar r2)
2592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
2599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, op2);
2601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ar";
2604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AGR(UChar r1, UChar r2)
2608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
2615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, op2);
2617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "agr";
2620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AGFR(UChar r1, UChar r2)
2624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
2631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, op2);
2633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "agfr";
2636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ARK(UChar r3, UChar r1, UChar r2)
2640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
2643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
2646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
2647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
2648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op2, op3);
2649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ark";
2652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AGRK(UChar r3, UChar r1, UChar r2)
2656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
2659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
2662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
2663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op2), mkexpr(op3)));
2664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op2, op3);
2665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "agrk";
2668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_A(UChar r1, IRTemp op2addr)
2672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
2679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, op2);
2681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "a";
2684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AY(UChar r1, IRTemp op2addr)
2688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
2695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, op2);
2697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ay";
2700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AG(UChar r1, IRTemp op2addr)
2704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
2711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, op2);
2713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ag";
2716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AGF(UChar r1, IRTemp op2addr)
2720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
2727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, op2);
2729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "agf";
2732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AFI(UChar r1, UInt i2)
2736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
2739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)i2;
2743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkU32((UInt)op2)));
2744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, mktemp(Ity_I32,
2745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32((UInt)op2)));
2746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "afi";
2749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AGFI(UChar r1, UInt i2)
2753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
2756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Long)(Int)i2;
2760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkU64((ULong)op2)));
2761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, mktemp(Ity_I64,
2762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64((ULong)op2)));
2763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "agfi";
2766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AHIK(UChar r1, UChar r3, UShort i2)
2770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
2772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
2773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)(Short)i2;
2776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
2777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkU32((UInt)op2), mkexpr(op3)));
2778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, mktemp(Ity_I32, mkU32((UInt)
2779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       op2)), op3);
2780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ahik";
2783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AGHIK(UChar r1, UChar r3, UShort i2)
2787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
2789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
2790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Long)(Short)i2;
2793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
2794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkU64((ULong)op2), mkexpr(op3)));
2795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, mktemp(Ity_I64, mkU64((ULong)
2796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       op2)), op3);
2797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "aghik";
2800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ASI(UChar i2, IRTemp op1addr)
2804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
2807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I32, mkexpr(op1addr)));
2810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)(Char)i2;
2811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkU32((UInt)op2)));
2812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
2813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, mktemp(Ity_I32,
2814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32((UInt)op2)));
2815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "asi";
2817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AGSI(UChar i2, IRTemp op1addr)
2821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
2824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I64, mkexpr(op1addr)));
2827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Long)(Char)i2;
2828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkU64((ULong)op2)));
2829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
2830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, mktemp(Ity_I64,
2831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64((ULong)op2)));
2832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "agsi";
2834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AH(UChar r1, IRTemp op2addr)
2838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
2845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, op2);
2847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ah";
2850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AHY(UChar r1, IRTemp op2addr)
2854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
2861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, op2);
2863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ahy";
2866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AHI(UChar r1, UShort i2)
2870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
2873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)(Short)i2;
2877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkU32((UInt)op2)));
2878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, mktemp(Ity_I32,
2879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32((UInt)op2)));
2880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ahi";
2883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AGHI(UChar r1, UShort i2)
2887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
2890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Long)(Short)i2;
2894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkU64((ULong)op2)));
2895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, mktemp(Ity_I64,
2896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64((ULong)op2)));
2897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "aghi";
2900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AHHHR(UChar r3, UChar r1, UChar r2)
2904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
2907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r2));
2910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w0(r3));
2911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
2912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op2, op3);
2913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
2914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ahhhr";
2916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AHHLR(UChar r3, UChar r1, UChar r2)
2920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
2923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r2));
2926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
2927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
2928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op2, op3);
2929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
2930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ahhlr";
2932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AIH(UChar r1, UInt i2)
2936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
2939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
2942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)i2;
2943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkU32((UInt)op2)));
2944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, mktemp(Ity_I32,
2945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32((UInt)op2)));
2946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
2947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "aih";
2949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALR(UChar r1, UChar r2)
2953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
2960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, op2);
2962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alr";
2965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALGR(UChar r1, UChar r2)
2969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
2976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, op2);
2978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "algr";
2981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
2984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALGFR(UChar r1, UChar r2)
2985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Uto64, get_gpr_w1(r2)));
2992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, op2);
2994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "algfr";
2997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALRK(UChar r3, UChar r1, UChar r2)
3001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
3004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
3007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
3008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
3009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op2, op3);
3010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
3011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alrk";
3013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALGRK(UChar r3, UChar r1, UChar r2)
3017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
3020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
3021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
3023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
3024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op2), mkexpr(op3)));
3025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op2, op3);
3026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
3027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "algrk";
3029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AL(UChar r1, IRTemp op2addr)
3033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
3040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
3041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, op2);
3042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
3043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "al";
3045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALY(UChar r1, IRTemp op2addr)
3049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
3056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
3057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, op2);
3058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
3059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "aly";
3061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALG(UChar r1, IRTemp op2addr)
3065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
3069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
3072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
3073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, op2);
3074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
3075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alg";
3077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALGF(UChar r1, IRTemp op2addr)
3081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
3085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Uto64, load(Ity_I32, mkexpr(op2addr))));
3088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
3089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, op2);
3090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
3091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "algf";
3093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALFI(UChar r1, UInt i2)
3097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
3100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkU32(op2)));
3105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, mktemp(Ity_I32,
3106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(op2)));
3107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
3108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alfi";
3110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALGFI(UChar r1, UInt i2)
3114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong op2;
3117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
3118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (ULong)i2;
3121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkU64(op2)));
3122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, mktemp(Ity_I64,
3123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64(op2)));
3124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
3125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "algfi";
3127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALHHHR(UChar r3, UChar r1, UChar r2)
3131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
3134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r2));
3137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w0(r3));
3138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
3139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op2, op3);
3140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
3141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alhhhr";
3143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALHHLR(UChar r3, UChar r1, UChar r2)
3147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
3150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r2));
3153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
3154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
3155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op2, op3);
3156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
3157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alhhlr";
3159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALCR(UChar r1, UChar r2)
3163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp carry_in = newTemp(Ity_I32);
3168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
3171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(carry_in, binop(Iop_Shr32, s390_call_calculate_cc(), mkU8(1)));
3172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)),
3173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(carry_in)));
3174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_ADDC_32, op1, op2, carry_in);
3175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
3176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alcr";
3178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALCGR(UChar r1, UChar r2)
3182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
3186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp carry_in = newTemp(Ity_I64);
3187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
3190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(carry_in, unop(Iop_32Uto64, binop(Iop_Shr32, s390_call_calculate_cc(),
3191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(1))));
3192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)),
3193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(carry_in)));
3194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_ADDC_64, op1, op2, carry_in);
3195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
3196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alcgr";
3198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALC(UChar r1, IRTemp op2addr)
3202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp carry_in = newTemp(Ity_I32);
3207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
3210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(carry_in, binop(Iop_Shr32, s390_call_calculate_cc(), mkU8(1)));
3211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)),
3212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(carry_in)));
3213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_ADDC_32, op1, op2, carry_in);
3214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
3215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alc";
3217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALCG(UChar r1, IRTemp op2addr)
3221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
3225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp carry_in = newTemp(Ity_I64);
3226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
3229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(carry_in, unop(Iop_32Uto64, binop(Iop_Shr32, s390_call_calculate_cc(),
3230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(1))));
3231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)),
3232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(carry_in)));
3233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_ADDC_64, op1, op2, carry_in);
3234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
3235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alcg";
3237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALSI(UChar i2, IRTemp op1addr)
3241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
3244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I32, mkexpr(op1addr)));
3247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (UInt)(Int)(Char)i2;
3248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkU32(op2)));
3249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, mktemp(Ity_I32,
3250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(op2)));
3251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
3252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alsi";
3254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALGSI(UChar i2, IRTemp op1addr)
3258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong op2;
3261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
3262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I64, mkexpr(op1addr)));
3264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (ULong)(Long)(Char)i2;
3265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkU64(op2)));
3266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, mktemp(Ity_I64,
3267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64(op2)));
3268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
3269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "algsi";
3271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALHSIK(UChar r1, UChar r3, UShort i2)
3275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
3277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
3278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (UInt)(Int)(Short)i2;
3281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
3282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkU32(op2), mkexpr(op3)));
3283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, mktemp(Ity_I32, mkU32(op2)),
3284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       op3);
3285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
3286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alhsik";
3288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALGHSIK(UChar r1, UChar r3, UShort i2)
3292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong op2;
3294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
3295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
3296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (ULong)(Long)(Short)i2;
3298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
3299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkU64(op2), mkexpr(op3)));
3300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, mktemp(Ity_I64, mkU64(op2)),
3301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       op3);
3302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
3303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alghsik";
3305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALSIH(UChar r1, UInt i2)
3309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
3312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
3315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkU32(op2)));
3317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, mktemp(Ity_I32,
3318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(op2)));
3319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
3320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alsih";
3322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALSIHN(UChar r1, UInt i2)
3326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
3329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
3332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkU32(op2)));
3334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
3335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alsihn";
3337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NR(UChar r1, UChar r2)
3341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
3348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And32, mkexpr(op1), mkexpr(op2)));
3349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
3351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nr";
3353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NGR(UChar r1, UChar r2)
3357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
3361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
3364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And64, mkexpr(op1), mkexpr(op2)));
3365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
3367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ngr";
3369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NRK(UChar r3, UChar r1, UChar r2)
3373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
3376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
3379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
3380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And32, mkexpr(op2), mkexpr(op3)));
3381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
3383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nrk";
3385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NGRK(UChar r3, UChar r1, UChar r2)
3389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
3392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
3393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
3395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
3396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And64, mkexpr(op2), mkexpr(op3)));
3397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
3399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ngrk";
3401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_N(UChar r1, IRTemp op2addr)
3405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
3412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And32, mkexpr(op1), mkexpr(op2)));
3413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
3415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "n";
3417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NY(UChar r1, IRTemp op2addr)
3421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
3428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And32, mkexpr(op1), mkexpr(op2)));
3429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
3431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ny";
3433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NG(UChar r1, IRTemp op2addr)
3437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
3441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
3444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And64, mkexpr(op1), mkexpr(op2)));
3445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
3447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ng";
3449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NI(UChar i2, IRTemp op1addr)
3453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I8);
3455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar op2;
3456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I8);
3457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I8, mkexpr(op1addr)));
3459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And8, mkexpr(op1), mkU8(op2)));
3461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
3463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ni";
3465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NIY(UChar i2, IRTemp op1addr)
3469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I8);
3471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar op2;
3472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I8);
3473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I8, mkexpr(op1addr)));
3475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And8, mkexpr(op1), mkU8(op2)));
3477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
3479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "niy";
3481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NIHF(UChar r1, UInt i2)
3485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
3488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
3491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And32, mkexpr(op1), mkU32(op2)));
3493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
3495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nihf";
3497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NIHH(UChar r1, UShort i2)
3501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
3503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
3504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I16);
3505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_hw0(r1));
3507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And16, mkexpr(op1), mkU16(op2)));
3509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw0(r1, mkexpr(result));
3511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nihh";
3513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NIHL(UChar r1, UShort i2)
3517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
3519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
3520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I16);
3521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_hw1(r1));
3523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And16, mkexpr(op1), mkU16(op2)));
3525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw1(r1, mkexpr(result));
3527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nihl";
3529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NILF(UChar r1, UInt i2)
3533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
3536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And32, mkexpr(op1), mkU32(op2)));
3541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
3543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nilf";
3545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NILH(UChar r1, UShort i2)
3549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
3551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
3552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I16);
3553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_hw2(r1));
3555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And16, mkexpr(op1), mkU16(op2)));
3557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw2(r1, mkexpr(result));
3559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nilh";
3561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NILL(UChar r1, UShort i2)
3565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
3567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
3568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I16);
3569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_hw3(r1));
3571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And16, mkexpr(op1), mkU16(op2)));
3573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw3(r1, mkexpr(result));
3575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nill";
3577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BASR(UChar r1, UChar r2)
3581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp target = newTemp(Ity_I64);
3583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r2 == 0) {
3585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 2ULL));
3586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (r1 != r2) {
3588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 2ULL));
3589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         call_function(get_gpr_dw0(r2));
3590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(target, get_gpr_dw0(r2));
3592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 2ULL));
3593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         call_function(mkexpr(target));
3594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "basr";
3598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BAS(UChar r1, IRTemp op2addr)
3602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp target = newTemp(Ity_I64);
3604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 4ULL));
3606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(target, mkexpr(op2addr));
3607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call_function(mkexpr(target));
3608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bas";
3610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BCR(UChar r1, UChar r2)
3614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
3616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r2 == 0 && (r1 >= 14)) {    /* serialization */
3618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      stmt(IRStmt_MBE(Imbe_Fence));
3619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r2 == 0) || (r1 == 0)) {
3622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (r1 == 15) {
3624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return_from_function(get_gpr_dw0(r2));
3625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(cond, s390_call_calculate_cond(r1));
3627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    get_gpr_dw0(r2));
3629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
3632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC2(XMNM, GPR), S390_XMNM_BCR, r1, r2);
3633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bcr";
3635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BC(UChar r1, UChar x2, UChar b2, UShort d2, IRTemp op2addr)
3639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
3641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r1 == 0) {
3643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (r1 == 15) {
3645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op2addr));
3646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(cond, s390_call_calculate_cond(r1));
3648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(op2addr));
3650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
3653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC2(XMNM, UDXB), S390_XMNM_BC, r1, d2, x2, b2);
3654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bc";
3656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BCTR(UChar r1, UChar r2)
3660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Sub32, get_gpr_w1(r1), mkU32(1)));
3662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r2 != 0) {
3663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if_condition_goto_computed(binop(Iop_CmpNE32, get_gpr_w1(r1), mkU32(0)),
3664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 get_gpr_dw0(r2));
3665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bctr";
3668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BCTGR(UChar r1, UChar r2)
3672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Sub64, get_gpr_dw0(r1), mkU64(1)));
3674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r2 != 0) {
3675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if_condition_goto_computed(binop(Iop_CmpNE64, get_gpr_dw0(r1), mkU64(0)),
3676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 get_gpr_dw0(r2));
3677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bctgr";
3680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BCT(UChar r1, IRTemp op2addr)
3684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Sub32, get_gpr_w1(r1), mkU32(1)));
3686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if_condition_goto_computed(binop(Iop_CmpNE32, get_gpr_w1(r1), mkU32(0)),
3687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                              mkexpr(op2addr));
3688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bct";
3690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BCTG(UChar r1, IRTemp op2addr)
3694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Sub64, get_gpr_dw0(r1), mkU64(1)));
3696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if_condition_goto_computed(binop(Iop_CmpNE64, get_gpr_dw0(r1), mkU64(0)),
3697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                              mkexpr(op2addr));
3698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bctg";
3700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BXH(UChar r1, UChar r3, IRTemp op2addr)
3704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I32);
3706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_w1(r3 | 1));
3708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Add32, get_gpr_w1(r1), get_gpr_w1(r3)));
3709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if_condition_goto_computed(binop(Iop_CmpLT32S, mkexpr(value),
3710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    get_gpr_w1(r1)), mkexpr(op2addr));
3711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bxh";
3713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BXHG(UChar r1, UChar r3, IRTemp op2addr)
3717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I64);
3719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_dw0(r3 | 1));
3721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Add64, get_gpr_dw0(r1), get_gpr_dw0(r3)));
3722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if_condition_goto_computed(binop(Iop_CmpLT64S, mkexpr(value),
3723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    get_gpr_dw0(r1)), mkexpr(op2addr));
3724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bxhg";
3726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BXLE(UChar r1, UChar r3, IRTemp op2addr)
3730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I32);
3732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_w1(r3 | 1));
3734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Add32, get_gpr_w1(r1), get_gpr_w1(r3)));
3735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if_condition_goto_computed(binop(Iop_CmpLE32S, get_gpr_w1(r1),
3736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(value)), mkexpr(op2addr));
3737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bxle";
3739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BXLEG(UChar r1, UChar r3, IRTemp op2addr)
3743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I64);
3745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_dw0(r3 | 1));
3747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Add64, get_gpr_dw0(r1), get_gpr_dw0(r3)));
3748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if_condition_goto_computed(binop(Iop_CmpLE64S, get_gpr_dw0(r1),
3749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(value)), mkexpr(op2addr));
3750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bxleg";
3752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRAS(UChar r1, UShort i2)
3756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 4ULL));
3758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call_function_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bras";
3761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRASL(UChar r1, UInt i2)
3765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 6ULL));
3767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call_function_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1));
3768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brasl";
3770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRC(UChar r1, UShort i2)
3774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
3776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r1 == 0) {
3778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (r1 == 15) {
3780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(
3781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(cond, s390_call_calculate_cond(r1));
3784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
3790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC2(XMNM, PCREL), S390_XMNM_BRC, r1, (Int)(Short)i2);
3791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brc";
3793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRCL(UChar r1, UInt i2)
3797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
3799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r1 == 0) {
3801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (r1 == 15) {
3803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1));
3804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(cond, s390_call_calculate_cond(r1));
3806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1));
3808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
3811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC2(XMNM, PCREL), S390_XMNM_BRCL, r1, i2);
3812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brcl";
3814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRCT(UChar r1, UShort i2)
3818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Sub32, get_gpr_w1(r1), mkU32(1)));
3820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if_condition_goto(binop(Iop_CmpNE32, get_gpr_w1(r1), mkU32(0)),
3821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brct";
3824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRCTG(UChar r1, UShort i2)
3828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Sub64, get_gpr_dw0(r1), mkU64(1)));
3830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if_condition_goto(binop(Iop_CmpNE64, get_gpr_dw0(r1), mkU64(0)),
3831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brctg";
3834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRXH(UChar r1, UChar r3, UShort i2)
3838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I32);
3840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_w1(r3 | 1));
3842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Add32, get_gpr_w1(r1), get_gpr_w1(r3)));
3843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if_condition_goto(binop(Iop_CmpLT32S, mkexpr(value), get_gpr_w1(r1)),
3844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brxh";
3847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRXHG(UChar r1, UChar r3, UShort i2)
3851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I64);
3853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_dw0(r3 | 1));
3855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Add64, get_gpr_dw0(r1), get_gpr_dw0(r3)));
3856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if_condition_goto(binop(Iop_CmpLT64S, mkexpr(value), get_gpr_dw0(r1)),
3857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brxhg";
3860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRXLE(UChar r1, UChar r3, UShort i2)
3864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I32);
3866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_w1(r3 | 1));
3868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Add32, get_gpr_w1(r1), get_gpr_w1(r3)));
3869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if_condition_goto(binop(Iop_CmpLE32S, get_gpr_w1(r1), mkexpr(value)),
3870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brxle";
3873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRXLG(UChar r1, UChar r3, UShort i2)
3877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I64);
3879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_dw0(r3 | 1));
3881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Add64, get_gpr_dw0(r1), get_gpr_dw0(r3)));
3882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if_condition_goto(binop(Iop_CmpLE64S, get_gpr_dw0(r1), mkexpr(value)),
3883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brxlg";
3886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CR(UChar r1, UChar r2)
3890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
3896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cr";
3899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGR(UChar r1, UChar r2)
3903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
3909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgr";
3912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGFR(UChar r1, UChar r2)
3916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
3922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgfr";
3925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_C(UChar r1, IRTemp op2addr)
3929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
3935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "c";
3938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CY(UChar r1, IRTemp op2addr)
3942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
3948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cy";
3951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CG(UChar r1, IRTemp op2addr)
3955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
3961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cg";
3964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGF(UChar r1, IRTemp op2addr)
3968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
3974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgf";
3977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CFI(UChar r1, UInt i2)
3981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
3984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)i2;
3987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I32,
3988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32((UInt)op2)));
3989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cfi";
3991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
3994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGFI(UChar r1, UInt i2)
3995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
3998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Long)(Int)i2;
4001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I64,
4002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64((ULong)op2)));
4003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgfi";
4005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CRL(UChar r1, UInt i2)
4009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
4015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          i2 << 1))));
4016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
4017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "crl";
4019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGRL(UChar r1, UInt i2)
4023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
4029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          i2 << 1))));
4030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
4031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgrl";
4033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGFRL(UChar r1, UInt i2)
4037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkU64(guest_IA_curr_instr +
4043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ((ULong)(Long)(Int)i2 << 1)))));
4044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
4045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgfrl";
4047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CRB(UChar r1, UChar r2, UChar m3, IRTemp op4addr)
4051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op4addr));
4060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_w1(r1));
4062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op2, get_gpr_w1(r2));
4063663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE,
4064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              op1, op2));
4065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond),
4066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          mkU32(0)), mkexpr(op4addr));
4067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "crb";
4071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGRB(UChar r1, UChar r2, UChar m3, IRTemp op4addr)
4075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op4addr));
4084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_dw0(r1));
4086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op2, get_gpr_dw0(r2));
4087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE,
4088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              op1, op2));
4089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond),
4090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          mkU32(0)), mkexpr(op4addr));
4091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgrb";
4095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CRJ(UChar r1, UChar r2, UShort i4, UChar m3)
4099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(
4108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_w1(r1));
4111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op2, get_gpr_w1(r2));
4112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE,
4113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              op1, op2));
4114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "crj";
4121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGRJ(UChar r1, UChar r2, UShort i4, UChar m3)
4125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(
4134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_dw0(r1));
4137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op2, get_gpr_dw0(r2));
4138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE,
4139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              op1, op2));
4140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgrj";
4147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CIB(UChar r1, UChar m3, UChar i2, IRTemp op4addr)
4151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
4154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op4addr));
4160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_w1(r1));
4162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         op2 = (Int)(Char)i2;
4163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE, op1,
4164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mktemp(Ity_I32, mkU32((UInt)op2))));
4165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(op4addr));
4167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cib";
4171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGIB(UChar r1, UChar m3, UChar i2, IRTemp op4addr)
4175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
4178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op4addr));
4184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_dw0(r1));
4186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         op2 = (Long)(Char)i2;
4187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE, op1,
4188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mktemp(Ity_I64, mkU64((ULong)op2))));
4189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(op4addr));
4191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgib";
4195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CIJ(UChar r1, UChar m3, UShort i4, UChar i2)
4199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
4202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_w1(r1));
4210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         op2 = (Int)(Char)i2;
4211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE, op1,
4212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mktemp(Ity_I32, mkU32((UInt)op2))));
4213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cij";
4220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGIJ(UChar r1, UChar m3, UShort i4, UChar i2)
4224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
4227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_dw0(r1));
4235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         op2 = (Long)(Char)i2;
4236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE, op1,
4237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mktemp(Ity_I64, mkU64((ULong)op2))));
4238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgij";
4245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CH(UChar r1, IRTemp op2addr)
4249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
4255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
4256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ch";
4258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CHY(UChar r1, IRTemp op2addr)
4262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
4268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
4269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "chy";
4271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGH(UChar r1, IRTemp op2addr)
4275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto64, load(Ity_I16, mkexpr(op2addr))));
4281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
4282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgh";
4284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CHI(UChar r1, UShort i2)
4288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
4291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)(Short)i2;
4294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I32,
4295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32((UInt)op2)));
4296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "chi";
4298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGHI(UChar r1, UShort i2)
4302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
4305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Long)(Short)i2;
4308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I64,
4309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64((ULong)op2)));
4310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cghi";
4312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CHHSI(UShort i2, IRTemp op1addr)
4316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
4318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Short op2;
4319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I16, mkexpr(op1addr)));
4321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Short)i2;
4322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I16,
4323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU16((UShort)op2)));
4324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "chhsi";
4326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CHSI(UShort i2, IRTemp op1addr)
4330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
4333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I32, mkexpr(op1addr)));
4335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)(Short)i2;
4336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I32,
4337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32((UInt)op2)));
4338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "chsi";
4340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGHSI(UShort i2, IRTemp op1addr)
4344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
4347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I64, mkexpr(op1addr)));
4349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Long)(Short)i2;
4350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I64,
4351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64((ULong)op2)));
4352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cghsi";
4354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CHRL(UChar r1, UInt i2)
4358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkU64(guest_IA_curr_instr +
4364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ((ULong)(Long)(Int)i2 << 1)))));
4365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
4366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "chrl";
4368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGHRL(UChar r1, UInt i2)
4372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto64, load(Ity_I16, mkU64(guest_IA_curr_instr +
4378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ((ULong)(Long)(Int)i2 << 1)))));
4379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
4380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cghrl";
4382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CHHR(UChar r1, UChar r2)
4386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
4391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r2));
4392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
4393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "chhr";
4395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CHLR(UChar r1, UChar r2)
4399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
4404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
4405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
4406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "chlr";
4408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CHF(UChar r1, IRTemp op2addr)
4412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
4417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
4418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
4419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "chf";
4421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CIH(UChar r1, UInt i2)
4425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
4428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
4430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)i2;
4431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I32,
4432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32((UInt)op2)));
4433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cih";
4435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLR(UChar r1, UChar r2)
4439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
4445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clr";
4448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGR(UChar r1, UChar r2)
4452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
4458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgr";
4461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGFR(UChar r1, UChar r2)
4465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Uto64, get_gpr_w1(r2)));
4471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgfr";
4474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CL(UChar r1, IRTemp op2addr)
4478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
4484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cl";
4487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLY(UChar r1, IRTemp op2addr)
4491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
4497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cly";
4500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLG(UChar r1, IRTemp op2addr)
4504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
4510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clg";
4513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGF(UChar r1, IRTemp op2addr)
4517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Uto64, load(Ity_I32, mkexpr(op2addr))));
4523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgf";
4526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLFI(UChar r1, UInt i2)
4530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
4533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
4536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I32,
4537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(op2)));
4538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clfi";
4540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGFI(UChar r1, UInt i2)
4544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong op2;
4547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (ULong)i2;
4550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I64,
4551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64(op2)));
4552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgfi";
4554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLI(UChar i2, IRTemp op1addr)
4558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I8);
4560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar op2;
4561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I8, mkexpr(op1addr)));
4563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
4564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I8,
4565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU8(op2)));
4566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cli";
4568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLIY(UChar i2, IRTemp op1addr)
4572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I8);
4574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar op2;
4575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I8, mkexpr(op1addr)));
4577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
4578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I8,
4579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU8(op2)));
4580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cliy";
4582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLFHSI(UShort i2, IRTemp op1addr)
4586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
4589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I32, mkexpr(op1addr)));
4591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (UInt)i2;
4592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I32,
4593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(op2)));
4594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clfhsi";
4596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGHSI(UShort i2, IRTemp op1addr)
4600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong op2;
4603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I64, mkexpr(op1addr)));
4605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (ULong)i2;
4606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I64,
4607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64(op2)));
4608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clghsi";
4610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLHHSI(UShort i2, IRTemp op1addr)
4614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
4616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
4617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I16, mkexpr(op1addr)));
4619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
4620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I16,
4621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU16(op2)));
4622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clhhsi";
4624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLRL(UChar r1, UInt i2)
4628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
4634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          i2 << 1))));
4635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clrl";
4638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGRL(UChar r1, UInt i2)
4642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
4648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          i2 << 1))));
4649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgrl";
4652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGFRL(UChar r1, UInt i2)
4656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Uto64, load(Ity_I32, mkU64(guest_IA_curr_instr +
4662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ((ULong)(Long)(Int)i2 << 1)))));
4663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgfrl";
4666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLHRL(UChar r1, UInt i2)
4670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Uto32, load(Ity_I16, mkU64(guest_IA_curr_instr +
4676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ((ULong)(Long)(Int)i2 << 1)))));
4677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clhrl";
4680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGHRL(UChar r1, UInt i2)
4684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Uto64, load(Ity_I16, mkU64(guest_IA_curr_instr +
4690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ((ULong)(Long)(Int)i2 << 1)))));
4691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clghrl";
4694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLRB(UChar r1, UChar r2, UChar m3, IRTemp op4addr)
4698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op4addr));
4707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_w1(r1));
4709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op2, get_gpr_w1(r2));
4710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE,
4711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              op1, op2));
4712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(op4addr));
4714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clrb";
4718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGRB(UChar r1, UChar r2, UChar m3, IRTemp op4addr)
4722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op4addr));
4731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_dw0(r1));
4733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op2, get_gpr_dw0(r2));
4734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE,
4735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              op1, op2));
4736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(op4addr));
4738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgrb";
4742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLRJ(UChar r1, UChar r2, UShort i4, UChar m3)
4746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_w1(r1));
4757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op2, get_gpr_w1(r2));
4758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE,
4759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              op1, op2));
4760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clrj";
4767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGRJ(UChar r1, UChar r2, UShort i4, UChar m3)
4771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_dw0(r1));
4782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op2, get_gpr_dw0(r2));
4783663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE,
4784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              op1, op2));
4785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgrj";
4792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLIB(UChar r1, UChar m3, UChar i2, IRTemp op4addr)
4796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
4799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op4addr));
4805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_w1(r1));
4807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         op2 = (UInt)i2;
4808663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE, op1,
4809663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mktemp(Ity_I32, mkU32(op2))));
4810663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4811663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(op4addr));
4812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clib";
4816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGIB(UChar r1, UChar m3, UChar i2, IRTemp op4addr)
4820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong op2;
4823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op4addr));
4829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_dw0(r1));
4831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         op2 = (ULong)i2;
4832663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE, op1,
4833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mktemp(Ity_I64, mkU64(op2))));
4834663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(op4addr));
4836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgib";
4840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLIJ(UChar r1, UChar m3, UShort i4, UChar i2)
4844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
4847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_w1(r1));
4855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         op2 = (UInt)i2;
4856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE, op1,
4857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mktemp(Ity_I32, mkU32(op2))));
4858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clij";
4865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGIJ(UChar r1, UChar m3, UShort i4, UChar i2)
4869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong op2;
4872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_dw0(r1));
4880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         op2 = (ULong)i2;
4881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE, op1,
4882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mktemp(Ity_I64, mkU64(op2))));
4883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgij";
4890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLM(UChar r1, UChar r3, IRTemp op2addr)
4894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b0 = newTemp(Ity_I32);
4898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b1 = newTemp(Ity_I32);
4899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b2 = newTemp(Ity_I32);
4900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b3 = newTemp(Ity_I32);
4901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c0 = newTemp(Ity_I32);
4902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c1 = newTemp(Ity_I32);
4903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c2 = newTemp(Ity_I32);
4904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c3 = newTemp(Ity_I32);
4905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
4906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
4908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 8) != 0) {
4909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b0, unop(Iop_8Uto32, get_gpr_b4(r1)));
4910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c0, unop(Iop_8Uto32, load(Ity_I8, mkexpr(op2addr))));
4911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b0, mkU32(0));
4914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c0, mkU32(0));
4915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 4) != 0) {
4917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b1, unop(Iop_8Uto32, get_gpr_b5(r1)));
4918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c1, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
4920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b1, mkU32(0));
4923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c1, mkU32(0));
4924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 2) != 0) {
4926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b2, unop(Iop_8Uto32, get_gpr_b6(r1)));
4927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c2, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
4929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b2, mkU32(0));
4932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c2, mkU32(0));
4933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 1) != 0) {
4935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b3, unop(Iop_8Uto32, get_gpr_b7(r1)));
4936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c3, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
4938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b3, mkU32(0));
4941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c3, mkU32(0));
4942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
4944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(b0), mkU8(24)), binop(Iop_Shl32, mkexpr(b1), mkU8(16))),
4945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Shl32, mkexpr(b2), mkU8(8))), mkexpr(b3)));
4946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
4947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(c0), mkU8(24)), binop(Iop_Shl32, mkexpr(c1), mkU8(16))),
4948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Shl32, mkexpr(c2), mkU8(8))), mkexpr(c3)));
4949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clm";
4952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
4955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLMY(UChar r1, UChar r3, IRTemp op2addr)
4956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b0 = newTemp(Ity_I32);
4960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b1 = newTemp(Ity_I32);
4961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b2 = newTemp(Ity_I32);
4962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b3 = newTemp(Ity_I32);
4963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c0 = newTemp(Ity_I32);
4964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c1 = newTemp(Ity_I32);
4965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c2 = newTemp(Ity_I32);
4966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c3 = newTemp(Ity_I32);
4967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
4968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
4970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 8) != 0) {
4971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b0, unop(Iop_8Uto32, get_gpr_b4(r1)));
4972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c0, unop(Iop_8Uto32, load(Ity_I8, mkexpr(op2addr))));
4973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b0, mkU32(0));
4976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c0, mkU32(0));
4977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 4) != 0) {
4979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b1, unop(Iop_8Uto32, get_gpr_b5(r1)));
4980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c1, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
4982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b1, mkU32(0));
4985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c1, mkU32(0));
4986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 2) != 0) {
4988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b2, unop(Iop_8Uto32, get_gpr_b6(r1)));
4989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c2, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
4991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b2, mkU32(0));
4994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c2, mkU32(0));
4995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 1) != 0) {
4997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b3, unop(Iop_8Uto32, get_gpr_b7(r1)));
4998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c3, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
5000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
5002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b3, mkU32(0));
5003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c3, mkU32(0));
5004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
5006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(b0), mkU8(24)), binop(Iop_Shl32, mkexpr(b1), mkU8(16))),
5007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Shl32, mkexpr(b2), mkU8(8))), mkexpr(b3)));
5008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
5009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(c0), mkU8(24)), binop(Iop_Shl32, mkexpr(c1), mkU8(16))),
5010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Shl32, mkexpr(c2), mkU8(8))), mkexpr(c3)));
5011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
5012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clmy";
5014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLMH(UChar r1, UChar r3, IRTemp op2addr)
5018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
5020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b0 = newTemp(Ity_I32);
5022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b1 = newTemp(Ity_I32);
5023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b2 = newTemp(Ity_I32);
5024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b3 = newTemp(Ity_I32);
5025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c0 = newTemp(Ity_I32);
5026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c1 = newTemp(Ity_I32);
5027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c2 = newTemp(Ity_I32);
5028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c3 = newTemp(Ity_I32);
5029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
5030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
5032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 8) != 0) {
5033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b0, unop(Iop_8Uto32, get_gpr_b0(r1)));
5034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c0, unop(Iop_8Uto32, load(Ity_I8, mkexpr(op2addr))));
5035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
5037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b0, mkU32(0));
5038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c0, mkU32(0));
5039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 4) != 0) {
5041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b1, unop(Iop_8Uto32, get_gpr_b1(r1)));
5042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c1, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
5043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
5044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
5046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b1, mkU32(0));
5047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c1, mkU32(0));
5048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 2) != 0) {
5050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b2, unop(Iop_8Uto32, get_gpr_b2(r1)));
5051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c2, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
5052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
5053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
5055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b2, mkU32(0));
5056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c2, mkU32(0));
5057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 1) != 0) {
5059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b3, unop(Iop_8Uto32, get_gpr_b3(r1)));
5060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c3, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
5061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
5062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
5064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b3, mkU32(0));
5065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c3, mkU32(0));
5066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
5068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(b0), mkU8(24)), binop(Iop_Shl32, mkexpr(b1), mkU8(16))),
5069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Shl32, mkexpr(b2), mkU8(8))), mkexpr(b3)));
5070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
5071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(c0), mkU8(24)), binop(Iop_Shl32, mkexpr(c1), mkU8(16))),
5072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Shl32, mkexpr(c2), mkU8(8))), mkexpr(c3)));
5073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
5074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clmh";
5076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLHHR(UChar r1, UChar r2)
5080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
5082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
5085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r2));
5086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
5087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clhhr";
5089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLHLR(UChar r1, UChar r2)
5093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
5095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
5098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
5099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
5100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clhlr";
5102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLHF(UChar r1, IRTemp op2addr)
5106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
5108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
5111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
5112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
5113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clhf";
5115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLIH(UChar r1, UInt i2)
5119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
5121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
5122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
5124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
5125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I32,
5126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(op2)));
5127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clih";
5129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CPYA(UChar r1, UChar r2)
5133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_ar_w0(r1, get_ar_w0(r2));
5135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
5136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, AR, AR), "cpya", r1, r2);
5137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cpya";
5139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XR(UChar r1, UChar r2)
5143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
5145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r1 == r2) {
5149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(result, mkU32(0));
5150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
5151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(op1, get_gpr_w1(r1));
5152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(op2, get_gpr_w1(r2));
5153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(result, binop(Iop_Xor32, mkexpr(op1), mkexpr(op2)));
5154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
5157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xr";
5159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XGR(UChar r1, UChar r2)
5163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
5165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
5167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r1 == r2) {
5169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(result, mkU64(0));
5170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
5171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(op1, get_gpr_dw0(r1));
5172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(op2, get_gpr_dw0(r2));
5173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(result, binop(Iop_Xor64, mkexpr(op1), mkexpr(op2)));
5174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
5177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xgr";
5179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XRK(UChar r3, UChar r1, UChar r2)
5183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
5186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
5189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
5190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor32, mkexpr(op2), mkexpr(op3)));
5191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
5193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xrk";
5195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XGRK(UChar r3, UChar r1, UChar r2)
5199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
5202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
5203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
5205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
5206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor64, mkexpr(op2), mkexpr(op3)));
5207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
5209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xgrk";
5211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_X(UChar r1, IRTemp op2addr)
5215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
5217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
5221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
5222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor32, mkexpr(op1), mkexpr(op2)));
5223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
5225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "x";
5227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XY(UChar r1, IRTemp op2addr)
5231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
5233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
5237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
5238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor32, mkexpr(op1), mkexpr(op2)));
5239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
5241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xy";
5243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XG(UChar r1, IRTemp op2addr)
5247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
5249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
5251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
5253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
5254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor64, mkexpr(op1), mkexpr(op2)));
5255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
5257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xg";
5259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XI(UChar i2, IRTemp op1addr)
5263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I8);
5265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar op2;
5266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I8);
5267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I8, mkexpr(op1addr)));
5269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
5270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor8, mkexpr(op1), mkU8(op2)));
5271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
5273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xi";
5275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XIY(UChar i2, IRTemp op1addr)
5279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I8);
5281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar op2;
5282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I8);
5283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I8, mkexpr(op1addr)));
5285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
5286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor8, mkexpr(op1), mkU8(op2)));
5287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
5289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xiy";
5291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XIHF(UChar r1, UInt i2)
5295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
5297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
5298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
5301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
5302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor32, mkexpr(op1), mkU32(op2)));
5303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
5305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xihf";
5307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XILF(UChar r1, UInt i2)
5311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
5313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
5314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
5317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
5318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor32, mkexpr(op1), mkU32(op2)));
5319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
5321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xilf";
5323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_EAR(UChar r1, UChar r2)
5327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, get_ar_w0(r2));
5329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
5330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, AR), "ear", r1, r2);
5331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ear";
5333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_IC(UChar r1, IRTemp op2addr)
5337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b7(r1, load(Ity_I8, mkexpr(op2addr)));
5339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ic";
5341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ICY(UChar r1, IRTemp op2addr)
5345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b7(r1, load(Ity_I8, mkexpr(op2addr)));
5347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "icy";
5349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ICM(UChar r1, UChar r3, IRTemp op2addr)
5353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
5355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt mask;
5357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
5359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = (UInt)r3;
5360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 8) != 0) {
5361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b4(r1, load(Ity_I8, mkexpr(op2addr)));
5362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 4) != 0) {
5365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b5(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
5366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 2) != 0) {
5370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b6(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
5371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 1) != 0) {
5375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b7(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
5376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, get_gpr_w1(r1));
5380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_INSERT_CHAR_MASK_32, result, mktemp(Ity_I32,
5381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(mask)));
5382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "icm";
5384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ICMY(UChar r1, UChar r3, IRTemp op2addr)
5388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
5390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt mask;
5392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
5394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = (UInt)r3;
5395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 8) != 0) {
5396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b4(r1, load(Ity_I8, mkexpr(op2addr)));
5397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 4) != 0) {
5400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b5(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
5401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 2) != 0) {
5405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b6(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
5406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 1) != 0) {
5410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b7(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
5411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, get_gpr_w1(r1));
5415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_INSERT_CHAR_MASK_32, result, mktemp(Ity_I32,
5416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(mask)));
5417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "icmy";
5419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ICMH(UChar r1, UChar r3, IRTemp op2addr)
5423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
5425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt mask;
5427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
5429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = (UInt)r3;
5430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 8) != 0) {
5431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b0(r1, load(Ity_I8, mkexpr(op2addr)));
5432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 4) != 0) {
5435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b1(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
5436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 2) != 0) {
5440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b2(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
5441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 1) != 0) {
5445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b3(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
5446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, get_gpr_w0(r1));
5450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_INSERT_CHAR_MASK_32, result, mktemp(Ity_I32,
5451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(mask)));
5452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "icmh";
5454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_IIHF(UChar r1, UInt i2)
5458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkU32(i2));
5460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "iihf";
5462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_IIHH(UChar r1, UShort i2)
5466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw0(r1, mkU16(i2));
5468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "iihh";
5470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_IIHL(UChar r1, UShort i2)
5474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw1(r1, mkU16(i2));
5476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "iihl";
5478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_IILF(UChar r1, UInt i2)
5482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkU32(i2));
5484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "iilf";
5486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_IILH(UChar r1, UShort i2)
5490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw2(r1, mkU16(i2));
5492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "iilh";
5494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_IILL(UChar r1, UShort i2)
5498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw3(r1, mkU16(i2));
5500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "iill";
5502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LR(UChar r1, UChar r2)
5506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, get_gpr_w1(r2));
5508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lr";
5510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGR(UChar r1, UChar r2)
5514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, get_gpr_dw0(r2));
5516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgr";
5518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGFR(UChar r1, UChar r2)
5522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_32Sto64, get_gpr_w1(r2)));
5524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgfr";
5526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_L(UChar r1, IRTemp op2addr)
5530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, load(Ity_I32, mkexpr(op2addr)));
5532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "l";
5534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LY(UChar r1, IRTemp op2addr)
5538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, load(Ity_I32, mkexpr(op2addr)));
5540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ly";
5542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LG(UChar r1, IRTemp op2addr)
5546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, load(Ity_I64, mkexpr(op2addr)));
5548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lg";
5550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGF(UChar r1, IRTemp op2addr)
5554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
5556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgf";
5558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGFI(UChar r1, UInt i2)
5562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64((ULong)(Long)(Int)i2));
5564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgfi";
5566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LRL(UChar r1, UInt i2)
5570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, load(Ity_I32, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
5572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              i2 << 1))));
5573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lrl";
5575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGRL(UChar r1, UInt i2)
5579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, load(Ity_I64, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
5581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               i2 << 1))));
5582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgrl";
5584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGFRL(UChar r1, UInt i2)
5588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_32Sto64, load(Ity_I32, mkU64(guest_IA_curr_instr +
5590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               ((ULong)(Long)(Int)i2 << 1)))));
5591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgfrl";
5593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LA(UChar r1, IRTemp op2addr)
5597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2addr));
5599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "la";
5601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAY(UChar r1, IRTemp op2addr)
5605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2addr));
5607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lay";
5609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAE(UChar r1, IRTemp op2addr)
5613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2addr));
5615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lae";
5617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAEY(UChar r1, IRTemp op2addr)
5621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2addr));
5623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "laey";
5625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LARL(UChar r1, UInt i2)
5629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1)));
5631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "larl";
5633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* The IR representation of LAA and friends is an approximation of what
5636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   happens natively. Essentially a loop containing a compare-and-swap is
5637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   constructed which will iterate until the CAS succeeds. As a consequence,
5638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   instrumenters may see more memory accesses than happen natively. See also
5639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   discussion here: https://bugs.kde.org/show_bug.cgi?id=306035 */
5640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
5641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_load_and_add32(UChar r1, UChar r3, IRTemp op2addr, Bool is_signed)
5642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRCAS *cas;
5644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp old_mem = newTemp(Ity_I32);
5645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
5647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
5650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
5651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
5652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Place the addition of second operand and third operand at the
5654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      second-operand location everytime */
5655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   cas = mkIRCAS(IRTemp_INVALID, old_mem,
5656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 Iend_BE, mkexpr(op2addr),
5657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 NULL, mkexpr(op2), /* expected value */
5658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 NULL, mkexpr(result)  /* new value */);
5659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   stmt(IRStmt_CAS(cas));
5660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Set CC according to 32-bit addition */
5662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (is_signed) {
5663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op2, op3);
5664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
5665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op2, op3);
5666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
5667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* If old_mem contains the expected value, then the CAS succeeded.
5669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Otherwise, it did not */
5670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   yield_if(binop(Iop_CmpNE32, mkexpr(old_mem), mkexpr(op2)));
5671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(r1, mkexpr(old_mem));
5672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
5675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_load_and_add64(UChar r1, UChar r3, IRTemp op2addr, Bool is_signed)
5676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRCAS *cas;
5678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp old_mem = newTemp(Ity_I64);
5679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
5681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
5682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
5684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
5685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op2), mkexpr(op3)));
5686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Place the addition of second operand and third operand at the
5688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      second-operand location everytime */
5689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   cas = mkIRCAS(IRTemp_INVALID, old_mem,
5690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 Iend_BE, mkexpr(op2addr),
5691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 NULL, mkexpr(op2), /* expected value */
5692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 NULL, mkexpr(result)  /* new value */);
5693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   stmt(IRStmt_CAS(cas));
5694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Set CC according to 64-bit addition */
5696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (is_signed) {
5697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op2, op3);
5698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
5699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op2, op3);
5700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
5701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* If old_mem contains the expected value, then the CAS succeeded.
5703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Otherwise, it did not */
5704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   yield_if(binop(Iop_CmpNE64, mkexpr(old_mem), mkexpr(op2)));
5705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_dw0(r1, mkexpr(old_mem));
5706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
5709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_load_and_bitwise32(UChar r1, UChar r3, IRTemp op2addr, IROp op)
5710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRCAS *cas;
5712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp old_mem = newTemp(Ity_I32);
5713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
5715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
5718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
5719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, binop(op, mkexpr(op2), mkexpr(op3)));
5720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Place the addition of second operand and third operand at the
5722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      second-operand location everytime */
5723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   cas = mkIRCAS(IRTemp_INVALID, old_mem,
5724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 Iend_BE, mkexpr(op2addr),
5725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 NULL, mkexpr(op2), /* expected value */
5726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 NULL, mkexpr(result)  /* new value */);
5727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   stmt(IRStmt_CAS(cas));
5728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Set CC according to bitwise operation */
5730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* If old_mem contains the expected value, then the CAS succeeded.
5733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Otherwise, it did not */
5734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   yield_if(binop(Iop_CmpNE32, mkexpr(old_mem), mkexpr(op2)));
5735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(r1, mkexpr(old_mem));
5736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
5739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_load_and_bitwise64(UChar r1, UChar r3, IRTemp op2addr, IROp op)
5740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRCAS *cas;
5742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp old_mem = newTemp(Ity_I64);
5743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
5745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
5746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
5748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
5749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, binop(op, mkexpr(op2), mkexpr(op3)));
5750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Place the addition of second operand and third operand at the
5752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      second-operand location everytime */
5753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   cas = mkIRCAS(IRTemp_INVALID, old_mem,
5754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 Iend_BE, mkexpr(op2addr),
5755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 NULL, mkexpr(op2), /* expected value */
5756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 NULL, mkexpr(result)  /* new value */);
5757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   stmt(IRStmt_CAS(cas));
5758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Set CC according to bitwise operation */
5760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* If old_mem contains the expected value, then the CAS succeeded.
5763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      Otherwise, it did not */
5764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   yield_if(binop(Iop_CmpNE64, mkexpr(old_mem), mkexpr(op2)));
5765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_dw0(r1, mkexpr(old_mem));
5766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
5767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_LAA(UChar r1, UChar r3, IRTemp op2addr)
5770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
5771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_irgen_load_and_add32(r1, r3, op2addr, True /* is_signed */);
5772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "laa";
5774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
5775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_LAAG(UChar r1, UChar r3, IRTemp op2addr)
5778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
5779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_irgen_load_and_add64(r1, r3, op2addr, True /* is_signed */);
5780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "laag";
5782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
5783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_LAAL(UChar r1, UChar r3, IRTemp op2addr)
5786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
5787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_irgen_load_and_add32(r1, r3, op2addr, False /* is_signed */);
5788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "laal";
5790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
5791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_LAALG(UChar r1, UChar r3, IRTemp op2addr)
5794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
5795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_irgen_load_and_add64(r1, r3, op2addr, False /* is_signed */);
5796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "laalg";
5798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAN(UChar r1, UChar r3, IRTemp op2addr)
5802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_irgen_load_and_bitwise32(r1, r3, op2addr, Iop_And32);
5804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lan";
5806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LANG(UChar r1, UChar r3, IRTemp op2addr)
5810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_irgen_load_and_bitwise64(r1, r3, op2addr, Iop_And64);
5812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lang";
5814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAX(UChar r1, UChar r3, IRTemp op2addr)
5818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_irgen_load_and_bitwise32(r1, r3, op2addr, Iop_Xor32);
5820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lax";
5822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAXG(UChar r1, UChar r3, IRTemp op2addr)
5826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_irgen_load_and_bitwise64(r1, r3, op2addr, Iop_Xor64);
5828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "laxg";
5830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAO(UChar r1, UChar r3, IRTemp op2addr)
5834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_irgen_load_and_bitwise32(r1, r3, op2addr, Iop_Or32);
5836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lao";
5838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAOG(UChar r1, UChar r3, IRTemp op2addr)
5842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_irgen_load_and_bitwise64(r1, r3, op2addr, Iop_Or64);
5844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "laog";
5846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LTR(UChar r1, UChar r2)
5850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
5854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(op2));
5855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ltr";
5858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LTGR(UChar r1, UChar r2)
5862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
5866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2));
5867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ltgr";
5870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LTGFR(UChar r1, UChar r2)
5874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
5878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2));
5879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ltgfr";
5882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LT(UChar r1, IRTemp op2addr)
5886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
5890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(op2));
5891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lt";
5894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LTG(UChar r1, IRTemp op2addr)
5898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
5902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2));
5903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ltg";
5906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LTGF(UChar r1, IRTemp op2addr)
5910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
5914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2));
5915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ltgf";
5918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LBR(UChar r1, UChar r2)
5922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_8Sto32, get_gpr_b7(r2)));
5924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lbr";
5926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGBR(UChar r1, UChar r2)
5930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_8Sto64, get_gpr_b7(r2)));
5932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgbr";
5934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LB(UChar r1, IRTemp op2addr)
5938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_8Sto32, load(Ity_I8, mkexpr(op2addr))));
5940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lb";
5942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGB(UChar r1, IRTemp op2addr)
5946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_8Sto64, load(Ity_I8, mkexpr(op2addr))));
5948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgb";
5950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LBH(UChar r1, IRTemp op2addr)
5954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, unop(Iop_8Sto32, load(Ity_I8, mkexpr(op2addr))));
5956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lbh";
5958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LCR(UChar r1, UChar r2)
5962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op1;
5964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op1 = 0;
5968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
5969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkU32((UInt)op1), mkexpr(op2)));
5970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
5971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, mktemp(Ity_I32, mkU32((UInt)
5972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       op1)), op2);
5973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lcr";
5975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LCGR(UChar r1, UChar r2)
5979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op1;
5981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
5983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op1 = 0ULL;
5985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
5986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkU64((ULong)op1), mkexpr(op2)));
5987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
5988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, mktemp(Ity_I64, mkU64((ULong)
5989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       op1)), op2);
5990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lcgr";
5992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
5995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LCGFR(UChar r1, UChar r2)
5996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op1;
5998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op1 = 0ULL;
6002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
6003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkU64((ULong)op1), mkexpr(op2)));
6004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
6005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, mktemp(Ity_I64, mkU64((ULong)
6006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       op1)), op2);
6007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lcgfr";
6009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LHR(UChar r1, UChar r2)
6013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_16Sto32, get_gpr_hw3(r2)));
6015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lhr";
6017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGHR(UChar r1, UChar r2)
6021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_16Sto64, get_gpr_hw3(r2)));
6023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lghr";
6025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LH(UChar r1, IRTemp op2addr)
6029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
6031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lh";
6033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LHY(UChar r1, IRTemp op2addr)
6037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
6039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lhy";
6041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGH(UChar r1, IRTemp op2addr)
6045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_16Sto64, load(Ity_I16, mkexpr(op2addr))));
6047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgh";
6049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LHI(UChar r1, UShort i2)
6053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkU32((UInt)(Int)(Short)i2));
6055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lhi";
6057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGHI(UChar r1, UShort i2)
6061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64((ULong)(Long)(Short)i2));
6063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lghi";
6065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LHRL(UChar r1, UInt i2)
6069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_16Sto32, load(Ity_I16, mkU64(guest_IA_curr_instr +
6071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              ((ULong)(Long)(Int)i2 << 1)))));
6072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lhrl";
6074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGHRL(UChar r1, UInt i2)
6078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_16Sto64, load(Ity_I16, mkU64(guest_IA_curr_instr +
6080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               ((ULong)(Long)(Int)i2 << 1)))));
6081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lghrl";
6083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LHH(UChar r1, IRTemp op2addr)
6087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
6089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lhh";
6091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LFH(UChar r1, IRTemp op2addr)
6095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, load(Ity_I32, mkexpr(op2addr)));
6097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lfh";
6099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGFR(UChar r1, UChar r2)
6103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_32Uto64, get_gpr_w1(r2)));
6105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llgfr";
6107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGF(UChar r1, IRTemp op2addr)
6111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_32Uto64, load(Ity_I32, mkexpr(op2addr))));
6113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llgf";
6115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGFRL(UChar r1, UInt i2)
6119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_32Uto64, load(Ity_I32, mkU64(guest_IA_curr_instr +
6121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               ((ULong)(Long)(Int)i2 << 1)))));
6122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llgfrl";
6124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLCR(UChar r1, UChar r2)
6128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_8Uto32, get_gpr_b7(r2)));
6130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llcr";
6132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGCR(UChar r1, UChar r2)
6136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_8Uto64, get_gpr_b7(r2)));
6138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llgcr";
6140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLC(UChar r1, IRTemp op2addr)
6144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_8Uto32, load(Ity_I8, mkexpr(op2addr))));
6146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llc";
6148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGC(UChar r1, IRTemp op2addr)
6152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_8Uto64, load(Ity_I8, mkexpr(op2addr))));
6154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llgc";
6156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLCH(UChar r1, IRTemp op2addr)
6160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, unop(Iop_8Uto32, load(Ity_I8, mkexpr(op2addr))));
6162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llch";
6164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLHR(UChar r1, UChar r2)
6168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_16Uto32, get_gpr_hw3(r2)));
6170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llhr";
6172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGHR(UChar r1, UChar r2)
6176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_16Uto64, get_gpr_hw3(r2)));
6178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llghr";
6180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLH(UChar r1, IRTemp op2addr)
6184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_16Uto32, load(Ity_I16, mkexpr(op2addr))));
6186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llh";
6188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGH(UChar r1, IRTemp op2addr)
6192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_16Uto64, load(Ity_I16, mkexpr(op2addr))));
6194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llgh";
6196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLHRL(UChar r1, UInt i2)
6200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_16Uto32, load(Ity_I16, mkU64(guest_IA_curr_instr +
6202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              ((ULong)(Long)(Int)i2 << 1)))));
6203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llhrl";
6205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGHRL(UChar r1, UInt i2)
6209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_16Uto64, load(Ity_I16, mkU64(guest_IA_curr_instr +
6211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               ((ULong)(Long)(Int)i2 << 1)))));
6212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llghrl";
6214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLHH(UChar r1, IRTemp op2addr)
6218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, unop(Iop_16Uto32, load(Ity_I16, mkexpr(op2addr))));
6220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llhh";
6222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLIHF(UChar r1, UInt i2)
6226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(((ULong)i2) << 32));
6228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llihf";
6230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLIHH(UChar r1, UShort i2)
6234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(((ULong)i2) << 48));
6236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llihh";
6238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLIHL(UChar r1, UShort i2)
6242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(((ULong)i2) << 32));
6244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llihl";
6246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLILF(UChar r1, UInt i2)
6250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(i2));
6252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llilf";
6254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLILH(UChar r1, UShort i2)
6258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(((ULong)i2) << 16));
6260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llilh";
6262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLILL(UChar r1, UShort i2)
6266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(i2));
6268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llill";
6270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGTR(UChar r1, UChar r2)
6274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_32Uto64, binop(Iop_And32, get_gpr_w1(r2),
6276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkU32(2147483647))));
6277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llgtr";
6279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGT(UChar r1, IRTemp op2addr)
6283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_32Uto64, binop(Iop_And32, load(Ity_I32,
6285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkexpr(op2addr)), mkU32(2147483647))));
6286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llgt";
6288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LNR(UChar r1, UChar r2)
6292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
6295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
6297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, mkite(binop(Iop_CmpLE32S, mkexpr(op2), mkU32(0)), mkexpr(op2),
6298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Sub32, mkU32(0), mkexpr(op2))));
6299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
6300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_BITWISE, result);
6301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lnr";
6303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LNGR(UChar r1, UChar r2)
6307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
6312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, mkite(binop(Iop_CmpLE64S, mkexpr(op2), mkU64(0)), mkexpr(op2),
6313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Sub64, mkU64(0), mkexpr(op2))));
6314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
6315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_BITWISE, result);
6316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lngr";
6318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LNGFR(UChar r1, UChar r2 __attribute__((unused)))
6322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, get_gpr_w1(r1)));
6327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, mkite(binop(Iop_CmpLE64S, mkexpr(op2), mkU64(0)), mkexpr(op2),
6328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Sub64, mkU64(0), mkexpr(op2))));
6329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
6330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_BITWISE, result);
6331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lngfr";
6333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LOCR(UChar m3, UChar r1, UChar r2)
6337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ32, s390_call_calculate_cond(m3), mkU32(0)));
6339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, get_gpr_w1(r2));
6340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "locr";
6342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LOCGR(UChar m3, UChar r1, UChar r2)
6346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ32, s390_call_calculate_cond(m3), mkU32(0)));
6348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, get_gpr_dw0(r2));
6349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "locgr";
6351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LOC(UChar r1, IRTemp op2addr)
6355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* condition is checked in format handler */
6357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, load(Ity_I32, mkexpr(op2addr)));
6358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "loc";
6360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LOCG(UChar r1, IRTemp op2addr)
6364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* condition is checked in format handler */
6366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, load(Ity_I64, mkexpr(op2addr)));
6367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "locg";
6369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LPQ(UChar r1, IRTemp op2addr)
6373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, load(Ity_I64, mkexpr(op2addr)));
6375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1 + 1, load(Ity_I64, binop(Iop_Add64, mkexpr(op2addr), mkU64(8))
6376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               ));
6377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lpq";
6379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LPR(UChar r1, UChar r2)
6383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
6386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
6388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, mkite(binop(Iop_CmpLT32S, mkexpr(op2), mkU32(0)),
6389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Sub32, mkU32(0), mkexpr(op2)), mkexpr(op2)));
6390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
6391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_POSITIVE_32, op2);
6392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lpr";
6394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LPGR(UChar r1, UChar r2)
6398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
6403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, mkite(binop(Iop_CmpLT64S, mkexpr(op2), mkU64(0)),
6404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Sub64, mkU64(0), mkexpr(op2)), mkexpr(op2)));
6405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
6406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_POSITIVE_64, op2);
6407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lpgr";
6409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LPGFR(UChar r1, UChar r2)
6413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
6418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, mkite(binop(Iop_CmpLT64S, mkexpr(op2), mkU64(0)),
6419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Sub64, mkU64(0), mkexpr(op2)), mkexpr(op2)));
6420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
6421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_POSITIVE_64, op2);
6422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lpgfr";
6424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LRVR(UChar r1, UChar r2)
6428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b0 = newTemp(Ity_I8);
6430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b1 = newTemp(Ity_I8);
6431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b2 = newTemp(Ity_I8);
6432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b3 = newTemp(Ity_I8);
6433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b3, get_gpr_b7(r2));
6435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b2, get_gpr_b6(r2));
6436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b1, get_gpr_b5(r2));
6437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b0, get_gpr_b4(r2));
6438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b4(r1, mkexpr(b3));
6439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b5(r1, mkexpr(b2));
6440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b6(r1, mkexpr(b1));
6441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b7(r1, mkexpr(b0));
6442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lrvr";
6444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LRVGR(UChar r1, UChar r2)
6448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b0 = newTemp(Ity_I8);
6450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b1 = newTemp(Ity_I8);
6451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b2 = newTemp(Ity_I8);
6452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b3 = newTemp(Ity_I8);
6453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b4 = newTemp(Ity_I8);
6454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b5 = newTemp(Ity_I8);
6455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b6 = newTemp(Ity_I8);
6456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b7 = newTemp(Ity_I8);
6457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b7, get_gpr_b7(r2));
6459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b6, get_gpr_b6(r2));
6460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b5, get_gpr_b5(r2));
6461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b4, get_gpr_b4(r2));
6462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b3, get_gpr_b3(r2));
6463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b2, get_gpr_b2(r2));
6464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b1, get_gpr_b1(r2));
6465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b0, get_gpr_b0(r2));
6466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b0(r1, mkexpr(b7));
6467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b1(r1, mkexpr(b6));
6468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b2(r1, mkexpr(b5));
6469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b3(r1, mkexpr(b4));
6470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b4(r1, mkexpr(b3));
6471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b5(r1, mkexpr(b2));
6472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b6(r1, mkexpr(b1));
6473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b7(r1, mkexpr(b0));
6474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lrvgr";
6476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LRVH(UChar r1, IRTemp op2addr)
6480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I16);
6482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I16, mkexpr(op2addr)));
6484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b6(r1, unop(Iop_16to8, mkexpr(op2)));
6485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b7(r1, unop(Iop_16HIto8, mkexpr(op2)));
6486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lrvh";
6488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LRV(UChar r1, IRTemp op2addr)
6492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b4(r1, unop(Iop_32to8, binop(Iop_And32, mkexpr(op2), mkU32(255))));
6497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b5(r1, unop(Iop_32to8, binop(Iop_And32, binop(Iop_Shr32, mkexpr(op2),
6498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(8)), mkU32(255))));
6499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b6(r1, unop(Iop_32to8, binop(Iop_And32, binop(Iop_Shr32, mkexpr(op2),
6500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(16)), mkU32(255))));
6501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b7(r1, unop(Iop_32to8, binop(Iop_And32, binop(Iop_Shr32, mkexpr(op2),
6502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(24)), mkU32(255))));
6503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lrv";
6505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LRVG(UChar r1, IRTemp op2addr)
6509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
6513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b0(r1, unop(Iop_64to8, binop(Iop_And64, mkexpr(op2), mkU64(255))));
6514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b1(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
6515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(8)), mkU64(255))));
6516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b2(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
6517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(16)), mkU64(255))));
6518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b3(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
6519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(24)), mkU64(255))));
6520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b4(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
6521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(32)), mkU64(255))));
6522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b5(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
6523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(40)), mkU64(255))));
6524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b6(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
6525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(48)), mkU64(255))));
6526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b7(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
6527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(56)), mkU64(255))));
6528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lrvg";
6530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVHHI(UShort i2, IRTemp op1addr)
6534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkU16(i2));
6536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mvhhi";
6538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVHI(UShort i2, IRTemp op1addr)
6542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkU32((UInt)(Int)(Short)i2));
6544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mvhi";
6546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVGHI(UShort i2, IRTemp op1addr)
6550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkU64((ULong)(Long)(Short)i2));
6552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mvghi";
6554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVI(UChar i2, IRTemp op1addr)
6558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkU8(i2));
6560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mvi";
6562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVIY(UChar i2, IRTemp op1addr)
6566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkU8(i2));
6568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mviy";
6570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MR(UChar r1, UChar r2)
6574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1 + 1));
6580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
6581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mr";
6586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_M(UChar r1, IRTemp op2addr)
6590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1 + 1));
6596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "m";
6602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MFY(UChar r1, IRTemp op2addr)
6606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1 + 1));
6612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mfy";
6618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MH(UChar r1, IRTemp op2addr)
6622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I16);
6625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I16, mkexpr(op2addr)));
6629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), unop(Iop_16Sto32, mkexpr(op2))
6630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ));
6631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mh";
6634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MHY(UChar r1, IRTemp op2addr)
6638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I16);
6641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I16, mkexpr(op2addr)));
6645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), unop(Iop_16Sto32, mkexpr(op2))
6646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ));
6647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mhy";
6650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MHI(UChar r1, UShort i2)
6654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Short op2;
6657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Short)i2;
6661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), unop(Iop_16Sto32,
6662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU16((UShort)op2))));
6663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mhi";
6666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MGHI(UChar r1, UShort i2)
6670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Short op2;
6673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
6674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
6676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Short)i2;
6677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS64, mkexpr(op1), unop(Iop_16Sto64,
6678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU16((UShort)op2))));
6679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mghi";
6682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MLR(UChar r1, UChar r2)
6686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1 + 1));
6692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
6693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullU32, mkexpr(op1), mkexpr(op2)));
6694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mlr";
6698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MLGR(UChar r1, UChar r2)
6702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
6706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1 + 1));
6708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
6709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullU64, mkexpr(op1), mkexpr(op2)));
6710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128HIto64, mkexpr(result)));
6711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1 + 1, unop(Iop_128to64, mkexpr(result)));
6712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mlgr";
6714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ML(UChar r1, IRTemp op2addr)
6718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1 + 1));
6724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullU32, mkexpr(op1), mkexpr(op2)));
6726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ml";
6730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MLG(UChar r1, IRTemp op2addr)
6734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
6738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1 + 1));
6740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
6741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullU64, mkexpr(op1), mkexpr(op2)));
6742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128HIto64, mkexpr(result)));
6743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1 + 1, unop(Iop_128to64, mkexpr(result)));
6744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mlg";
6746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSR(UChar r1, UChar r2)
6750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
6757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msr";
6761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSGR(UChar r1, UChar r2)
6765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
6769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
6771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
6772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS64, mkexpr(op1), mkexpr(op2)));
6773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msgr";
6776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSGFR(UChar r1, UChar r2)
6780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
6784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
6786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
6787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS64, mkexpr(op1), unop(Iop_32Sto64, mkexpr(op2))
6788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ));
6789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msgfr";
6792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MS(UChar r1, IRTemp op2addr)
6796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ms";
6807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSY(UChar r1, IRTemp op2addr)
6811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msy";
6822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSG(UChar r1, IRTemp op2addr)
6826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
6830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
6832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
6833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS64, mkexpr(op1), mkexpr(op2)));
6834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msg";
6837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSGF(UChar r1, IRTemp op2addr)
6841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
6845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
6847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS64, mkexpr(op1), unop(Iop_32Sto64, mkexpr(op2))
6849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ));
6850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msgf";
6853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSFI(UChar r1, UInt i2)
6857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
6860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)i2;
6864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), mkU32((UInt)op2)));
6865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msfi";
6868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSGFI(UChar r1, UInt i2)
6872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
6875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
6876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
6878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)i2;
6879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS64, mkexpr(op1), unop(Iop_32Sto64, mkU32((UInt)
6880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          op2))));
6881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msgfi";
6884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OR(UChar r1, UChar r2)
6888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
6892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
6895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or32, mkexpr(op1), mkexpr(op2)));
6896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
6898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "or";
6900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OGR(UChar r1, UChar r2)
6904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
6910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
6911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or64, mkexpr(op1), mkexpr(op2)));
6912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
6914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ogr";
6916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ORK(UChar r3, UChar r1, UChar r2)
6920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
6923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
6924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
6926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
6927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or32, mkexpr(op2), mkexpr(op3)));
6928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
6930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ork";
6932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OGRK(UChar r3, UChar r1, UChar r2)
6936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
6939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
6942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
6943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or64, mkexpr(op2), mkexpr(op3)));
6944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
6946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ogrk";
6948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_O(UChar r1, IRTemp op2addr)
6952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
6956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or32, mkexpr(op1), mkexpr(op2)));
6960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
6962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "o";
6964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OY(UChar r1, IRTemp op2addr)
6968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
6972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or32, mkexpr(op1), mkexpr(op2)));
6976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
6978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oy";
6980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OG(UChar r1, IRTemp op2addr)
6984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
6990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
6991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or64, mkexpr(op1), mkexpr(op2)));
6992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
6994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "og";
6996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
6999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OI(UChar i2, IRTemp op1addr)
7000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I8);
7002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar op2;
7003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I8);
7004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I8, mkexpr(op1addr)));
7006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
7007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or8, mkexpr(op1), mkU8(op2)));
7008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
7009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
7010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oi";
7012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OIY(UChar i2, IRTemp op1addr)
7016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I8);
7018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar op2;
7019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I8);
7020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I8, mkexpr(op1addr)));
7022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
7023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or8, mkexpr(op1), mkU8(op2)));
7024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
7025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
7026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oiy";
7028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OIHF(UChar r1, UInt i2)
7032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
7034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
7035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
7038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
7039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or32, mkexpr(op1), mkU32(op2)));
7040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
7041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
7042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oihf";
7044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OIHH(UChar r1, UShort i2)
7048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
7050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
7051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I16);
7052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_hw0(r1));
7054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
7055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or16, mkexpr(op1), mkU16(op2)));
7056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
7057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw0(r1, mkexpr(result));
7058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oihh";
7060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OIHL(UChar r1, UShort i2)
7064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
7066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
7067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I16);
7068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_hw1(r1));
7070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
7071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or16, mkexpr(op1), mkU16(op2)));
7072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
7073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw1(r1, mkexpr(result));
7074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oihl";
7076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OILF(UChar r1, UInt i2)
7080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
7082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
7083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
7086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
7087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or32, mkexpr(op1), mkU32(op2)));
7088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
7089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oilf";
7092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OILH(UChar r1, UShort i2)
7096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
7098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
7099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I16);
7100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_hw2(r1));
7102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
7103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or16, mkexpr(op1), mkU16(op2)));
7104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
7105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw2(r1, mkexpr(result));
7106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oilh";
7108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OILL(UChar r1, UShort i2)
7112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
7114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
7115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I16);
7116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_hw3(r1));
7118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
7119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or16, mkexpr(op1), mkU16(op2)));
7120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
7121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw3(r1, mkexpr(result));
7122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oill";
7124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_PFD(void)
7128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "pfd";
7131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_PFDRL(void)
7135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "pfdrl";
7138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr *
7141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovget_rounding_mode_from_gr0(void)
7142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
7143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rm_bits = newTemp(Ity_I32);
7144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr *s390rm;
7145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr *irrm;
7146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_pfpo);
7148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* The dfp/bfp rounding mode is stored in bits [60:63] of GR 0
7149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      when PFPO insn is called. So, extract the bits at [60:63] */
7150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(rm_bits, binop(Iop_And32, get_gpr_w1(0), mkU32(0xf)));
7151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390rm = mkexpr(rm_bits);
7152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   irrm = mkite(binop(Iop_CmpEQ32, s390rm, mkU32(0x1)),
7153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            mkexpr(encode_bfp_rounding_mode( S390_BFP_ROUND_PER_FPC)),
7154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            mkite(binop(Iop_CmpEQ32, s390rm, mkU32(0x8)),
7155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              mkexpr(encode_dfp_rounding_mode(S390_DFP_ROUND_NEAREST_EVEN_8)),
7156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              mkite(binop(Iop_CmpEQ32, s390rm, mkU32(0x9)),
7157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                mkexpr(encode_dfp_rounding_mode(S390_DFP_ROUND_ZERO_9)),
7158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                mkite(binop(Iop_CmpEQ32, s390rm, mkU32(0xa)),
7159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  mkexpr(encode_dfp_rounding_mode(S390_DFP_ROUND_POSINF_10)),
7160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  mkite(binop(Iop_CmpEQ32, s390rm, mkU32(0xb)),
7161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    mkexpr(encode_dfp_rounding_mode(S390_DFP_ROUND_NEGINF_11)),
7162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    mkite(binop(Iop_CmpEQ32, s390rm, mkU32(0xc)),
7163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      mkexpr(encode_dfp_rounding_mode(
7164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               S390_DFP_ROUND_NEAREST_TIE_AWAY_0_12)),
7165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      mkite(binop(Iop_CmpEQ32, s390rm, mkU32(0xd)),
7166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(encode_dfp_rounding_mode(
7167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 S390_DFP_ROUND_NEAREST_TIE_TOWARD_0)),
7168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkite(binop(Iop_CmpEQ32, s390rm, mkU32(0xe)),
7169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          mkexpr(encode_dfp_rounding_mode(
7170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   S390_DFP_ROUND_AWAY_0)),
7171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          mkite(binop(Iop_CmpEQ32, s390rm, mkU32(0xf)),
7172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            mkexpr(encode_dfp_rounding_mode(
7173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     S390_DFP_ROUND_PREPARE_SHORT_15)),
7174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                /* if rounding mode is 0 or invalid (2-7)
7175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   set S390_DFP_ROUND_PER_FPC_0 */
7176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            mkexpr(encode_dfp_rounding_mode(
7177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     S390_DFP_ROUND_PER_FPC_0)))))))))));
7178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return irrm;
7180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
7181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr *
7183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_call_pfpo_helper(IRExpr *gr0)
7184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
7185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr **args, *call;
7186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   args = mkIRExprVec_1(gr0);
7188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   call = mkIRExprCCall(Ity_I32, 0 /*regparm*/,
7189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        "s390_do_pfpo", &s390_do_pfpo, args);
7190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Nothing is excluded from definedness checking. */
7191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   call->Iex.CCall.cee->mcx_mask = 0;
7192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return call;
7194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
7195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_PFPO(void)
7198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
7199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp gr0 = newTemp(Ity_I32);     /* word 1 [32:63] of GR 0 */
7200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp test_bit = newTemp(Ity_I32); /* bit 32 of GR 0 - test validity */
7201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp fn = newTemp(Ity_I32);       /* [33:55] of GR 0 - function code */
7202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp ef = newTemp(Ity_I32);       /* Emulation Failure */
7203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src1 = newTemp(Ity_F32);
7204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst1 = newTemp(Ity_D32);
7205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src2 = newTemp(Ity_F32);
7206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst2 = newTemp(Ity_D64);
7207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src3 = newTemp(Ity_F32);
7208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst3 = newTemp(Ity_D128);
7209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src4 = newTemp(Ity_F64);
7210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst4 = newTemp(Ity_D32);
7211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src5 = newTemp(Ity_F64);
7212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst5 = newTemp(Ity_D64);
7213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src6 = newTemp(Ity_F64);
7214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst6 = newTemp(Ity_D128);
7215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src7 = newTemp(Ity_F128);
7216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst7 = newTemp(Ity_D32);
7217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src8 = newTemp(Ity_F128);
7218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst8 = newTemp(Ity_D64);
7219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src9 = newTemp(Ity_F128);
7220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst9 = newTemp(Ity_D128);
7221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src10 = newTemp(Ity_D32);
7222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst10 = newTemp(Ity_F32);
7223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src11 = newTemp(Ity_D32);
7224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst11 = newTemp(Ity_F64);
7225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src12 = newTemp(Ity_D32);
7226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst12 = newTemp(Ity_F128);
7227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src13 = newTemp(Ity_D64);
7228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst13 = newTemp(Ity_F32);
7229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src14 = newTemp(Ity_D64);
7230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst14 = newTemp(Ity_F64);
7231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src15 = newTemp(Ity_D64);
7232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst15 = newTemp(Ity_F128);
7233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src16 = newTemp(Ity_D128);
7234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst16 = newTemp(Ity_F32);
7235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src17 = newTemp(Ity_D128);
7236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst17 = newTemp(Ity_F64);
7237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp src18 = newTemp(Ity_D128);
7238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp dst18 = newTemp(Ity_F128);
7239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr *irrm;
7240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_pfpo);
7242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(gr0, get_gpr_w1(0));
7244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* get function code */
7245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(fn, binop(Iop_And32, binop(Iop_Shr32, mkexpr(gr0), mkU8(8)),
7246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    mkU32(0x7fffff)));
7247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* get validity test bit */
7248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(test_bit, binop(Iop_And32, binop(Iop_Shr32, mkexpr(gr0), mkU8(31)),
7249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          mkU32(0x1)));
7250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   irrm = get_rounding_mode_from_gr0();
7251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* test_bit is 1 */
7253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src1, get_fpr_w0(4)); /* get source from FPR 4,6 */
7254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_PFPO_64, src1, gr0);
7255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Return code set in GR1 is usually 0. Non-zero value is set only
7257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      when exceptions are raised. See Programming Notes point 5 in the
7258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      instrcution description of pfpo in POP. Since valgrind does not
7259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      model exception, it might be safe to just set 0 to GR 1. */
7260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(test_bit), mkU32(0x1)));
7262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Check validity of function code in GR 0 */
7264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(ef, s390_call_pfpo_helper(unop(Iop_32Uto64, mkexpr(gr0))));
7265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* fixs390: Function emulation_failure can be used if it takes argument as
7267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRExpr * instead of VexEmNote. */
7268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_EMNOTE), mkexpr(ef)));
7269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   dis_res->whatNext = Dis_StopHere;
7270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   dis_res->jk_StopHere = Ijk_EmFail;
7271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   stmt(
7273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        IRStmt_Exit(
7274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    binop(Iop_CmpNE32, mkexpr(ef), mkU32(EmNote_NONE)),
7275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    Ijk_EmFail,
7276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    IRConst_U64(guest_IA_next_instr),
7277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    S390X_GUEST_OFFSET(guest_IA)
7278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    )
7279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        );
7280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* F32 -> D32 */
7282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* get source from FPR 4,6 - already set in src1 */
7283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst1, binop(Iop_F32toD32, irrm, mkexpr(src1)));
7284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_w0(0, mkexpr(dst1)); /* put the result in FPR 0,2 */
7285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_PFPO_32, src1, gr0);
7287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_F32_TO_D32)));
7288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* F32 -> D64 */
7290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src2, get_fpr_w0(4)); /* get source from FPR 4,6 */
7291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst2, binop(Iop_F32toD64, irrm, mkexpr(src2)));
7292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(0, mkexpr(dst2)); /* put the result in FPR 0,2 */
7293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_PFPO_32, src2, gr0);
7295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_F32_TO_D64)));
7296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* F32 -> D128 */
7298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src3, get_fpr_w0(4)); /* get source from FPR 4,6 */
7299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst3, binop(Iop_F32toD128, irrm, mkexpr(src3)));
7300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_pair(0, mkexpr(dst3)); /* put the result in FPR 0,2 */
7301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_PFPO_32, src3, gr0);
7303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_F32_TO_D128)));
7304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* F64 -> D32 */
7306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src4, get_fpr_dw0(4)); /* get source from FPR 4,6 */
7307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst4, binop(Iop_F64toD32, irrm, mkexpr(src4)));
7308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_w0(0, mkexpr(dst4)); /* put the result in FPR 0,2 */
7309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_PFPO_64, src4, gr0);
7311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_F64_TO_D32)));
7312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* F64 -> D64 */
7314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src5, get_fpr_dw0(4)); /* get source from FPR 4,6 */
7315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst5, binop(Iop_F64toD64, irrm, mkexpr(src5)));
7316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(0, mkexpr(dst5)); /* put the result in FPR 0,2 */
7317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_PFPO_64, src5, gr0);
7319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_F64_TO_D64)));
7320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* F64 -> D128 */
7322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src6, get_fpr_dw0(4)); /* get source from FPR 4,6 */
7323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst6, binop(Iop_F64toD128, irrm, mkexpr(src6)));
7324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_pair(0, mkexpr(dst6)); /* put the result in FPR 0,2 */
7325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_PFPO_64, src6, gr0);
7327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_F64_TO_D128)));
7328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* F128 -> D32 */
7330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src7, get_fpr_pair(4)); /* get source from FPR 4,6 */
7331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst7, binop(Iop_F128toD32, irrm, mkexpr(src7)));
7332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_w0(0, mkexpr(dst7)); /* put the result in FPR 0,2 */
7333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1f128Z(S390_CC_OP_PFPO_128, src7, gr0);
7335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_F128_TO_D32)));
7336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* F128 -> D64 */
7338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src8, get_fpr_pair(4)); /* get source from FPR 4,6 */
7339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst8, binop(Iop_F128toD64, irrm, mkexpr(src8)));
7340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(0, mkexpr(dst8)); /* put the result in FPR 0,2 */
7341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1f128Z(S390_CC_OP_PFPO_128, src8, gr0);
7343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_F128_TO_D64)));
7344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* F128 -> D128 */
7346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src9, get_fpr_pair(4)); /* get source from FPR 4,6 */
7347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst9, binop(Iop_F128toD128, irrm, mkexpr(src9)));
7348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_pair(0, mkexpr(dst9)); /* put the result in FPR 0,2 */
7349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1f128Z(S390_CC_OP_PFPO_128, src9, gr0);
7351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_F128_TO_D128)));
7352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* D32 -> F32 */
7354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src10, get_dpr_w0(4)); /* get source from FPR 4,6 */
7355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst10, binop(Iop_D32toF32, irrm, mkexpr(src10)));
7356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_w0(0, mkexpr(dst10)); /* put the result in FPR 0,2 */
7357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_PFPO_32, src10, gr0);
7359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_D32_TO_F32)));
7360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* D32 -> F64 */
7362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src11, get_dpr_w0(4)); /* get source from FPR 4,6 */
7363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst11, binop(Iop_D32toF64, irrm, mkexpr(src11)));
7364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_dw0(0, mkexpr(dst11)); /* put the result in FPR 0,2 */
7365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_PFPO_32, src11, gr0);
7367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_D32_TO_F64)));
7368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* D32 -> F128 */
7370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src12, get_dpr_w0(4)); /* get source from FPR 4,6 */
7371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst12, binop(Iop_D32toF128, irrm, mkexpr(src12)));
7372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_pair(0, mkexpr(dst12)); /* put the result in FPR 0,2 */
7373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_PFPO_32, src12, gr0);
7375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_D32_TO_F128)));
7376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* D64 -> F32 */
7378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src13, get_dpr_dw0(4)); /* get source from FPR 4,6 */
7379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst13, binop(Iop_D64toF32, irrm, mkexpr(src13)));
7380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_w0(0, mkexpr(dst13)); /* put the result in FPR 0,2 */
7381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_PFPO_64, src13, gr0);
7383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_D64_TO_F32)));
7384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* D64 -> F64 */
7386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src14, get_dpr_dw0(4)); /* get source from FPR 4,6 */
7387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst14, binop(Iop_D64toF64, irrm, mkexpr(src14)));
7388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_dw0(0, mkexpr(dst14)); /* put the result in FPR 0,2 */
7389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_PFPO_64, src14, gr0);
7391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_D64_TO_F64)));
7392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* D64 -> F128 */
7394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src15, get_dpr_dw0(4)); /* get source from FPR 4,6 */
7395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst15, binop(Iop_D64toF128, irrm, mkexpr(src15)));
7396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_pair(0, mkexpr(dst15)); /* put the result in FPR 0,2 */
7397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_PFPO_64, src15, gr0);
7399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_D64_TO_F128)));
7400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* D128 -> F32 */
7402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src16, get_dpr_pair(4)); /* get source from FPR 4,6 */
7403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst16, binop(Iop_D128toF32, irrm, mkexpr(src16)));
7404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_w0(0, mkexpr(dst16)); /* put the result in FPR 0,2 */
7405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1d128Z(S390_CC_OP_PFPO_128, src16, gr0);
7407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_D128_TO_F32)));
7408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* D128 -> F64 */
7410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src17, get_dpr_pair(4)); /* get source from FPR 4,6 */
7411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst17, binop(Iop_D128toF64, irrm, mkexpr(src17)));
7412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_dw0(0, mkexpr(dst17)); /* put the result in FPR 0,2 */
7413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1d128Z(S390_CC_OP_PFPO_128, src17, gr0);
7415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_D128_TO_F64)));
7416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* D128 -> F128 */
7418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(src18, get_dpr_pair(4)); /* get source from FPR 4,6 */
7419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(dst18, binop(Iop_D128toF128, irrm, mkexpr(src18)));
7420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_pair(0, mkexpr(dst18)); /* put the result in FPR 0,2 */
7421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_w1(1, mkU32(0x0));
7422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1d128Z(S390_CC_OP_PFPO_128, src18, gr0);
7423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   next_insn_if(binop(Iop_CmpEQ32, mkexpr(fn), mkU32(S390_PFPO_D128_TO_F128)));
7424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "pfpo";
7426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
7427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_RLL(UChar r1, UChar r3, IRTemp op2addr)
7430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp amount = newTemp(Ity_I64);
7432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I32);
7433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(amount, binop(Iop_And64, mkexpr(op2addr), mkU64(31)));
7435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_w1(r3));
7436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Or32, binop(Iop_Shl32, mkexpr(op), unop(Iop_64to8,
7437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkexpr(amount))), binop(Iop_Shr32, mkexpr(op), unop(Iop_64to8,
7438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              binop(Iop_Sub64, mkU64(32), mkexpr(amount))))));
7439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "rll";
7441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_RLLG(UChar r1, UChar r3, IRTemp op2addr)
7445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp amount = newTemp(Ity_I64);
7447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I64);
7448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(amount, binop(Iop_And64, mkexpr(op2addr), mkU64(63)));
7450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_dw0(r3));
7451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Or64, binop(Iop_Shl64, mkexpr(op), unop(Iop_64to8,
7452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkexpr(amount))), binop(Iop_Shr64, mkexpr(op), unop(Iop_64to8,
7453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               binop(Iop_Sub64, mkU64(64), mkexpr(amount))))));
7454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "rllg";
7456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_RNSBG(UChar r1, UChar r2, UChar i3, UChar i4, UChar i5)
7460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar from;
7462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar to;
7463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar rot;
7464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar t_bit;
7465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong mask;
7466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong maskc;
7467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
7469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   from = i3 & 63;
7471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   to = i4 & 63;
7472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   rot = i5 & 63;
7473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   t_bit = i3 & 128;
7474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, rot == 0 ? get_gpr_dw0(r2) : binop(Iop_Or64, binop(Iop_Shl64,
7475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          get_gpr_dw0(r2), mkU8(rot)), binop(Iop_Shr64, get_gpr_dw0(r2),
7476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(64 - rot))));
7477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (from <= to) {
7478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = ~0ULL;
7479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = (mask >> from) & (mask << (63 - to));
7480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = ~mask;
7481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
7482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = ~0ULL;
7483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = (maskc >> (to + 1)) & (maskc << (64 - from));
7484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = ~maskc;
7485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And64, binop(Iop_And64, get_gpr_dw0(r1), mkexpr(op2)
7487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ), mkU64(mask)));
7488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (t_bit == 0) {
7489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_dw0(r1, binop(Iop_Or64, binop(Iop_And64, get_gpr_dw0(r1),
7490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  mkU64(maskc)), mkexpr(result)));
7491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
7493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "rnsbg";
7495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_RXSBG(UChar r1, UChar r2, UChar i3, UChar i4, UChar i5)
7499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar from;
7501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar to;
7502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar rot;
7503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar t_bit;
7504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong mask;
7505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong maskc;
7506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
7508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   from = i3 & 63;
7510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   to = i4 & 63;
7511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   rot = i5 & 63;
7512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   t_bit = i3 & 128;
7513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, rot == 0 ? get_gpr_dw0(r2) : binop(Iop_Or64, binop(Iop_Shl64,
7514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          get_gpr_dw0(r2), mkU8(rot)), binop(Iop_Shr64, get_gpr_dw0(r2),
7515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(64 - rot))));
7516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (from <= to) {
7517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = ~0ULL;
7518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = (mask >> from) & (mask << (63 - to));
7519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = ~mask;
7520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
7521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = ~0ULL;
7522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = (maskc >> (to + 1)) & (maskc << (64 - from));
7523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = ~maskc;
7524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And64, binop(Iop_Xor64, get_gpr_dw0(r1), mkexpr(op2)
7526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ), mkU64(mask)));
7527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (t_bit == 0) {
7528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_dw0(r1, binop(Iop_Or64, binop(Iop_And64, get_gpr_dw0(r1),
7529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  mkU64(maskc)), mkexpr(result)));
7530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
7532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "rxsbg";
7534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ROSBG(UChar r1, UChar r2, UChar i3, UChar i4, UChar i5)
7538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar from;
7540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar to;
7541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar rot;
7542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar t_bit;
7543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong mask;
7544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong maskc;
7545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
7547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   from = i3 & 63;
7549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   to = i4 & 63;
7550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   rot = i5 & 63;
7551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   t_bit = i3 & 128;
7552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, rot == 0 ? get_gpr_dw0(r2) : binop(Iop_Or64, binop(Iop_Shl64,
7553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          get_gpr_dw0(r2), mkU8(rot)), binop(Iop_Shr64, get_gpr_dw0(r2),
7554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(64 - rot))));
7555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (from <= to) {
7556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = ~0ULL;
7557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = (mask >> from) & (mask << (63 - to));
7558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = ~mask;
7559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
7560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = ~0ULL;
7561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = (maskc >> (to + 1)) & (maskc << (64 - from));
7562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = ~maskc;
7563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And64, binop(Iop_Or64, get_gpr_dw0(r1), mkexpr(op2)
7565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ), mkU64(mask)));
7566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (t_bit == 0) {
7567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_dw0(r1, binop(Iop_Or64, binop(Iop_And64, get_gpr_dw0(r1),
7568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  mkU64(maskc)), mkexpr(result)));
7569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
7571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "rosbg";
7573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_RISBG(UChar r1, UChar r2, UChar i3, UChar i4, UChar i5)
7577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar from;
7579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar to;
7580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar rot;
7581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar z_bit;
7582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong mask;
7583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong maskc;
7584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
7585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   from = i3 & 63;
7588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   to = i4 & 63;
7589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   rot = i5 & 63;
7590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   z_bit = i4 & 128;
7591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, rot == 0 ? get_gpr_dw0(r2) : binop(Iop_Or64, binop(Iop_Shl64,
7592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          get_gpr_dw0(r2), mkU8(rot)), binop(Iop_Shr64, get_gpr_dw0(r2),
7593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(64 - rot))));
7594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (from <= to) {
7595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = ~0ULL;
7596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = (mask >> from) & (mask << (63 - to));
7597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = ~mask;
7598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
7599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = ~0ULL;
7600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = (maskc >> (to + 1)) & (maskc << (64 - from));
7601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = ~maskc;
7602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (z_bit == 0) {
7604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_dw0(r1, binop(Iop_Or64, binop(Iop_And64, get_gpr_dw0(r1),
7605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  mkU64(maskc)), binop(Iop_And64, mkexpr(op2), mkU64(mask))));
7606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
7607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_dw0(r1, binop(Iop_And64, mkexpr(op2), mkU64(mask)));
7608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, get_gpr_dw0(r1));
7610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, result);
7611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "risbg";
7613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SAR(UChar r1, UChar r2)
7617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_ar_w0(r1, get_gpr_w1(r2));
7619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
7620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, AR, GPR), "sar", r1, r2);
7621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sar";
7623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLDA(UChar r1, IRTemp op2addr)
7627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp p1 = newTemp(Ity_I64);
7629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp p2 = newTemp(Ity_I64);
7630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I64);
7631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ULong sign_mask;
7633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp shift_amount = newTemp(Ity_I64);
7634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(p1, unop(Iop_32Uto64, get_gpr_w1(r1)));
7636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(p2, unop(Iop_32Uto64, get_gpr_w1(r1 + 1)));
7637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, binop(Iop_Or64, binop(Iop_Shl64, mkexpr(p1), mkU8(32)), mkexpr(p2)
7638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ));
7639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   sign_mask = 1ULL << 63;
7640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(shift_amount, binop(Iop_And64, mkexpr(op2addr), mkU64(63)));
7641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or64, binop(Iop_And64, binop(Iop_Shl64, mkexpr(op),
7642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          unop(Iop_64to8, mkexpr(shift_amount))), mkU64(~sign_mask)),
7643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          binop(Iop_And64, mkexpr(op), mkU64(sign_mask))));
7644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
7645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
7646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_SHIFT_LEFT_64, op, shift_amount);
7647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slda";
7649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLDL(UChar r1, IRTemp op2addr)
7653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp p1 = newTemp(Ity_I64);
7655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp p2 = newTemp(Ity_I64);
7656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(p1, unop(Iop_32Uto64, get_gpr_w1(r1)));
7659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(p2, unop(Iop_32Uto64, get_gpr_w1(r1 + 1)));
7660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Shl64, binop(Iop_Or64, binop(Iop_Shl64, mkexpr(p1),
7661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(32)), mkexpr(p2)), unop(Iop_64to8, binop(Iop_And64,
7662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2addr), mkU64(63)))));
7663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
7664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
7665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sldl";
7667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLA(UChar r1, IRTemp op2addr)
7671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp uop = newTemp(Ity_I32);
7673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt sign_mask;
7675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp shift_amount = newTemp(Ity_I64);
7676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I32);
7677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_w1(r1));
7679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(uop, get_gpr_w1(r1));
7680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   sign_mask = 2147483648U;
7681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(shift_amount, binop(Iop_And64, mkexpr(op2addr), mkU64(63)));
7682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or32, binop(Iop_And32, binop(Iop_Shl32, mkexpr(uop),
7683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          unop(Iop_64to8, mkexpr(shift_amount))), mkU32(~sign_mask)),
7684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_And32, mkexpr(uop), mkU32(sign_mask))));
7685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_SHIFT_LEFT_32, op, shift_amount);
7687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sla";
7689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLAK(UChar r1, UChar r3, IRTemp op2addr)
7693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp uop = newTemp(Ity_I32);
7695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt sign_mask;
7697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp shift_amount = newTemp(Ity_I64);
7698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I32);
7699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_w1(r3));
7701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(uop, get_gpr_w1(r3));
7702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   sign_mask = 2147483648U;
7703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(shift_amount, binop(Iop_And64, mkexpr(op2addr), mkU64(63)));
7704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or32, binop(Iop_And32, binop(Iop_Shl32, mkexpr(uop),
7705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          unop(Iop_64to8, mkexpr(shift_amount))), mkU32(~sign_mask)),
7706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_And32, mkexpr(uop), mkU32(sign_mask))));
7707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_SHIFT_LEFT_32, op, shift_amount);
7709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slak";
7711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLAG(UChar r1, UChar r3, IRTemp op2addr)
7715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp uop = newTemp(Ity_I64);
7717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong sign_mask;
7719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp shift_amount = newTemp(Ity_I64);
7720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I64);
7721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_dw0(r3));
7723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(uop, get_gpr_dw0(r3));
7724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   sign_mask = 9223372036854775808ULL;
7725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(shift_amount, binop(Iop_And64, mkexpr(op2addr), mkU64(63)));
7726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or64, binop(Iop_And64, binop(Iop_Shl64, mkexpr(uop),
7727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          unop(Iop_64to8, mkexpr(shift_amount))), mkU64(~sign_mask)),
7728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_And64, mkexpr(uop), mkU64(sign_mask))));
7729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
7730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_SHIFT_LEFT_64, op, shift_amount);
7731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slag";
7733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLL(UChar r1, IRTemp op2addr)
7737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Shl32, get_gpr_w1(r1), unop(Iop_64to8,
7739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              binop(Iop_And64, mkexpr(op2addr), mkU64(63)))));
7740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sll";
7742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLLK(UChar r1, UChar r3, IRTemp op2addr)
7746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Shl32, get_gpr_w1(r3), unop(Iop_64to8,
7748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              binop(Iop_And64, mkexpr(op2addr), mkU64(63)))));
7749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sllk";
7751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLLG(UChar r1, UChar r3, IRTemp op2addr)
7755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Shl64, get_gpr_dw0(r3), unop(Iop_64to8,
7757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               binop(Iop_And64, mkexpr(op2addr), mkU64(63)))));
7758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sllg";
7760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRDA(UChar r1, IRTemp op2addr)
7764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp p1 = newTemp(Ity_I64);
7766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp p2 = newTemp(Ity_I64);
7767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(p1, unop(Iop_32Uto64, get_gpr_w1(r1)));
7770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(p2, unop(Iop_32Uto64, get_gpr_w1(r1 + 1)));
7771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sar64, binop(Iop_Or64, binop(Iop_Shl64, mkexpr(p1),
7772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(32)), mkexpr(p2)), unop(Iop_64to8, binop(Iop_And64,
7773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2addr), mkU64(63)))));
7774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
7775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
7776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, result);
7777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srda";
7779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRDL(UChar r1, IRTemp op2addr)
7783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp p1 = newTemp(Ity_I64);
7785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp p2 = newTemp(Ity_I64);
7786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(p1, unop(Iop_32Uto64, get_gpr_w1(r1)));
7789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(p2, unop(Iop_32Uto64, get_gpr_w1(r1 + 1)));
7790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Shr64, binop(Iop_Or64, binop(Iop_Shl64, mkexpr(p1),
7791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(32)), mkexpr(p2)), unop(Iop_64to8, binop(Iop_And64,
7792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2addr), mkU64(63)))));
7793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
7794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
7795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srdl";
7797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRA(UChar r1, IRTemp op2addr)
7801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I32);
7804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_w1(r1));
7806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sar32, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
7807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2addr), mkU64(63)))));
7808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, result);
7810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sra";
7812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRAK(UChar r1, UChar r3, IRTemp op2addr)
7816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I32);
7819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_w1(r3));
7821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sar32, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
7822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2addr), mkU64(63)))));
7823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, result);
7825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srak";
7827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRAG(UChar r1, UChar r3, IRTemp op2addr)
7831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I64);
7834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_dw0(r3));
7836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sar64, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
7837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2addr), mkU64(63)))));
7838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
7839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, result);
7840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srag";
7842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRL(UChar r1, IRTemp op2addr)
7846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I32);
7848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_w1(r1));
7850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Shr32, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
7851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkexpr(op2addr), mkU64(63)))));
7852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srl";
7854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRLK(UChar r1, UChar r3, IRTemp op2addr)
7858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I32);
7860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_w1(r3));
7862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Shr32, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
7863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkexpr(op2addr), mkU64(63)))));
7864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srlk";
7866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRLG(UChar r1, UChar r3, IRTemp op2addr)
7870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I64);
7872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_dw0(r3));
7874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Shr64, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
7875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkexpr(op2addr), mkU64(63)))));
7876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srlg";
7878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ST(UChar r1, IRTemp op2addr)
7882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_w1(r1));
7884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "st";
7886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STY(UChar r1, IRTemp op2addr)
7890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_w1(r1));
7892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sty";
7894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STG(UChar r1, IRTemp op2addr)
7898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_dw0(r1));
7900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stg";
7902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STRL(UChar r1, UInt i2)
7906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1)),
7908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         get_gpr_w1(r1));
7909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "strl";
7911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STGRL(UChar r1, UInt i2)
7915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1)),
7917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         get_gpr_dw0(r1));
7918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stgrl";
7920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STC(UChar r1, IRTemp op2addr)
7924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_b7(r1));
7926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stc";
7928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STCY(UChar r1, IRTemp op2addr)
7932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_b7(r1));
7934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stcy";
7936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STCH(UChar r1, IRTemp op2addr)
7940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_b3(r1));
7942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stch";
7944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STCM(UChar r1, UChar r3, IRTemp op2addr)
7948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar mask;
7950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
7951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = (UChar)r3;
7953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
7954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 8) != 0) {
7955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(op2addr), get_gpr_b4(r1));
7956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
7957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 4) != 0) {
7959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b5(r1));
7960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
7961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 2) != 0) {
7963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b6(r1));
7964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
7965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 1) != 0) {
7967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b7(r1));
7968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stcm";
7971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
7974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STCMY(UChar r1, UChar r3, IRTemp op2addr)
7975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar mask;
7977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
7978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = (UChar)r3;
7980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
7981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 8) != 0) {
7982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(op2addr), get_gpr_b4(r1));
7983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
7984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 4) != 0) {
7986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b5(r1));
7987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
7988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 2) != 0) {
7990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b6(r1));
7991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
7992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 1) != 0) {
7994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b7(r1));
7995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stcmy";
7998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STCMH(UChar r1, UChar r3, IRTemp op2addr)
8002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar mask;
8004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
8005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = (UChar)r3;
8007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
8008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 8) != 0) {
8009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(op2addr), get_gpr_b0(r1));
8010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
8011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
8012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 4) != 0) {
8013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b1(r1));
8014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
8015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
8016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 2) != 0) {
8017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b2(r1));
8018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
8019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
8020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 1) != 0) {
8021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b3(r1));
8022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
8023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stcmh";
8025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STH(UChar r1, IRTemp op2addr)
8029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_hw3(r1));
8031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sth";
8033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STHY(UChar r1, IRTemp op2addr)
8037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_hw3(r1));
8039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sthy";
8041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STHRL(UChar r1, UInt i2)
8045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1)),
8047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         get_gpr_hw3(r1));
8048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sthrl";
8050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STHH(UChar r1, IRTemp op2addr)
8054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_hw1(r1));
8056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sthh";
8058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STFH(UChar r1, IRTemp op2addr)
8062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_w0(r1));
8064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stfh";
8066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STOC(UChar r1, IRTemp op2addr)
8070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* condition is checked in format handler */
8072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_w1(r1));
8073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stoc";
8075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STOCG(UChar r1, IRTemp op2addr)
8079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* condition is checked in format handler */
8081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_dw0(r1));
8082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stocg";
8084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STPQ(UChar r1, IRTemp op2addr)
8088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_dw0(r1));
8090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(8)), get_gpr_dw0(r1 + 1));
8091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stpq";
8093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STRVH(UChar r1, IRTemp op2addr)
8097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_b7(r1));
8099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(1)), get_gpr_b6(r1));
8100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "strvh";
8102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STRV(UChar r1, IRTemp op2addr)
8106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_b7(r1));
8108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(1)), get_gpr_b6(r1));
8109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(2)), get_gpr_b5(r1));
8110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(3)), get_gpr_b4(r1));
8111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "strv";
8113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STRVG(UChar r1, IRTemp op2addr)
8117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_b7(r1));
8119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(1)), get_gpr_b6(r1));
8120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(2)), get_gpr_b5(r1));
8121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(3)), get_gpr_b4(r1));
8122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(4)), get_gpr_b3(r1));
8123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(5)), get_gpr_b2(r1));
8124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(6)), get_gpr_b1(r1));
8125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(7)), get_gpr_b0(r1));
8126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "strvg";
8128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SR(UChar r1, UChar r2)
8132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
8134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
8138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
8139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
8140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op1, op2);
8141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
8142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sr";
8144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SGR(UChar r1, UChar r2)
8148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
8150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
8151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
8152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
8154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
8155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
8156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, op1, op2);
8157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
8158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sgr";
8160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SGFR(UChar r1, UChar r2)
8164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
8166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
8167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
8168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
8170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
8171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
8172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, op1, op2);
8173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
8174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sgfr";
8176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRK(UChar r3, UChar r1, UChar r2)
8180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
8183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
8186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
8187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
8188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op2, op3);
8189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
8190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srk";
8192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SGRK(UChar r3, UChar r1, UChar r2)
8196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
8198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
8199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
8200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
8202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
8203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op2), mkexpr(op3)));
8204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, op2, op3);
8205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
8206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sgrk";
8208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_S(UChar r1, IRTemp op2addr)
8212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
8214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
8218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
8219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
8220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op1, op2);
8221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
8222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "s";
8224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SY(UChar r1, IRTemp op2addr)
8228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
8230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
8234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
8235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
8236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op1, op2);
8237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
8238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sy";
8240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SG(UChar r1, IRTemp op2addr)
8244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
8246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
8247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
8248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
8250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
8251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
8252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, op1, op2);
8253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
8254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sg";
8256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SGF(UChar r1, IRTemp op2addr)
8260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
8262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
8263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
8264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
8266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
8267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
8268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, op1, op2);
8269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
8270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sgf";
8272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SH(UChar r1, IRTemp op2addr)
8276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
8278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
8282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
8283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
8284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op1, op2);
8285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
8286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sh";
8288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SHY(UChar r1, IRTemp op2addr)
8292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
8294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
8298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
8299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
8300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op1, op2);
8301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
8302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "shy";
8304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SHHHR(UChar r3 __attribute__((unused)), UChar r1, UChar r2)
8308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
8311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r1));
8314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w0(r2));
8315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
8316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op2, op3);
8317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
8318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "shhhr";
8320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SHHLR(UChar r3 __attribute__((unused)), UChar r1, UChar r2)
8324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
8327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r1));
8330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r2));
8331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
8332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op2, op3);
8333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
8334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "shhlr";
8336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLR(UChar r1, UChar r2)
8340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
8342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
8346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
8347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
8348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op1, op2);
8349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
8350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slr";
8352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLGR(UChar r1, UChar r2)
8356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
8358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
8359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
8360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
8362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
8363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
8364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op1, op2);
8365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
8366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slgr";
8368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLGFR(UChar r1, UChar r2)
8372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
8374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
8375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
8376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
8378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Uto64, get_gpr_w1(r2)));
8379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
8380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op1, op2);
8381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
8382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slgfr";
8384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLRK(UChar r3, UChar r1, UChar r2)
8388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
8391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
8394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
8395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
8396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op2, op3);
8397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
8398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slrk";
8400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLGRK(UChar r3, UChar r1, UChar r2)
8404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
8406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
8407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
8408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
8410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
8411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op2), mkexpr(op3)));
8412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op2, op3);
8413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
8414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slgrk";
8416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SL(UChar r1, IRTemp op2addr)
8420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
8422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
8426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
8427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
8428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op1, op2);
8429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
8430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sl";
8432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLY(UChar r1, IRTemp op2addr)
8436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
8438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
8442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
8443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
8444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op1, op2);
8445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
8446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sly";
8448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLG(UChar r1, IRTemp op2addr)
8452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
8454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
8455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
8456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
8458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
8459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
8460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op1, op2);
8461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
8462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slg";
8464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLGF(UChar r1, IRTemp op2addr)
8468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
8470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
8471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
8472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
8474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Uto64, load(Ity_I32, mkexpr(op2addr))));
8475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
8476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op1, op2);
8477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
8478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slgf";
8480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLFI(UChar r1, UInt i2)
8484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
8486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
8487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
8490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
8491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkU32(op2)));
8492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op1, mktemp(Ity_I32,
8493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(op2)));
8494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
8495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slfi";
8497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLGFI(UChar r1, UInt i2)
8501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
8503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong op2;
8504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
8505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
8507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (ULong)i2;
8508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkU64(op2)));
8509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op1, mktemp(Ity_I64,
8510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64(op2)));
8511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
8512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slgfi";
8514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLHHHR(UChar r3 __attribute__((unused)), UChar r1, UChar r2)
8518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
8521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r1));
8524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w0(r2));
8525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
8526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op2, op3);
8527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
8528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slhhhr";
8530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLHHLR(UChar r3 __attribute__((unused)), UChar r1, UChar r2)
8534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
8537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r1));
8540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r2));
8541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
8542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op2, op3);
8543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
8544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slhhlr";
8546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLBR(UChar r1, UChar r2)
8550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
8552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp borrow_in = newTemp(Ity_I32);
8555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
8557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
8558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(borrow_in, binop(Iop_Sub32, mkU32(1), binop(Iop_Shr32,
8559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          s390_call_calculate_cc(), mkU8(1))));
8560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)),
8561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(borrow_in)));
8562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_SUBB_32, op1, op2, borrow_in);
8563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
8564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slbr";
8566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLBGR(UChar r1, UChar r2)
8570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
8572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
8573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
8574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp borrow_in = newTemp(Ity_I64);
8575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
8577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
8578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(borrow_in, unop(Iop_32Uto64, binop(Iop_Sub32, mkU32(1),
8579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Shr32, s390_call_calculate_cc(), mkU8(1)))));
8580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)),
8581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(borrow_in)));
8582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_SUBB_64, op1, op2, borrow_in);
8583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
8584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slbgr";
8586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLB(UChar r1, IRTemp op2addr)
8590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
8592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp borrow_in = newTemp(Ity_I32);
8595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
8597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
8598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(borrow_in, binop(Iop_Sub32, mkU32(1), binop(Iop_Shr32,
8599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          s390_call_calculate_cc(), mkU8(1))));
8600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)),
8601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(borrow_in)));
8602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_SUBB_32, op1, op2, borrow_in);
8603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
8604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slb";
8606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLBG(UChar r1, IRTemp op2addr)
8610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
8612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
8613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
8614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp borrow_in = newTemp(Ity_I64);
8615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
8617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
8618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(borrow_in, unop(Iop_32Uto64, binop(Iop_Sub32, mkU32(1),
8619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Shr32, s390_call_calculate_cc(), mkU8(1)))));
8620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)),
8621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(borrow_in)));
8622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_SUBB_64, op1, op2, borrow_in);
8623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
8624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slbg";
8626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SVC(UChar i)
8630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp sysno = newTemp(Ity_I64);
8632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (i != 0) {
8634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(sysno, mkU64(i));
8635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
8636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(sysno, unop(Iop_32Uto64, get_gpr_w1(1)));
8637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
8638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   system_call(mkexpr(sysno));
8639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "svc";
8641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TM(UChar i2, IRTemp op1addr)
8645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar mask;
8647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I8);
8648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = i2;
8650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, load(Ity_I8, mkexpr(op1addr)));
8651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_8, value, mktemp(Ity_I8,
8652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU8(mask)));
8653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tm";
8655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TMY(UChar i2, IRTemp op1addr)
8659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar mask;
8661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I8);
8662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = i2;
8664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, load(Ity_I8, mkexpr(op1addr)));
8665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_8, value, mktemp(Ity_I8,
8666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU8(mask)));
8667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tmy";
8669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TMHH(UChar r1, UShort i2)
8673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort mask;
8675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I16);
8676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = i2;
8678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_hw0(r1));
8679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_16, value, mktemp(Ity_I16,
8680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU16(mask)));
8681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tmhh";
8683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TMHL(UChar r1, UShort i2)
8687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort mask;
8689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I16);
8690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = i2;
8692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_hw1(r1));
8693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_16, value, mktemp(Ity_I16,
8694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU16(mask)));
8695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tmhl";
8697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TMLH(UChar r1, UShort i2)
8701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort mask;
8703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I16);
8704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = i2;
8706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_hw2(r1));
8707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_16, value, mktemp(Ity_I16,
8708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU16(mask)));
8709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tmlh";
8711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TMLL(UChar r1, UShort i2)
8715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort mask;
8717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I16);
8718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = i2;
8720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_hw3(r1));
8721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_16, value, mktemp(Ity_I16,
8722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU16(mask)));
8723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tmll";
8725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_EFPC(UChar r1)
8729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, get_fpc_w0());
8731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "efpc";
8733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LER(UChar r1, UChar r2)
8737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, get_fpr_w0(r2));
8739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ler";
8741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LDR(UChar r1, UChar r2)
8745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, get_fpr_dw0(r2));
8747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ldr";
8749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LXR(UChar r1, UChar r2)
8753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, get_fpr_dw0(r2));
8755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1 + 2, get_fpr_dw0(r2 + 2));
8756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lxr";
8758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LE(UChar r1, IRTemp op2addr)
8762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, load(Ity_F32, mkexpr(op2addr)));
8764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "le";
8766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LD(UChar r1, IRTemp op2addr)
8770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, load(Ity_F64, mkexpr(op2addr)));
8772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ld";
8774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LEY(UChar r1, IRTemp op2addr)
8778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, load(Ity_F32, mkexpr(op2addr)));
8780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ley";
8782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LDY(UChar r1, IRTemp op2addr)
8786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, load(Ity_F64, mkexpr(op2addr)));
8788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ldy";
8790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LFPC(IRTemp op2addr)
8794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpc_w0(load(Ity_I32, mkexpr(op2addr)));
8796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lfpc";
8798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LZER(UChar r1)
8802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkF32i(0x0));
8804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lzer";
8806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LZDR(UChar r1)
8810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkF64i(0x0));
8812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lzdr";
8814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LZXR(UChar r1)
8818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkF64i(0x0));
8820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1 + 2, mkF64i(0x0));
8821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lzxr";
8823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRNM(IRTemp op2addr)
8827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt input_mask, fpc_mask;
8829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   input_mask = 3;
8831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   fpc_mask = s390_host_has_fpext ? 7 : 3;
8832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpc_w0(binop(Iop_Or32,
8834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    binop(Iop_And32, get_fpc_w0(), mkU32(~fpc_mask)),
8835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    binop(Iop_And32, unop(Iop_64to32, mkexpr(op2addr)),
8836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          mkU32(input_mask))));
8837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srnm";
8838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_SRNMB(IRTemp op2addr)
8842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
8843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt input_mask, fpc_mask;
8844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   input_mask = 7;
8846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   fpc_mask = 7;
8847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpc_w0(binop(Iop_Or32,
8849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    binop(Iop_And32, get_fpc_w0(), mkU32(~fpc_mask)),
8850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    binop(Iop_And32, unop(Iop_64to32, mkexpr(op2addr)),
8851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          mkU32(input_mask))));
8852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "srnmb";
8853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
8854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void
8856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_srnmb_wrapper(UChar b2, UShort d2)
8857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
8858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (b2 == 0) {  /* This is the typical case */
8859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (d2 > 3) {
8860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (s390_host_has_fpext && d2 == 7) {
8861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* ok */
8862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
8863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            emulation_warning(EmWarn_S390X_invalid_rounding);
8864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            d2 = S390_FPC_BFP_ROUND_NEAREST_EVEN;
8865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
8866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
8867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
8868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_format_S_RD(s390_irgen_SRNMB, b2, d2);
8870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
8871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Wrapper to validate the parameter as in SRNMB is not required, as all
8873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   the 8 values in op2addr[61:63] correspond to a valid DFP rounding mode */
8874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_SRNMT(IRTemp op2addr)
8876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
8877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt input_mask, fpc_mask;
8878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   input_mask = 7;
8880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   fpc_mask = 0x70;
8881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* fpc[25:27] <- op2addr[61:63]
8883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      fpc = (fpc & ~(0x70)) | ((op2addr & 7) << 4) */
8884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpc_w0(binop(Iop_Or32, binop(Iop_And32, get_fpc_w0(), mkU32(~fpc_mask)),
8885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    binop(Iop_Shl32, binop(Iop_And32,
8886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_64to32, mkexpr(op2addr)),
8887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(input_mask)), mkU8(4))));
8888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "srnmt";
8889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
8890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SFPC(UChar r1)
8894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpc_w0(get_gpr_w1(r1));
8896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sfpc";
8898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STE(UChar r1, IRTemp op2addr)
8902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_fpr_w0(r1));
8904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ste";
8906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STD(UChar r1, IRTemp op2addr)
8910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_fpr_dw0(r1));
8912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "std";
8914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STEY(UChar r1, IRTemp op2addr)
8918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_fpr_w0(r1));
8920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stey";
8922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STDY(UChar r1, IRTemp op2addr)
8926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_fpr_dw0(r1));
8928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stdy";
8930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STFPC(IRTemp op2addr)
8934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_fpc_w0());
8936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stfpc";
8938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AEBR(UChar r1, UChar r2)
8942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
8944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
8945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
8946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
8947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
8949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_w0(r2));
8950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_AddF32, mkexpr(rounding_mode), mkexpr(op1),
8951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
8953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
8954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "aebr";
8956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ADBR(UChar r1, UChar r2)
8960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F64);
8962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F64);
8963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
8964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
8965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_dw0(r1));
8967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_dw0(r2));
8968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_AddF64, mkexpr(rounding_mode), mkexpr(op1),
8969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
8971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
8972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "adbr";
8974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AEB(UChar r1, IRTemp op2addr)
8978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
8980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
8981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
8982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
8983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
8985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_F32, mkexpr(op2addr)));
8986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_AddF32, mkexpr(rounding_mode), mkexpr(op1),
8987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
8989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
8990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "aeb";
8992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
8995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ADB(UChar r1, IRTemp op2addr)
8996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F64);
8998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F64);
8999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
9000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
9001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_dw0(r1));
9003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_F64, mkexpr(op2addr)));
9004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_AddF64, mkexpr(rounding_mode), mkexpr(op1),
9005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
9006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
9007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
9008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "adb";
9010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CEFBR(UChar m3, UChar m4 __attribute__((unused)),
9014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
9015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m3 != S390_BFP_ROUND_PER_FPC) {
9017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
9018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m3 = S390_BFP_ROUND_PER_FPC;
9019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
9021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
9023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_w0(r1, binop(Iop_I32StoF32, mkexpr(encode_bfp_rounding_mode(m3)),
9024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(op2)));
9025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cefbr";
9027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CDFBR(UChar m3 __attribute__((unused)),
9031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar m4 __attribute__((unused)), UChar r1, UChar r2)
9032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
9034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
9036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, unop(Iop_I32StoF64, mkexpr(op2)));
9037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cdfbr";
9039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CEGBR(UChar m3, UChar m4 __attribute__((unused)),
9043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
9044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m3 != S390_BFP_ROUND_PER_FPC) {
9046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
9047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m3 = S390_BFP_ROUND_PER_FPC;
9048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
9050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
9052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_w0(r1, binop(Iop_I64StoF32, mkexpr(encode_bfp_rounding_mode(m3)),
9053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(op2)));
9054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cegbr";
9056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CDGBR(UChar m3, UChar m4 __attribute__((unused)),
9060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
9061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m3 != S390_BFP_ROUND_PER_FPC) {
9063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
9064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m3 = S390_BFP_ROUND_PER_FPC;
9065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
9067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
9069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_dw0(r1, binop(Iop_I64StoF64, mkexpr(encode_bfp_rounding_mode(m3)),
9070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         mkexpr(op2)));
9071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cdgbr";
9073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CELFBR(UChar m3, UChar m4 __attribute__((unused)),
9077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar r1, UChar r2)
9078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op2 = newTemp(Ity_I32);
9083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op2, get_gpr_w1(r2));
9085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_fpr_w0(r1, binop(Iop_I32UtoF32, mkexpr(encode_bfp_rounding_mode(m3)),
9086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           mkexpr(op2)));
9087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "celfbr";
9089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CDLFBR(UChar m3 __attribute__((unused)),
9093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar m4 __attribute__((unused)), UChar r1, UChar r2)
9094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op2 = newTemp(Ity_I32);
9099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op2, get_gpr_w1(r2));
9101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_fpr_dw0(r1, unop(Iop_I32UtoF64, mkexpr(op2)));
9102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cdlfbr";
9104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CELGBR(UChar m3, UChar m4 __attribute__((unused)),
9108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar r1, UChar r2)
9109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op2 = newTemp(Ity_I64);
9114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op2, get_gpr_dw0(r2));
9116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_fpr_w0(r1, binop(Iop_I64UtoF32, mkexpr(encode_bfp_rounding_mode(m3)),
9117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           mkexpr(op2)));
9118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "celgbr";
9120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CDLGBR(UChar m3, UChar m4 __attribute__((unused)),
9124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar r1, UChar r2)
9125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op2 = newTemp(Ity_I64);
9130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op2, get_gpr_dw0(r2));
9132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_fpr_dw0(r1, binop(Iop_I64UtoF64,
9133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            mkexpr(encode_bfp_rounding_mode(m3)),
9134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            mkexpr(op2)));
9135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cdlgbr";
9137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CLFEBR(UChar m3, UChar m4 __attribute__((unused)),
9141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar r1, UChar r2)
9142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op = newTemp(Ity_F32);
9147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp result = newTemp(Ity_I32);
9148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
9149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op, get_fpr_w0(r2));
9151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(result, binop(Iop_F32toI32U, mkexpr(rounding_mode),
9152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           mkexpr(op)));
9153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_gpr_w1(r1, mkexpr(result));
9154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_cc_thunk_putFZ(S390_CC_OP_BFP_32_TO_UINT_32, op, rounding_mode);
9155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "clfebr";
9157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CLFDBR(UChar m3, UChar m4 __attribute__((unused)),
9161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar r1, UChar r2)
9162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op = newTemp(Ity_F64);
9167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp result = newTemp(Ity_I32);
9168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
9169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op, get_fpr_dw0(r2));
9171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(result, binop(Iop_F64toI32U, mkexpr(rounding_mode),
9172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           mkexpr(op)));
9173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_gpr_w1(r1, mkexpr(result));
9174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_cc_thunk_putFZ(S390_CC_OP_BFP_64_TO_UINT_32, op, rounding_mode);
9175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "clfdbr";
9177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CLGEBR(UChar m3, UChar m4 __attribute__((unused)),
9181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar r1, UChar r2)
9182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op = newTemp(Ity_F32);
9187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp result = newTemp(Ity_I64);
9188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
9189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op, get_fpr_w0(r2));
9191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(result, binop(Iop_F32toI64U, mkexpr(rounding_mode),
9192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           mkexpr(op)));
9193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_gpr_dw0(r1, mkexpr(result));
9194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_cc_thunk_putFZ(S390_CC_OP_BFP_32_TO_UINT_64, op, rounding_mode);
9195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "clgebr";
9197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CLGDBR(UChar m3, UChar m4 __attribute__((unused)),
9201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar r1, UChar r2)
9202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op = newTemp(Ity_F64);
9207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp result = newTemp(Ity_I64);
9208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
9209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op, get_fpr_dw0(r2));
9211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(result, binop(Iop_F64toI64U, mkexpr(rounding_mode),
9212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           mkexpr(op)));
9213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_gpr_dw0(r1, mkexpr(result));
9214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_cc_thunk_putFZ(S390_CC_OP_BFP_64_TO_UINT_64, op, rounding_mode);
9215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "clgdbr";
9217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CFEBR(UChar m3, UChar m4 __attribute__((unused)),
9221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
9222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F32);
9224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
9225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
9226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_w0(r2));
9228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, binop(Iop_F32toI32S, mkexpr(rounding_mode),
9229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op)));
9230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
9231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_BFP_32_TO_INT_32, op, rounding_mode);
9232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cfebr";
9234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CFDBR(UChar m3, UChar m4 __attribute__((unused)),
9238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
9239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F64);
9241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
9242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
9243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_dw0(r2));
9245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, binop(Iop_F64toI32S, mkexpr(rounding_mode),
9246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op)));
9247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
9248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_BFP_64_TO_INT_32, op, rounding_mode);
9249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cfdbr";
9251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CGEBR(UChar m3, UChar m4 __attribute__((unused)),
9255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
9256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F32);
9258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
9259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
9260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_w0(r2));
9262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, binop(Iop_F32toI64S, mkexpr(rounding_mode),
9263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op)));
9264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
9265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_BFP_32_TO_INT_64, op, rounding_mode);
9266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgebr";
9268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CGDBR(UChar m3, UChar m4 __attribute__((unused)),
9272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
9273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F64);
9275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
9276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
9277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_dw0(r2));
9279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, binop(Iop_F64toI64S, mkexpr(rounding_mode),
9280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op)));
9281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
9282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_BFP_64_TO_INT_64, op, rounding_mode);
9283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgdbr";
9285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DEBR(UChar r1, UChar r2)
9289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
9291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
9292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
9293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
9294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
9296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_w0(r2));
9297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_DivF32, mkexpr(rounding_mode), mkexpr(op1),
9298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
9299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
9300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "debr";
9302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DDBR(UChar r1, UChar r2)
9306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F64);
9308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F64);
9309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
9310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
9311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_dw0(r1));
9313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_dw0(r2));
9314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_DivF64, mkexpr(rounding_mode), mkexpr(op1),
9315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
9316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
9317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ddbr";
9319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DEB(UChar r1, IRTemp op2addr)
9323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
9325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
9326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
9327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
9328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
9330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_F32, mkexpr(op2addr)));
9331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_DivF32, mkexpr(rounding_mode), mkexpr(op1),
9332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
9333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
9334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "deb";
9336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DDB(UChar r1, IRTemp op2addr)
9340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F64);
9342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F64);
9343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
9344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
9345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_dw0(r1));
9347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_F64, mkexpr(op2addr)));
9348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_DivF64, mkexpr(rounding_mode), mkexpr(op1),
9349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
9350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
9351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ddb";
9353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LTEBR(UChar r1, UChar r2)
9357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
9359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, get_fpr_w0(r2));
9361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
9362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
9363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ltebr";
9365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LTDBR(UChar r1, UChar r2)
9369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
9371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, get_fpr_dw0(r2));
9373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
9374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
9375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ltdbr";
9377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LCEBR(UChar r1, UChar r2)
9381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
9383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_NegF32, get_fpr_w0(r2)));
9385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
9386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
9387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lcebr";
9389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LCDBR(UChar r1, UChar r2)
9393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
9395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_NegF64, get_fpr_dw0(r2)));
9397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
9398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
9399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lcdbr";
9401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LDEBR(UChar r1, UChar r2)
9405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F32);
9407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_w0(r2));
9409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, unop(Iop_F32toF64, mkexpr(op)));
9410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ldebr";
9412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LDEB(UChar r1, IRTemp op2addr)
9416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F32);
9418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, load(Ity_F32, mkexpr(op2addr)));
9420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, unop(Iop_F32toF64, mkexpr(op)));
9421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ldeb";
9423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_LEDBR(UChar m3, UChar m4 __attribute__((unused)),
9427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
9428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m3 != S390_BFP_ROUND_PER_FPC) {
9430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
9431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m3 = S390_BFP_ROUND_PER_FPC;
9432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F64);
9434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_dw0(r2));
9436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_w0(r1, binop(Iop_F64toF32, mkexpr(encode_bfp_rounding_mode(m3)),
9437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(op)));
9438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ledbr";
9440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MEEBR(UChar r1, UChar r2)
9444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
9446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
9447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
9448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRRoundingMode rounding_mode =
9449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
9450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
9452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_w0(r2));
9453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_MulF32, mkexpr(rounding_mode), mkexpr(op1),
9454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
9455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
9456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "meebr";
9458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MDBR(UChar r1, UChar r2)
9462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F64);
9464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F64);
9465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
9466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
9467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_dw0(r1));
9469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_dw0(r2));
9470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_MulF64, mkexpr(rounding_mode), mkexpr(op1),
9471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
9472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
9473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mdbr";
9475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MEEB(UChar r1, IRTemp op2addr)
9479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
9481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
9482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
9483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
9484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
9486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_F32, mkexpr(op2addr)));
9487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_MulF32, mkexpr(rounding_mode), mkexpr(op1),
9488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          mkexpr(op2)));
9489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_w0(r1, mkexpr(result));
9490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "meeb";
9492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_MDB(UChar r1, IRTemp op2addr)
9496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_F64);
9498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_F64);
9499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_F64);
9500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
9501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_fpr_dw0(r1));
9503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, load(Ity_F64, mkexpr(op2addr)));
9504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_MulF64, mkexpr(rounding_mode), mkexpr(op1),
9505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          mkexpr(op2)));
9506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_dw0(r1, mkexpr(result));
9507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "mdb";
9509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_SEBR(UChar r1, UChar r2)
9513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_F32);
9515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_F32);
9516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_F32);
9517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
9518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_fpr_w0(r1));
9520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_fpr_w0(r2));
9521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_SubF32, mkexpr(rounding_mode), mkexpr(op1),
9522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
9523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
9524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
9525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "sebr";
9527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_SDBR(UChar r1, UChar r2)
9531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_F64);
9533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_F64);
9534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_F64);
9535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
9536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_fpr_dw0(r1));
9538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_fpr_dw0(r2));
9539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_SubF64, mkexpr(rounding_mode), mkexpr(op1),
9540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          mkexpr(op2)));
9541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
9542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_dw0(r1, mkexpr(result));
9543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "sdbr";
9545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_SEB(UChar r1, IRTemp op2addr)
9549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_F32);
9551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_F32);
9552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_F32);
9553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
9554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_fpr_w0(r1));
9556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, load(Ity_F32, mkexpr(op2addr)));
9557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_SubF32, mkexpr(rounding_mode), mkexpr(op1),
9558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          mkexpr(op2)));
9559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
9560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_w0(r1, mkexpr(result));
9561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "seb";
9563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_SDB(UChar r1, IRTemp op2addr)
9567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_F64);
9569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_F64);
9570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_F64);
9571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
9572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_fpr_dw0(r1));
9574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, load(Ity_F64, mkexpr(op2addr)));
9575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_SubF64, mkexpr(rounding_mode), mkexpr(op1),
9576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          mkexpr(op2)));
9577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
9578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_dw0(r1, mkexpr(result));
9579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "sdb";
9581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_ADTRA(UChar r3, UChar m4, UChar r1, UChar r2)
9585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_D64);
9587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D64);
9588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_D64);
9589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode;
9590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
9594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
9595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m4 = S390_DFP_ROUND_PER_FPC_0;
9596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rounding_mode = encode_dfp_rounding_mode(m4);
9599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_dpr_dw0(r2));
9600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_dw0(r3));
9601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_AddD64, mkexpr(rounding_mode), mkexpr(op1),
9602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(op2)));
9603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putF(S390_CC_OP_DFP_RESULT_64, result);
9604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(r1, mkexpr(result));
9605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (m4 == 0) ? "adtr" : "adtra";
9607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_AXTRA(UChar r3, UChar m4, UChar r1, UChar r2)
9611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_D128);
9613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D128);
9614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_D128);
9615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode;
9616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
9620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
9621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m4 = S390_DFP_ROUND_PER_FPC_0;
9622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rounding_mode = encode_dfp_rounding_mode(m4);
9625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_dpr_pair(r2));
9626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_pair(r3));
9627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_AddD128, mkexpr(rounding_mode), mkexpr(op1),
9628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(op2)));
9629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_pair(r1, mkexpr(result));
9630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1d128(S390_CC_OP_DFP_RESULT_128, result);
9632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (m4 == 0) ? "axtr" : "axtra";
9634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CDTR(UChar r1, UChar r2)
9638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_D64);
9640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D64);
9641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp cc_vex  = newTemp(Ity_I32);
9642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp cc_s390 = newTemp(Ity_I32);
9643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_dpr_dw0(r1));
9645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_dw0(r2));
9646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(cc_vex, binop(Iop_CmpD64, mkexpr(op1), mkexpr(op2)));
9647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(cc_s390, convert_vex_dfpcc_to_s390(cc_vex));
9649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
9650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cdtr";
9652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CXTR(UChar r1, UChar r2)
9656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_D128);
9658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D128);
9659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp cc_vex  = newTemp(Ity_I32);
9660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp cc_s390 = newTemp(Ity_I32);
9661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_dpr_pair(r1));
9663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_pair(r2));
9664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(cc_vex, binop(Iop_CmpD128, mkexpr(op1), mkexpr(op2)));
9665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(cc_s390, convert_vex_dfpcc_to_s390(cc_vex));
9667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
9668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cxtr";
9670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CDFTR(UChar m3 __attribute__((unused)),
9674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar m4 __attribute__((unused)), UChar r1, UChar r2)
9675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op2 = newTemp(Ity_I32);
9682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op2, get_gpr_w1(r2));
9684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_dpr_dw0(r1, unop(Iop_I32StoD64, mkexpr(op2)));
9685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cdftr";
9687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CXFTR(UChar m3 __attribute__((unused)),
9691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar m4 __attribute__((unused)), UChar r1, UChar r2)
9692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op2 = newTemp(Ity_I32);
9699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op2, get_gpr_w1(r2));
9701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_dpr_pair(r1, unop(Iop_I32StoD128, mkexpr(op2)));
9702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cxftr";
9704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CDGTRA(UChar m3, UChar m4 __attribute__((unused)),
9708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar r1, UChar r2)
9709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_I64);
9711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m3 != S390_DFP_ROUND_PER_FPC_0) {
9714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
9715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m3 = S390_DFP_ROUND_PER_FPC_0;
9716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_gpr_dw0(r2));
9719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(r1, binop(Iop_I64StoD64, mkexpr(encode_dfp_rounding_mode(m3)),
9720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         mkexpr(op2)));
9721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (m3 == 0) ? "cdgtr" : "cdgtra";
9723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CXGTR(UChar m3 __attribute__((unused)),
9727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar m4 __attribute__((unused)), UChar r1, UChar r2)
9728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_I64);
9730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* No emulation warning here about an non-zero m3 on hosts without
9734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      floating point extension facility. No rounding is performed */
9735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_gpr_dw0(r2));
9737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_pair(r1, unop(Iop_I64StoD128, mkexpr(op2)));
9738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cxgtr";
9740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CDLFTR(UChar m3 __attribute__((unused)),
9744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar m4 __attribute__((unused)), UChar r1, UChar r2)
9745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op2 = newTemp(Ity_I32);
9752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op2, get_gpr_w1(r2));
9754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_dpr_dw0(r1, unop(Iop_I32UtoD64, mkexpr(op2)));
9755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cdlftr";
9757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CXLFTR(UChar m3 __attribute__((unused)),
9761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar m4 __attribute__((unused)), UChar r1, UChar r2)
9762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op2 = newTemp(Ity_I32);
9769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op2, get_gpr_w1(r2));
9771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_dpr_pair(r1, unop(Iop_I32UtoD128, mkexpr(op2)));
9772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cxlftr";
9774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CDLGTR(UChar m3, UChar m4 __attribute__((unused)),
9778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar r1, UChar r2)
9779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op2 = newTemp(Ity_I64);
9786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op2, get_gpr_dw0(r2));
9788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_dpr_dw0(r1, binop(Iop_I64UtoD64,
9789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            mkexpr(encode_dfp_rounding_mode(m3)),
9790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            mkexpr(op2)));
9791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cdlgtr";
9793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CXLGTR(UChar m3 __attribute__((unused)),
9797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar m4 __attribute__((unused)), UChar r1, UChar r2)
9798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op2 = newTemp(Ity_I64);
9805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op2, get_gpr_dw0(r2));
9807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_dpr_pair(r1, unop(Iop_I64UtoD128, mkexpr(op2)));
9808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cxlgtr";
9810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CFDTR(UChar m3, UChar m4 __attribute__((unused)),
9814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
9815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op = newTemp(Ity_D64);
9822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp result = newTemp(Ity_I32);
9823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
9824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op, get_dpr_dw0(r2));
9826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(result, binop(Iop_D64toI32S, mkexpr(rounding_mode),
9827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           mkexpr(op)));
9828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_gpr_w1(r1, mkexpr(result));
9829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_cc_thunk_putFZ(S390_CC_OP_DFP_64_TO_INT_32, op, rounding_mode);
9830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cfdtr";
9832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CFXTR(UChar m3, UChar m4 __attribute__((unused)),
9836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
9837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op = newTemp(Ity_D128);
9844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp result = newTemp(Ity_I32);
9845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
9846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op, get_dpr_pair(r2));
9848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(result, binop(Iop_D128toI32S, mkexpr(rounding_mode),
9849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           mkexpr(op)));
9850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_gpr_w1(r1, mkexpr(result));
9851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_cc_thunk_put1d128Z(S390_CC_OP_DFP_128_TO_INT_32, op, rounding_mode);
9852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cfxtr";
9854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CGDTR(UChar m3, UChar m4 __attribute__((unused)),
9858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
9859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op = newTemp(Ity_D64);
9861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
9862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* If fpext is not installed and m3 is in 1:7,
9866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rounding mode performed is unpredictable */
9867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m3 > 0 && m3 < 8) {
9868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
9869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m3 = S390_DFP_ROUND_PER_FPC_0;
9870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op, get_dpr_dw0(r2));
9873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_dw0(r1, binop(Iop_D64toI64S, mkexpr(rounding_mode), mkexpr(op)));
9874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_DFP_64_TO_INT_64, op, rounding_mode);
9875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cgdtr";
9877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CGXTR(UChar m3, UChar m4 __attribute__((unused)),
9881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
9882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op = newTemp(Ity_D128);
9884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
9885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* If fpext is not installed and m3 is in 1:7,
9889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rounding mode performed is unpredictable */
9890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m3 > 0 && m3 < 8) {
9891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
9892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m3 = S390_DFP_ROUND_PER_FPC_0;
9893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op, get_dpr_pair(r2));
9895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_dw0(r1, binop(Iop_D128toI64S, mkexpr(rounding_mode), mkexpr(op)));
9896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1d128Z(S390_CC_OP_DFP_128_TO_INT_64, op, rounding_mode);
9897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cgxtr";
9899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CEDTR(UChar r1, UChar r2)
9903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_D64);
9905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D64);
9906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp cc_vex  = newTemp(Ity_I32);
9907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp cc_s390 = newTemp(Ity_I32);
9908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_dpr_dw0(r1));
9911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_dw0(r2));
9912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(cc_vex, binop(Iop_CmpExpD64, mkexpr(op1), mkexpr(op2)));
9913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(cc_s390, convert_vex_dfpcc_to_s390(cc_vex));
9915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
9916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cedtr";
9918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CEXTR(UChar r1, UChar r2)
9922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_D128);
9924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D128);
9925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp cc_vex  = newTemp(Ity_I32);
9926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp cc_s390 = newTemp(Ity_I32);
9927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_dpr_pair(r1));
9930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_pair(r2));
9931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(cc_vex, binop(Iop_CmpExpD128, mkexpr(op1), mkexpr(op2)));
9932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(cc_s390, convert_vex_dfpcc_to_s390(cc_vex));
9934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
9935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cextr";
9937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CLFDTR(UChar m3, UChar m4 __attribute__((unused)),
9941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar r1, UChar r2)
9942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op = newTemp(Ity_D64);
9949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp result = newTemp(Ity_I32);
9950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
9951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op, get_dpr_dw0(r2));
9953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(result, binop(Iop_D64toI32U, mkexpr(rounding_mode),
9954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           mkexpr(op)));
9955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_gpr_w1(r1, mkexpr(result));
9956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_cc_thunk_putFZ(S390_CC_OP_DFP_64_TO_UINT_32, op, rounding_mode);
9957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "clfdtr";
9959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CLFXTR(UChar m3, UChar m4 __attribute__((unused)),
9963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar r1, UChar r2)
9964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op = newTemp(Ity_D128);
9971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp result = newTemp(Ity_I32);
9972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
9973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op, get_dpr_pair(r2));
9975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(result, binop(Iop_D128toI32U, mkexpr(rounding_mode),
9976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           mkexpr(op)));
9977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_gpr_w1(r1, mkexpr(result));
9978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_cc_thunk_put1d128Z(S390_CC_OP_DFP_128_TO_UINT_32, op, rounding_mode);
9979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
9980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "clfxtr";
9981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
9982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
9984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CLGDTR(UChar m3, UChar m4 __attribute__((unused)),
9985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar r1, UChar r2)
9986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
9987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
9988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
9990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
9991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
9992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op = newTemp(Ity_D64);
9993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp result = newTemp(Ity_I64);
9994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
9995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op, get_dpr_dw0(r2));
9997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(result, binop(Iop_D64toI64U, mkexpr(rounding_mode),
9998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           mkexpr(op)));
9999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_gpr_dw0(r1, mkexpr(result));
10000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_cc_thunk_putFZ(S390_CC_OP_DFP_64_TO_UINT_64, op, rounding_mode);
10001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
10002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "clgdtr";
10003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CLGXTR(UChar m3, UChar m4 __attribute__((unused)),
10007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar r1, UChar r2)
10008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
10012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
10013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
10014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op = newTemp(Ity_D128);
10015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp result = newTemp(Ity_I64);
10016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp rounding_mode = encode_dfp_rounding_mode(m3);
10017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op, get_dpr_pair(r2));
10019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(result, binop(Iop_D128toI64U, mkexpr(rounding_mode),
10020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           mkexpr(op)));
10021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_gpr_dw0(r1, mkexpr(result));
10022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_cc_thunk_put1d128Z(S390_CC_OP_DFP_128_TO_UINT_64, op,
10023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              rounding_mode);
10024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
10025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "clgxtr";
10026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_DDTRA(UChar r3, UChar m4, UChar r1, UChar r2)
10030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_D64);
10032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D64);
10033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_D64);
10034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode;
10035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
10039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
10040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m4 = S390_DFP_ROUND_PER_FPC_0;
10041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
10042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rounding_mode = encode_dfp_rounding_mode(m4);
10044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_dpr_dw0(r2));
10045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_dw0(r3));
10046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_DivD64, mkexpr(rounding_mode), mkexpr(op1),
10047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(op2)));
10048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(r1, mkexpr(result));
10049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (m4 == 0) ? "ddtr" : "ddtra";
10051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_DXTRA(UChar r3, UChar m4, UChar r1, UChar r2)
10055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_D128);
10057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D128);
10058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_D128);
10059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode;
10060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
10064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
10065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m4 = S390_DFP_ROUND_PER_FPC_0;
10066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
10067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rounding_mode = encode_dfp_rounding_mode(m4);
10069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_dpr_pair(r2));
10070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_pair(r3));
10071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_DivD128, mkexpr(rounding_mode), mkexpr(op1),
10072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(op2)));
10073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_pair(r1, mkexpr(result));
10074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (m4 == 0) ? "dxtr" : "dxtra";
10076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_EEDTR(UChar r1, UChar r2)
10080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_dw0(r1, unop(Iop_ExtractExpD64, get_dpr_dw0(r2)));
10084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "eedtr";
10085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_EEXTR(UChar r1, UChar r2)
10089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_dw0(r1, unop(Iop_ExtractExpD128, get_dpr_pair(r2)));
10093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "eextr";
10094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_ESDTR(UChar r1, UChar r2)
10098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_dw0(r1, unop(Iop_ExtractSigD64, get_dpr_dw0(r2)));
10101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "esdtr";
10102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_ESXTR(UChar r1, UChar r2)
10106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_gpr_dw0(r1, unop(Iop_ExtractSigD128, get_dpr_pair(r2)));
10109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "esxtr";
10110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_IEDTR(UChar r3, UChar r1, UChar r2)
10114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_I64);
10116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D64);
10117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_D64);
10118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_gpr_dw0(r2));
10122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_dw0(r3));
10123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, binop(Iop_InsertExpD64, mkexpr(op1), mkexpr(op2)));
10124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(r1, mkexpr(result));
10125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "iedtr";
10127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_IEXTR(UChar r3, UChar r1, UChar r2)
10131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_I64);
10133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D128);
10134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_D128);
10135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_gpr_dw0(r2));
10139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_pair(r3));
10140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, binop(Iop_InsertExpD128, mkexpr(op1), mkexpr(op2)));
10141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_pair(r1, mkexpr(result));
10142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "iextr";
10144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_LDETR(UChar m4 __attribute__((unused)), UChar r1, UChar r2)
10148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op = newTemp(Ity_D32);
10150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op, get_dpr_w0(r2));
10154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(r1, unop(Iop_D32toD64, mkexpr(op)));
10155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "ldetr";
10157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_LXDTR(UChar m4 __attribute__((unused)), UChar r1, UChar r2)
10161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op = newTemp(Ity_D64);
10163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op, get_dpr_dw0(r2));
10165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_pair(r1, unop(Iop_D64toD128, mkexpr(op)));
10166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "lxdtr";
10168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_LDXTR(UChar m3, UChar m4 __attribute__((unused)),
10172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
10173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* If fpext is not installed and m3 is in 1:7,
10177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rounding mode performed is unpredictable */
10178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m3 > 0 && m3 < 8) {
10179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
10180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m3 = S390_DFP_ROUND_PER_FPC_0;
10181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
10182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_D64);
10183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, binop(Iop_D128toD64, mkexpr(encode_dfp_rounding_mode(m3)),
10185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        get_dpr_pair(r2)));
10186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(r1, mkexpr(result));
10187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "ldxtr";
10189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_LEDTR(UChar m3, UChar m4 __attribute__((unused)),
10193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
10194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* If fpext is not installed and m3 is in 1:7,
10198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rounding mode performed is unpredictable */
10199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m3 > 0 && m3 < 8) {
10200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
10201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m3 = S390_DFP_ROUND_PER_FPC_0;
10202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
10203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op = newTemp(Ity_D64);
10204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op, get_dpr_dw0(r2));
10206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_w0(r1, binop(Iop_D64toD32, mkexpr(encode_dfp_rounding_mode(m3)),
10207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(op)));
10208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "ledtr";
10210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_LTDTR(UChar r1, UChar r2)
10214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_D64);
10216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, get_dpr_dw0(r2));
10218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(r1, mkexpr(result));
10219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putF(S390_CC_OP_DFP_RESULT_64, result);
10220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "ltdtr";
10222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_LTXTR(UChar r1, UChar r2)
10226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_D128);
10228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, get_dpr_pair(r2));
10230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_pair(r1, mkexpr(result));
10231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1d128(S390_CC_OP_DFP_RESULT_128, result);
10232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "ltxtr";
10234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_MDTRA(UChar r3, UChar m4, UChar r1, UChar r2)
10238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_D64);
10240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D64);
10241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_D64);
10242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode;
10243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
10247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
10248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m4 = S390_DFP_ROUND_PER_FPC_0;
10249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
10250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rounding_mode = encode_dfp_rounding_mode(m4);
10252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_dpr_dw0(r2));
10253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_dw0(r3));
10254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_MulD64, mkexpr(rounding_mode), mkexpr(op1),
10255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(op2)));
10256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(r1, mkexpr(result));
10257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (m4 == 0) ? "mdtr" : "mdtra";
10259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_MXTRA(UChar r3, UChar m4, UChar r1, UChar r2)
10263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_D128);
10265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D128);
10266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_D128);
10267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode;
10268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
10272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
10273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m4 = S390_DFP_ROUND_PER_FPC_0;
10274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
10275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rounding_mode = encode_dfp_rounding_mode(m4);
10277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_dpr_pair(r2));
10278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_pair(r3));
10279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_MulD128, mkexpr(rounding_mode), mkexpr(op1),
10280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(op2)));
10281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_pair(r1, mkexpr(result));
10282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (m4 == 0) ? "mxtr" : "mxtra";
10284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_QADTR(UChar r3, UChar m4, UChar r1, UChar r2)
10288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_D64);
10290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D64);
10291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_D64);
10292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode;
10293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* If fpext is not installed and m4 is in 1:7,
10296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rounding mode performed is unpredictable */
10297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m4 > 0 && m4 < 8) {
10298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
10299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m4 = S390_DFP_ROUND_PER_FPC_0;
10300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
10301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rounding_mode = encode_dfp_rounding_mode(m4);
10303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_dpr_dw0(r2));
10304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_dw0(r3));
10305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_QuantizeD64, mkexpr(rounding_mode), mkexpr(op1),
10306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(op2)));
10307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(r1, mkexpr(result));
10308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "qadtr";
10310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_QAXTR(UChar r3, UChar m4, UChar r1, UChar r2)
10314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_D128);
10316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D128);
10317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_D128);
10318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode;
10319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* If fpext is not installed and m4 is in 1:7,
10322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rounding mode performed is unpredictable */
10323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m4 > 0 && m4 < 8) {
10324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
10325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m4 = S390_DFP_ROUND_PER_FPC_0;
10326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
10327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rounding_mode = encode_dfp_rounding_mode(m4);
10329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_dpr_pair(r2));
10330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_pair(r3));
10331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_QuantizeD128, mkexpr(rounding_mode), mkexpr(op1),
10332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(op2)));
10333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_pair(r1, mkexpr(result));
10334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "qaxtr";
10336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_RRDTR(UChar r3, UChar m4, UChar r1, UChar r2)
10340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_I8);
10342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D64);
10343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_D64);
10344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode;
10345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* If fpext is not installed and m4 is in 1:7,
10348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rounding mode performed is unpredictable */
10349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m4 > 0 && m4 < 8) {
10350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
10351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m4 = S390_DFP_ROUND_PER_FPC_0;
10352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
10353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rounding_mode = encode_dfp_rounding_mode(m4);
10355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_gpr_b7(r2));
10356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_dw0(r3));
10357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_SignificanceRoundD64, mkexpr(rounding_mode),
10358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(op1), mkexpr(op2)));
10359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(r1, mkexpr(result));
10360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "rrdtr";
10362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_RRXTR(UChar r3, UChar m4, UChar r1, UChar r2)
10366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_I8);
10368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D128);
10369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_D128);
10370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode;
10371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* If fpext is not installed and m4 is in 1:7,
10374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      rounding mode performed is unpredictable */
10375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m4 > 0 && m4 < 8) {
10376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
10377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m4 = S390_DFP_ROUND_PER_FPC_0;
10378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
10379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rounding_mode = encode_dfp_rounding_mode(m4);
10381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_gpr_b7(r2));
10382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_pair(r3));
10383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_SignificanceRoundD128, mkexpr(rounding_mode),
10384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(op1), mkexpr(op2)));
10385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_pair(r1, mkexpr(result));
10386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "rrxtr";
10388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_SDTRA(UChar r3, UChar m4, UChar r1, UChar r2)
10392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_D64);
10394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D64);
10395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_D64);
10396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode;
10397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
10401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
10402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m4 = S390_DFP_ROUND_PER_FPC_0;
10403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
10404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rounding_mode = encode_dfp_rounding_mode(m4);
10406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_dpr_dw0(r2));
10407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_dw0(r3));
10408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_SubD64, mkexpr(rounding_mode), mkexpr(op1),
10409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(op2)));
10410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putF(S390_CC_OP_DFP_RESULT_64, result);
10411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(r1, mkexpr(result));
10412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (m4 == 0) ? "sdtr" : "sdtra";
10414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_SXTRA(UChar r3, UChar m4, UChar r1, UChar r2)
10418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op1 = newTemp(Ity_D128);
10420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op2 = newTemp(Ity_D128);
10421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp result = newTemp(Ity_D128);
10422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode;
10423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m4 != S390_DFP_ROUND_PER_FPC_0) {
10427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
10428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m4 = S390_DFP_ROUND_PER_FPC_0;
10429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
10430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rounding_mode = encode_dfp_rounding_mode(m4);
10432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op1, get_dpr_pair(r2));
10433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op2, get_dpr_pair(r3));
10434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_SubD128, mkexpr(rounding_mode), mkexpr(op1),
10435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(op2)));
10436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_pair(r1, mkexpr(result));
10437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1d128(S390_CC_OP_DFP_RESULT_128, result);
10439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (m4 == 0) ? "sxtr" : "sxtra";
10441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_SLDT(UChar r3, IRTemp op2addr, UChar r1)
10445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op = newTemp(Ity_D64);
10447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op, get_dpr_dw0(r3));
10451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(r1, binop(Iop_ShlD64, mkexpr(op), unop(Iop_64to8,
10452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               binop(Iop_And64, mkexpr(op2addr), mkU64(63)))));
10453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "sldt";
10455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_SLXT(UChar r3, IRTemp op2addr, UChar r1)
10459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op = newTemp(Ity_D128);
10461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op, get_dpr_pair(r3));
10465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_pair(r1, binop(Iop_ShlD128, mkexpr(op), unop(Iop_64to8,
10466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                binop(Iop_And64, mkexpr(op2addr), mkU64(63)))));
10467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "slxt";
10469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_SRDT(UChar r3, IRTemp op2addr, UChar r1)
10473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op = newTemp(Ity_D64);
10475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op, get_dpr_dw0(r3));
10479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_dw0(r1, binop(Iop_ShrD64, mkexpr(op), unop(Iop_64to8,
10480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               binop(Iop_And64, mkexpr(op2addr), mkU64(63)))));
10481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "srdt";
10483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_SRXT(UChar r3, IRTemp op2addr, UChar r1)
10487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp op = newTemp(Ity_D128);
10489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(op, get_dpr_pair(r3));
10493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_dpr_pair(r1, binop(Iop_ShrD128, mkexpr(op), unop(Iop_64to8,
10494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                binop(Iop_And64, mkexpr(op2addr), mkU64(63)))));
10495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "srxt";
10497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_TDCET(UChar r1, IRTemp op2addr)
10501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp value = newTemp(Ity_D32);
10503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(value, get_dpr_w0(r1));
10506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_DFP_TDC_32, value, op2addr);
10508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "tdcet";
10510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_TDCDT(UChar r1, IRTemp op2addr)
10514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp value = newTemp(Ity_D64);
10516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(value, get_dpr_dw0(r1));
10519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_DFP_TDC_64, value, op2addr);
10521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "tdcdt";
10523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_TDCXT(UChar r1, IRTemp op2addr)
10527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp value = newTemp(Ity_D128);
10529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(value, get_dpr_pair(r1));
10532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1d128Z(S390_CC_OP_DFP_TDC_128, value, op2addr);
10534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "tdcxt";
10536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_TDGET(UChar r1, IRTemp op2addr)
10540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp value = newTemp(Ity_D32);
10542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(value, get_dpr_w0(r1));
10545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_DFP_TDG_32, value, op2addr);
10547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "tdget";
10549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_TDGDT(UChar r1, IRTemp op2addr)
10553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp value = newTemp(Ity_D64);
10555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(value, get_dpr_dw0(r1));
10558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_putFZ(S390_CC_OP_DFP_TDG_64, value, op2addr);
10560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "tdgdt";
10562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_TDGXT(UChar r1, IRTemp op2addr)
10566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp value = newTemp(Ity_D128);
10568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(s390_host_has_dfp);
10570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(value, get_dpr_pair(r1));
10571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1d128Z(S390_CC_OP_DFP_TDG_128, value, op2addr);
10573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "tdgxt";
10575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
10576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLC(UChar length, IRTemp start1, IRTemp start2)
10579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len = newTemp(Ity_I64);
10581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len, mkU64(length));
10583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_CLC_EX(len, start1, start2);
10584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clc";
10586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLCL(UChar r1, UChar r2)
10590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr1 = newTemp(Ity_I64);
10592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr2 = newTemp(Ity_I64);
10593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr1_load = newTemp(Ity_I64);
10594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr2_load = newTemp(Ity_I64);
10595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp len1 = newTemp(Ity_I32);
10596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp len2 = newTemp(Ity_I32);
10597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp r1p1 = newTemp(Ity_I32);   /* contents of r1 + 1 */
10598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp r2p1 = newTemp(Ity_I32);   /* contents of r2 + 1 */
10599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp single1 = newTemp(Ity_I8);
10600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp single2 = newTemp(Ity_I8);
10601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp pad = newTemp(Ity_I8);
10602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr1, get_gpr_dw0(r1));
10604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(r1p1, get_gpr_w1(r1 + 1));
10605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len1, binop(Iop_And32, mkexpr(r1p1), mkU32(0x00ffffff)));
10606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr2, get_gpr_dw0(r2));
10607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(r2p1, get_gpr_w1(r2 + 1));
10608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len2, binop(Iop_And32, mkexpr(r2p1), mkU32(0x00ffffff)));
10609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(pad, get_gpr_b4(r2 + 1));
10610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* len1 == 0 and len2 == 0? Exit */
10612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(0);
10613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ32, binop(Iop_Or32, mkexpr(len1),
10614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         mkexpr(len2)), mkU32(0)));
10615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Because mkite evaluates both the then-clause and the else-clause
10617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      we cannot load directly from addr1 here. If len1 is 0, then adddr1
10618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      may be NULL and loading from there would segfault. So we provide a
10619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      valid dummy address in that case. Loading from there does no harm and
10620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      the value will be discarded at runtime. */
10621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr1_load,
10622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ32, mkexpr(len1), mkU32(0)),
10623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkU64(guest_IA_curr_instr), mkexpr(addr1)));
10624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(single1,
10625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ32, mkexpr(len1), mkU32(0)),
10626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkexpr(pad), load(Ity_I8, mkexpr(addr1_load))));
10627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr2_load,
10629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ32, mkexpr(len2), mkU32(0)),
10630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkU64(guest_IA_curr_instr), mkexpr(addr2)));
10631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(single2,
10632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ32, mkexpr(len2), mkU32(0)),
10633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkexpr(pad), load(Ity_I8, mkexpr(addr2_load))));
10634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, single1, single2, False);
10636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Fields differ ? */
10637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpNE8, mkexpr(single1), mkexpr(single2)));
10638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Update len1 and addr1, unless len1 == 0. */
10640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1,
10641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ32, mkexpr(len1), mkU32(0)),
10642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkexpr(addr1),
10643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     binop(Iop_Add64, mkexpr(addr1), mkU64(1))));
10644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* When updating len1 we must not modify bits (r1+1)[0:39] */
10646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1,
10647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkite(binop(Iop_CmpEQ32, mkexpr(len1), mkU32(0)),
10648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    binop(Iop_And32, mkexpr(r1p1), mkU32(0xFF000000u)),
10649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    binop(Iop_Sub32, mkexpr(r1p1), mkU32(1))));
10650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Update len2 and addr2, unless len2 == 0. */
10652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2,
10653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ32, mkexpr(len2), mkU32(0)),
10654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkexpr(addr2),
10655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     binop(Iop_Add64, mkexpr(addr2), mkU64(1))));
10656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* When updating len2 we must not modify bits (r2+1)[0:39] */
10658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r2 + 1,
10659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkite(binop(Iop_CmpEQ32, mkexpr(len2), mkU32(0)),
10660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    binop(Iop_And32, mkexpr(r2p1), mkU32(0xFF000000u)),
10661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    binop(Iop_Sub32, mkexpr(r2p1), mkU32(1))));
10662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
10664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clcl";
10666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLCLE(UChar r1, UChar r3, IRTemp pad2)
10670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr1, addr3, addr1_load, addr3_load, len1, len3, single1, single3;
10672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   addr1 = newTemp(Ity_I64);
10674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   addr3 = newTemp(Ity_I64);
10675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   addr1_load = newTemp(Ity_I64);
10676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   addr3_load = newTemp(Ity_I64);
10677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   len1 = newTemp(Ity_I64);
10678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   len3 = newTemp(Ity_I64);
10679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   single1 = newTemp(Ity_I8);
10680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   single3 = newTemp(Ity_I8);
10681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr1, get_gpr_dw0(r1));
10683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len1, get_gpr_dw0(r1 + 1));
10684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr3, get_gpr_dw0(r3));
10685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len3, get_gpr_dw0(r3 + 1));
10686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* len1 == 0 and len3 == 0? Exit */
10688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(0);
10689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64,binop(Iop_Or64, mkexpr(len1),
10690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        mkexpr(len3)), mkU64(0)));
10691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* A mux requires both ways to be possible. This is a way to prevent clcle
10693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      from reading from addr1 if it should read from the pad. Since the pad
10694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      has no address, just read from the instruction, we discard that anyway */
10695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr1_load,
10696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ64, mkexpr(len1), mkU64(0)),
10697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkU64(guest_IA_curr_instr), mkexpr(addr1)));
10698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* same for addr3 */
10700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr3_load,
10701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0)),
10702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkU64(guest_IA_curr_instr), mkexpr(addr3)));
10703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(single1,
10705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ64, mkexpr(len1), mkU64(0)),
10706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                unop(Iop_64to8, mkexpr(pad2)),
10707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                load(Ity_I8, mkexpr(addr1_load))));
10708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(single3,
10710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0)),
10711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                unop(Iop_64to8, mkexpr(pad2)),
10712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                load(Ity_I8, mkexpr(addr3_load))));
10713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, single1, single3, False);
10715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Both fields differ ? */
10716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpNE8, mkexpr(single1), mkexpr(single3)));
10717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* If a length in 0 we must not change this length and the address */
10719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1,
10720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ64, mkexpr(len1), mkU64(0)),
10721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkexpr(addr1),
10722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     binop(Iop_Add64, mkexpr(addr1), mkU64(1))));
10723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1 + 1,
10725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ64, mkexpr(len1), mkU64(0)),
10726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkU64(0), binop(Iop_Sub64, mkexpr(len1), mkU64(1))));
10727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r3,
10729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0)),
10730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkexpr(addr3),
10731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     binop(Iop_Add64, mkexpr(addr3), mkU64(1))));
10732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r3 + 1,
10734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0)),
10735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkU64(0), binop(Iop_Sub64, mkexpr(len3), mkU64(1))));
10736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
10738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clcle";
10740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
10744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XC_EX(IRTemp length, IRTemp start1, IRTemp start2)
10745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_xonc(Iop_Xor8, length, start1, start2);
10747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
10748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
10751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_NC_EX(IRTemp length, IRTemp start1, IRTemp start2)
10752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
10753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_xonc(Iop_And8, length, start1, start2);
10754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
10755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10757663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
10758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_OC_EX(IRTemp length, IRTemp start1, IRTemp start2)
10759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
10760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_xonc(Iop_Or8, length, start1, start2);
10761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
10765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLC_EX(IRTemp length, IRTemp start1, IRTemp start2)
10766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp current1 = newTemp(Ity_I8);
10768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp current2 = newTemp(Ity_I8);
10769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp counter = newTemp(Ity_I64);
10770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(counter, get_counter_dw0());
10772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(mkU64(0));
10773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(current1, load(Ity_I8, binop(Iop_Add64, mkexpr(start1),
10775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       mkexpr(counter))));
10776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(current2, load(Ity_I8, binop(Iop_Add64, mkexpr(start2),
10777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       mkexpr(counter))));
10778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, current1, current2,
10779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      False);
10780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Both fields differ ? */
10782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpNE8, mkexpr(current1), mkexpr(current2)));
10783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Check for end of field */
10785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
10786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(binop(Iop_CmpNE64, mkexpr(counter), mkexpr(length)));
10787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(mkU64(0));
10788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
10791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVC_EX(IRTemp length, IRTemp start1, IRTemp start2)
10792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp counter = newTemp(Ity_I64);
10794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(counter, get_counter_dw0());
10796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(start1), mkexpr(counter)),
10798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         load(Ity_I8, binop(Iop_Add64, mkexpr(start2), mkexpr(counter))));
10799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Check for end of field */
10801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
10802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(binop(Iop_CmpNE64, mkexpr(counter), mkexpr(length)));
10803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(mkU64(0));
10804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10806663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
10807663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_TR_EX(IRTemp length, IRTemp start1, IRTemp start2)
10808663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
10809663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op = newTemp(Ity_I8);
10810663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1 = newTemp(Ity_I8);
10811663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp result = newTemp(Ity_I64);
10812663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp counter = newTemp(Ity_I64);
10813663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10814663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(counter, get_counter_dw0());
10815663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10816663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op, load(Ity_I8, binop(Iop_Add64, mkexpr(start1), mkexpr(counter))));
10817663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10818663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(result, binop(Iop_Add64, unop(Iop_8Uto64, mkexpr(op)), mkexpr(start2)));
10819663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10820663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1, load(Ity_I8, mkexpr(result)));
10821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   store(binop(Iop_Add64, mkexpr(start1), mkexpr(counter)), mkexpr(op1));
10822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
10824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(binop(Iop_CmpNE64, mkexpr(counter), mkexpr(length)));
10825663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_counter_dw0(mkU64(0));
10826663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
10827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
10830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_EX_SS(UChar r, IRTemp addr2,
10831663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 void (*irgen)(IRTemp length, IRTemp start1, IRTemp start2),
10832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UInt lensize)
10833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct SS {
10835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned int op :  8;
10836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned int l  :  8;
10837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned int b1 :  4;
10838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned int d1 : 12;
10839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned int b2 :  4;
10840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned int d2 : 12;
10841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   };
10842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   union {
10843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct SS dec;
10844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned long bytes;
10845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } ss;
10846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond;
10847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRDirty *d;
10848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp torun;
10849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp start1 = newTemp(Ity_I64);
10851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp start2 = newTemp(Ity_I64);
10852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp len = newTemp(lensize == 64 ? Ity_I64 : Ity_I32);
10853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   cond = newTemp(Ity_I1);
10854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   torun = newTemp(Ity_I64);
10855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(torun, load(Ity_I64, mkexpr(addr2)));
10857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Start with a check that the saved code is still correct */
10858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cond, binop(Iop_CmpNE64, mkexpr(torun), mkU64(last_execute_target)));
10859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* If not, save the new value */
10860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d = unsafeIRDirty_0_N (0, "s390x_dirtyhelper_EX", &s390x_dirtyhelper_EX,
10861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                          mkIRExprVec_1(mkexpr(torun)));
10862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->guard = mkexpr(cond);
10863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Dirty(d));
10864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* and restart */
10866eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_CMSTART),
10867663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                   mkU64(guest_IA_curr_instr)));
10868eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_CMLEN), mkU64(4)));
10869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   restart_if(mkexpr(cond));
10870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ss.bytes = last_execute_target;
10872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(start1, binop(Iop_Add64, mkU64(ss.dec.d1),
10873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ss.dec.b1 != 0 ? get_gpr_dw0(ss.dec.b1) : mkU64(0)));
10874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(start2, binop(Iop_Add64, mkU64(ss.dec.d2),
10875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ss.dec.b2 != 0 ? get_gpr_dw0(ss.dec.b2) : mkU64(0)));
10876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len, unop(lensize == 64 ? Iop_8Uto64 : Iop_8Uto32, binop(Iop_Or8,
10877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          r != 0 ? get_gpr_b7(r): mkU8(0), mkU8(ss.dec.l))));
10878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irgen(len, start1, start2);
10879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   last_execute_target = 0;
10881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_EX(UChar r1, IRTemp addr2)
10885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch(last_execute_target & 0xff00000000000000ULL) {
10887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0:
10888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   {
10889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* no code information yet */
10890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRDirty *d;
10891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* so safe the code... */
10893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      d = unsafeIRDirty_0_N (0, "s390x_dirtyhelper_EX", &s390x_dirtyhelper_EX,
10894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             mkIRExprVec_1(load(Ity_I64, mkexpr(addr2))));
10895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      stmt(IRStmt_Dirty(d));
10896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* and restart */
10897eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_CMSTART),
10898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      mkU64(guest_IA_curr_instr)));
10899eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_CMLEN), mkU64(4)));
10900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      restart_if(IRExpr_Const(IRConst_U1(True)));
10901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* we know that this will be invalidated */
10903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      put_IA(mkaddr_expr(guest_IA_next_instr));
10904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      dis_res->whatNext = Dis_StopHere;
10905eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      dis_res->jk_StopHere = Ijk_InvalICache;
10906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
10907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
10908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd200000000000000ULL:
10910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* special case MVC */
10911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_irgen_EX_SS(r1, addr2, s390_irgen_MVC_EX, 64);
10912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return "ex@mvc";
10913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd500000000000000ULL:
10915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* special case CLC */
10916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_irgen_EX_SS(r1, addr2, s390_irgen_CLC_EX, 64);
10917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return "ex@clc";
10918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd700000000000000ULL:
10920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* special case XC */
10921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_irgen_EX_SS(r1, addr2, s390_irgen_XC_EX, 32);
10922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return "ex@xc";
10923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xd600000000000000ULL:
10925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* special case OC */
10926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_irgen_EX_SS(r1, addr2, s390_irgen_OC_EX, 32);
10927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return "ex@oc";
10928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xd400000000000000ULL:
10930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* special case NC */
10931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_irgen_EX_SS(r1, addr2, s390_irgen_NC_EX, 32);
10932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return "ex@nc";
10933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xdc00000000000000ULL:
10935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* special case TR */
10936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_irgen_EX_SS(r1, addr2, s390_irgen_TR_EX, 64);
10937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return "ex@tr";
10938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   default:
10940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   {
10941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* everything else will get a self checking prefix that also checks the
10942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         register content */
10943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRDirty *d;
10944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      UChar *bytes;
10945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp cond;
10946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp orperand;
10947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp torun;
10948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      cond = newTemp(Ity_I1);
10950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      orperand = newTemp(Ity_I64);
10951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      torun = newTemp(Ity_I64);
10952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (r1 == 0)
10954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(orperand, mkU64(0));
10955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      else
10956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(orperand, unop(Iop_8Uto64,get_gpr_b7(r1)));
10957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* This code is going to be translated */
10958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(torun, binop(Iop_Or64, load(Ity_I64, mkexpr(addr2)),
10959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             binop(Iop_Shl64, mkexpr(orperand), mkU8(48))));
10960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* Start with a check that saved code is still correct */
10962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(cond, binop(Iop_CmpNE64, mkexpr(torun),
10963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(last_execute_target)));
10964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* If not, save the new value */
10965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      d = unsafeIRDirty_0_N (0, "s390x_dirtyhelper_EX", &s390x_dirtyhelper_EX,
10966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             mkIRExprVec_1(mkexpr(torun)));
10967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      d->guard = mkexpr(cond);
10968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      stmt(IRStmt_Dirty(d));
10969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* and restart */
10971eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_CMSTART), mkU64(guest_IA_curr_instr)));
10972eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_CMLEN), mkU64(4)));
10973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      restart_if(mkexpr(cond));
10974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* Now comes the actual translation */
10976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      bytes = (UChar *) &last_execute_target;
10977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_decode_and_irgen(bytes, ((((bytes[0] >> 6) + 1) >> 1) + 1) << 1,
10978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            dis_res);
10979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
10980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         vex_printf("    which was executed by\n");
10981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* dont make useless translations in the next execute */
10982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      last_execute_target = 0;
10983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
10984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
10985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ex";
10986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
10989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_EXRL(UChar r1, UInt offset)
10990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
10992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* we might save one round trip because we know the target */
10993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (!last_execute_target)
10994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      last_execute_target = *(ULong *)(HWord)
10995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             (guest_IA_curr_instr + offset * 2UL);
10996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkU64(guest_IA_curr_instr + offset * 2UL));
10997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_EX(r1, addr);
10998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "exrl";
10999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_IPM(UChar r1)
11003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // As long as we dont support SPM, lets just assume 0 as program mask
11005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b4(r1, unop(Iop_32to8, binop(Iop_Or32, mkU32(0 /* program mask */),
11006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       binop(Iop_Shl32, s390_call_calculate_cc(), mkU8(4)))));
11007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ipm";
11009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRST(UChar r1, UChar r2)
11014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp address = newTemp(Ity_I64);
11016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp next = newTemp(Ity_I64);
11017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp delim = newTemp(Ity_I8);
11018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp counter = newTemp(Ity_I64);
11019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp byte = newTemp(Ity_I8);
11020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(address, get_gpr_dw0(r2));
11022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(next, get_gpr_dw0(r1));
11023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(counter, get_counter_dw0());
11025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(mkU64(0));
11026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // start = next?  CC=2 and out r1 and r2 unchanged
11028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(2);
11029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2, binop(Iop_Sub64, mkexpr(address), mkexpr(counter)));
11030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, mkexpr(address), mkexpr(next)));
11031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(byte, load(Ity_I8, mkexpr(address)));
11033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(delim, get_gpr_b7(0));
11034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // byte = delim? CC=1, R1=address
11036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(1);
11037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1,  mkexpr(address));
11038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ8, mkexpr(delim), mkexpr(byte)));
11039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // else: all equal, no end yet, loop
11041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
11042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(next));
11043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2, binop(Iop_Add64, mkexpr(address), mkU64(1)));
11044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
11046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srst";
11048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLST(UChar r1, UChar r2)
11052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp address1 = newTemp(Ity_I64);
11054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp address2 = newTemp(Ity_I64);
11055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp end = newTemp(Ity_I8);
11056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp counter = newTemp(Ity_I64);
11057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp byte1 = newTemp(Ity_I8);
11058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp byte2 = newTemp(Ity_I8);
11059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(address1, get_gpr_dw0(r1));
11061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(address2, get_gpr_dw0(r2));
11062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(end, get_gpr_b7(0));
11063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(counter, get_counter_dw0());
11064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(mkU64(0));
11065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(byte1, load(Ity_I8, mkexpr(address1)));
11066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(byte2, load(Ity_I8, mkexpr(address2)));
11067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // end in both? all equal, reset r1 and r2 to start values
11069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(0);
11070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Sub64, mkexpr(address1), mkexpr(counter)));
11071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2, binop(Iop_Sub64, mkexpr(address2), mkexpr(counter)));
11072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ8, mkU8(0),
11073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      binop(Iop_Or8,
11074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            binop(Iop_Xor8, mkexpr(byte1), mkexpr(end)),
11075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            binop(Iop_Xor8, mkexpr(byte2), mkexpr(end)))));
11076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(address1));
11078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2, mkexpr(address2));
11079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // End found in string1
11081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(1);
11082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ8, mkexpr(end), mkexpr(byte1)));
11083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // End found in string2
11085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(2);
11086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ8, mkexpr(end), mkexpr(byte2)));
11087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // string1 < string2
11089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(1);
11090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT32U, unop(Iop_8Uto32, mkexpr(byte1)),
11091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      unop(Iop_8Uto32, mkexpr(byte2))));
11092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // string2 < string1
11094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(2);
11095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT32U, unop(Iop_8Uto32, mkexpr(byte2)),
11096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      unop(Iop_8Uto32, mkexpr(byte1))));
11097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // else: all equal, no end yet, loop
11099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
11100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Add64, get_gpr_dw0(r1), mkU64(1)));
11101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2, binop(Iop_Add64, get_gpr_dw0(r2), mkU64(1)));
11102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
11104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clst";
11106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
11109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_load_multiple_32bit(UChar r1, UChar r3, IRTemp op2addr)
11110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar reg;
11112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
11113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkexpr(op2addr));
11115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   reg = r1;
11116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do {
11117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp old = addr;
11118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg %= 16;
11120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_w1(reg, load(Ity_I32, mkexpr(addr)));
11121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr = newTemp(Ity_I64);
11122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
11123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg++;
11124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } while (reg != (r3 + 1));
11125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LM(UChar r1, UChar r3, IRTemp op2addr)
11129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_load_multiple_32bit(r1, r3, op2addr);
11131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lm";
11133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LMY(UChar r1, UChar r3, IRTemp op2addr)
11137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_load_multiple_32bit(r1, r3, op2addr);
11139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lmy";
11141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LMH(UChar r1, UChar r3, IRTemp op2addr)
11145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar reg;
11147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
11148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkexpr(op2addr));
11150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   reg = r1;
11151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do {
11152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp old = addr;
11153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg %= 16;
11155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_w0(reg, load(Ity_I32, mkexpr(addr)));
11156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr = newTemp(Ity_I64);
11157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
11158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg++;
11159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } while (reg != (r3 + 1));
11160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lmh";
11162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LMG(UChar r1, UChar r3, IRTemp op2addr)
11166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar reg;
11168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
11169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkexpr(op2addr));
11171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   reg = r1;
11172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do {
11173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp old = addr;
11174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg %= 16;
11176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_dw0(reg, load(Ity_I64, mkexpr(addr)));
11177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr = newTemp(Ity_I64);
11178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(8)));
11179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg++;
11180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } while (reg != (r3 + 1));
11181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lmg";
11183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
11186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_store_multiple_32bit(UChar r1, UChar r3, IRTemp op2addr)
11187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar reg;
11189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
11190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkexpr(op2addr));
11192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   reg = r1;
11193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do {
11194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp old = addr;
11195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg %= 16;
11197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(addr), get_gpr_w1(reg));
11198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr = newTemp(Ity_I64);
11199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
11200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg++;
11201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } while( reg != (r3 + 1));
11202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STM(UChar r1, UChar r3, IRTemp op2addr)
11206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_store_multiple_32bit(r1, r3, op2addr);
11208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stm";
11210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STMY(UChar r1, UChar r3, IRTemp op2addr)
11214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_store_multiple_32bit(r1, r3, op2addr);
11216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stmy";
11218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STMH(UChar r1, UChar r3, IRTemp op2addr)
11222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar reg;
11224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
11225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkexpr(op2addr));
11227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   reg = r1;
11228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do {
11229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp old = addr;
11230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg %= 16;
11232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(addr), get_gpr_w0(reg));
11233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr = newTemp(Ity_I64);
11234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
11235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg++;
11236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } while( reg != (r3 + 1));
11237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stmh";
11239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STMG(UChar r1, UChar r3, IRTemp op2addr)
11243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar reg;
11245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
11246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkexpr(op2addr));
11248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   reg = r1;
11249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do {
11250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp old = addr;
11251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg %= 16;
11253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(addr), get_gpr_dw0(reg));
11254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr = newTemp(Ity_I64);
11255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(8)));
11256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg++;
11257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } while( reg != (r3 + 1));
11258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stmg";
11260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
11263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_xonc(IROp op, IRTemp length, IRTemp start1, IRTemp start2)
11264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp old1 = newTemp(Ity_I8);
11266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp old2 = newTemp(Ity_I8);
11267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp new1 = newTemp(Ity_I8);
11268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp counter = newTemp(Ity_I32);
11269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr1 = newTemp(Ity_I64);
11270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(counter, get_counter_w0());
11272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr1, binop(Iop_Add64, mkexpr(start1),
11274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       unop(Iop_32Uto64, mkexpr(counter))));
11275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(old1, load(Ity_I8, mkexpr(addr1)));
11277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(old2, load(Ity_I8, binop(Iop_Add64, mkexpr(start2),
11278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   unop(Iop_32Uto64,mkexpr(counter)))));
11279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(new1, binop(op, mkexpr(old1), mkexpr(old2)));
11280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Special case: xc is used to zero memory */
11282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (op == Iop_Xor8) {
11283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(addr1),
11284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            mkite(binop(Iop_CmpEQ64, mkexpr(start1), mkexpr(start2)),
11285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  mkU8(0), mkexpr(new1)));
11286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else
11287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(addr1), mkexpr(new1));
11288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_w1(binop(Iop_Or32, unop(Iop_8Uto32, mkexpr(new1)),
11289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        get_counter_w1()));
11290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Check for end of field */
11292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_w0(binop(Iop_Add32, mkexpr(counter), mkU32(1)));
11293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(binop(Iop_CmpNE32, mkexpr(counter), mkexpr(length)));
11294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_BITWISE, mktemp(Ity_I32, get_counter_w1()),
11295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      False);
11296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(mkU64(0));
11297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XC(UChar length, IRTemp start1, IRTemp start2)
11301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len = newTemp(Ity_I32);
11303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len, mkU32(length));
11305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_xonc(Iop_Xor8, len, start1, start2);
11306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xc";
11308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
11311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XC_sameloc(UChar length, UChar b, UShort d)
11312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp counter = newTemp(Ity_I32);
11314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp start = newTemp(Ity_I64);
11315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr  = newTemp(Ity_I64);
11316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(start,
11318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Add64, mkU64(d), b != 0 ? get_gpr_dw0(b) : mkU64(0)));
11319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (length < 8) {
11321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      UInt i;
11322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      for (i = 0; i <= length; ++i) {
11324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         store(binop(Iop_Add64, mkexpr(start), mkU64(i)), mkU8(0));
11325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
11326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
11327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     assign(counter, get_counter_w0());
11328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     assign(addr, binop(Iop_Add64, mkexpr(start),
11330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        unop(Iop_32Uto64, mkexpr(counter))));
11331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     store(mkexpr(addr), mkU8(0));
11333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* Check for end of field */
11335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     put_counter_w0(binop(Iop_Add32, mkexpr(counter), mkU32(1)));
11336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     iterate_if(binop(Iop_CmpNE32, mkexpr(counter), mkU32(length)));
11337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* Reset counter */
11339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     put_counter_dw0(mkU64(0));
11340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
11341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_BITWISE, mktemp(Ity_I32, mkU32(0)), False);
11343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
11345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, UDLB, UDXB), "xc", d, length, b, d, 0, b);
11346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NC(UChar length, IRTemp start1, IRTemp start2)
11350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len = newTemp(Ity_I32);
11352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len, mkU32(length));
11354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_xonc(Iop_And8, len, start1, start2);
11355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nc";
11357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OC(UChar length, IRTemp start1, IRTemp start2)
11361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len = newTemp(Ity_I32);
11363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len, mkU32(length));
11365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_xonc(Iop_Or8, len, start1, start2);
11366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oc";
11368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVC(UChar length, IRTemp start1, IRTemp start2)
11373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len = newTemp(Ity_I64);
11375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len, mkU64(length));
11377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_MVC_EX(len, start1, start2);
11378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mvc";
11380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVCL(UChar r1, UChar r2)
11384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr1 = newTemp(Ity_I64);
11386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr2 = newTemp(Ity_I64);
11387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr2_load = newTemp(Ity_I64);
11388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp r1p1 = newTemp(Ity_I32);   /* contents of r1 + 1 */
11389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp r2p1 = newTemp(Ity_I32);   /* contents of r2 + 1 */
11390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp len1 = newTemp(Ity_I32);
11391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp len2 = newTemp(Ity_I32);
11392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp pad = newTemp(Ity_I8);
11393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp single = newTemp(Ity_I8);
11394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr1, get_gpr_dw0(r1));
11396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(r1p1, get_gpr_w1(r1 + 1));
11397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len1, binop(Iop_And32, mkexpr(r1p1), mkU32(0x00ffffff)));
11398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr2, get_gpr_dw0(r2));
11399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(r2p1, get_gpr_w1(r2 + 1));
11400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len2, binop(Iop_And32, mkexpr(r2p1), mkU32(0x00ffffff)));
11401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(pad, get_gpr_b4(r2 + 1));
11402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* len1 == 0 ? */
11404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, len1, len2, False);
11405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ32, mkexpr(len1), mkU32(0)));
11406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Check for destructive overlap:
11408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr1 > addr2 && addr2 + len1 > addr1 && (addr2 + len2) > addr1 */
11409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(3);
11410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond1 = newTemp(Ity_I32);
11411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cond1, unop(Iop_1Uto32,
11412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      binop(Iop_CmpLT64U, mkexpr(addr2), mkexpr(addr1))));
11413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond2 = newTemp(Ity_I32);
11414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cond2, unop(Iop_1Uto32,
11415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      binop(Iop_CmpLT64U, mkexpr(addr1),
11416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            binop(Iop_Add64, mkexpr(addr2),
11417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  unop(Iop_32Uto64, mkexpr(len1))))));
11418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond3 = newTemp(Ity_I32);
11419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cond3, unop(Iop_1Uto32,
11420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      binop(Iop_CmpLT64U,
11421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            mkexpr(addr1),
11422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            binop(Iop_Add64, mkexpr(addr2),
11423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  unop(Iop_32Uto64, mkexpr(len2))))));
11424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ32,
11426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      binop(Iop_And32,
11427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            binop(Iop_And32, mkexpr(cond1), mkexpr(cond2)),
11428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            mkexpr(cond3)),
11429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      mkU32(1)));
11430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* See s390_irgen_CLCL for explanation why we cannot load directly
11432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      and need two steps. */
11433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr2_load,
11434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ32, mkexpr(len2), mkU32(0)),
11435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkU64(guest_IA_curr_instr), mkexpr(addr2)));
11436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(single,
11437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ32, mkexpr(len2), mkU32(0)),
11438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkexpr(pad), load(Ity_I8, mkexpr(addr2_load))));
11439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(addr1), mkexpr(single));
11441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Update addr1 and len1 */
11443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(addr1), mkU64(1)));
11444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, binop(Iop_Sub32, mkexpr(r1p1), mkU32(1)));
11445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Update addr2 and len2 */
11447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2,
11448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ32, mkexpr(len2), mkU32(0)),
11449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkexpr(addr2),
11450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     binop(Iop_Add64, mkexpr(addr2), mkU64(1))));
11451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* When updating len2 we must not modify bits (r2+1)[0:39] */
11453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r2 + 1,
11454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkite(binop(Iop_CmpEQ32, mkexpr(len2), mkU32(0)),
11455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    binop(Iop_And32, mkexpr(r2p1), mkU32(0xFF000000u)),
11456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    binop(Iop_Sub32, mkexpr(r2p1), mkU32(1))));
11457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, len1, len2, False);
11459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(binop(Iop_CmpNE32, mkexpr(len1), mkU32(1)));
11460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mvcl";
11462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVCLE(UChar r1, UChar r3, IRTemp pad2)
11467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr1, addr3, addr3_load, len1, len3, single;
11469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   addr1 = newTemp(Ity_I64);
11471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   addr3 = newTemp(Ity_I64);
11472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   addr3_load = newTemp(Ity_I64);
11473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   len1 = newTemp(Ity_I64);
11474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   len3 = newTemp(Ity_I64);
11475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   single = newTemp(Ity_I8);
11476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr1, get_gpr_dw0(r1));
11478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len1, get_gpr_dw0(r1 + 1));
11479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr3, get_gpr_dw0(r3));
11480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len3, get_gpr_dw0(r3 + 1));
11481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // len1 == 0 ?
11483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, len1, len3, False);
11484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64,mkexpr(len1), mkU64(0)));
11485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* This is a hack to prevent mvcle from reading from addr3 if it
11487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      should read from the pad. Since the pad has no address, just
11488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      read from the instruction, we discard that anyway */
11489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr3_load,
11490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0)),
11491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkU64(guest_IA_curr_instr), mkexpr(addr3)));
11492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(single,
11494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0)),
11495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                unop(Iop_64to8, mkexpr(pad2)),
11496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                load(Ity_I8, mkexpr(addr3_load))));
11497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(addr1), mkexpr(single));
11498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(addr1), mkU64(1)));
11500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1 + 1, binop(Iop_Sub64, mkexpr(len1), mkU64(1)));
11502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r3,
11504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0)),
11505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkexpr(addr3),
11506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     binop(Iop_Add64, mkexpr(addr3), mkU64(1))));
11507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r3 + 1,
11509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0)),
11510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkU64(0), binop(Iop_Sub64, mkexpr(len3), mkU64(1))));
11511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, len1, len3, False);
11513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(binop(Iop_CmpNE64, mkexpr(len1), mkU64(1)));
11514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mvcle";
11516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVST(UChar r1, UChar r2)
11520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr1 = newTemp(Ity_I64);
11522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr2 = newTemp(Ity_I64);
11523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp end = newTemp(Ity_I8);
11524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp byte = newTemp(Ity_I8);
11525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp counter = newTemp(Ity_I64);
11526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr1, get_gpr_dw0(r1));
11528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr2, get_gpr_dw0(r2));
11529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(counter, get_counter_dw0());
11530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(end, get_gpr_b7(0));
11531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(byte, load(Ity_I8, binop(Iop_Add64, mkexpr(addr2),mkexpr(counter))));
11532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64,mkexpr(addr1),mkexpr(counter)), mkexpr(byte));
11533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // We use unlimited as cpu-determined number
11535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
11536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(binop(Iop_CmpNE8, mkexpr(end), mkexpr(byte)));
11537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // and always set cc=1 at the end + update r1
11539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(1);
11540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(addr1), mkexpr(counter)));
11541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(mkU64(0));
11542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mvst";
11544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
11547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_divide_64to32(IROp op, UChar r1, IRTemp op2)
11548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
11550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
11551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, binop(Iop_32HLto64,
11553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     get_gpr_w1(r1),         // high 32 bits
11554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     get_gpr_w1(r1 + 1)));   // low  32 bits
11555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(op, mkexpr(op1), mkexpr(op2)));
11556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));   // remainder
11557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result))); // quotient
11558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
11561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_divide_128to64(IROp op, UChar r1, IRTemp op2)
11562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I128);
11564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
11565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, binop(Iop_64HLto128,
11567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     get_gpr_dw0(r1),         // high 64 bits
11568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     get_gpr_dw0(r1 + 1)));   // low  64 bits
11569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(op, mkexpr(op1), mkexpr(op2)));
11570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128HIto64, mkexpr(result)));   // remainder
11571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1 + 1, unop(Iop_128to64, mkexpr(result))); // quotient
11572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
11575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_divide_64to64(IROp op, UChar r1, IRTemp op2)
11576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
11578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
11579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1 + 1));
11581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(op, mkexpr(op1), mkexpr(op2)));
11582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128HIto64, mkexpr(result)));   // remainder
11583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1 + 1, unop(Iop_128to64, mkexpr(result))); // quotient
11584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DR(UChar r1, UChar r2)
11588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
11590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
11592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_64to32(Iop_DivModS64to32, r1, op2);
11594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dr";
11596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_D(UChar r1, IRTemp op2addr)
11600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
11602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
11604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_64to32(Iop_DivModS64to32, r1, op2);
11606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "d";
11608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DLR(UChar r1, UChar r2)
11612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
11614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
11616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_64to32(Iop_DivModU64to32, r1, op2);
11618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "dlr";
11620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DL(UChar r1, IRTemp op2addr)
11624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
11626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
11628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_64to32(Iop_DivModU64to32, r1, op2);
11630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dl";
11632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DLG(UChar r1, IRTemp op2addr)
11636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
11638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
11640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_128to64(Iop_DivModU128to64, r1, op2);
11642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dlg";
11644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DLGR(UChar r1, UChar r2)
11648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
11650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
11652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_128to64(Iop_DivModU128to64, r1, op2);
11654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dlgr";
11656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DSGR(UChar r1, UChar r2)
11660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
11662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
11664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_64to64(Iop_DivModS64to64, r1, op2);
11666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dsgr";
11668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DSG(UChar r1, IRTemp op2addr)
11672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
11674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
11676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_64to64(Iop_DivModS64to64, r1, op2);
11678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dsg";
11680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DSGFR(UChar r1, UChar r2)
11684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
11686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
11688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_64to64(Iop_DivModS64to64, r1, op2);
11690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dsgfr";
11692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DSGF(UChar r1, IRTemp op2addr)
11696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
11698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
11700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_64to64(Iop_DivModS64to64, r1, op2);
11702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dsgf";
11704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
11707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_load_ar_multiple(UChar r1, UChar r3, IRTemp op2addr)
11708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar reg;
11710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
11711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkexpr(op2addr));
11713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   reg = r1;
11714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do {
11715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp old = addr;
11716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg %= 16;
11718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_ar_w0(reg, load(Ity_I32, mkexpr(addr)));
11719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr = newTemp(Ity_I64);
11720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
11721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg++;
11722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } while (reg != (r3 + 1));
11723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAM(UChar r1, UChar r3, IRTemp op2addr)
11727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_load_ar_multiple(r1, r3, op2addr);
11729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lam";
11731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAMY(UChar r1, UChar r3, IRTemp op2addr)
11735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_load_ar_multiple(r1, r3, op2addr);
11737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lamy";
11739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
11742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_store_ar_multiple(UChar r1, UChar r3, IRTemp op2addr)
11743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar reg;
11745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
11746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkexpr(op2addr));
11748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   reg = r1;
11749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do {
11750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp old = addr;
11751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg %= 16;
11753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(addr), get_ar_w0(reg));
11754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr = newTemp(Ity_I64);
11755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
11756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg++;
11757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } while (reg != (r3 + 1));
11758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STAM(UChar r1, UChar r3, IRTemp op2addr)
11762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_store_ar_multiple(r1, r3, op2addr);
11764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stam";
11766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STAMY(UChar r1, UChar r3, IRTemp op2addr)
11770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_store_ar_multiple(r1, r3, op2addr);
11772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stamy";
11774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Implementation for 32-bit compare-and-swap */
11778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
11779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_cas_32(UChar r1, UChar r3, IRTemp op2addr)
11780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRCAS *cas;
11782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
11783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp old_mem = newTemp(Ity_I32);
11784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
11785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
11786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp nequal = newTemp(Ity_I1);
11787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
11789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
11790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* The first and second operands are compared. If they are equal,
11792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      the third operand is stored at the second- operand location. */
11793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   cas = mkIRCAS(IRTemp_INVALID, old_mem,
11794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 Iend_BE, mkexpr(op2addr),
11795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 NULL, mkexpr(op1), /* expected value */
11796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 NULL, mkexpr(op3)  /* new value */);
11797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_CAS(cas));
11798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Set CC. Operands compared equal -> 0, else 1. */
11800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(old_mem)));
11801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_BITWISE, result, False);
11802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* If operands were equal (cc == 0) just store the old value op1 in r1.
11804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Otherwise, store the old_value from memory in r1 and yield. */
11805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(nequal, binop(Iop_CmpNE32, s390_call_calculate_cc(), mkU32(0)));
11806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkite(mkexpr(nequal), mkexpr(old_mem), mkexpr(op1)));
11807663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   yield_if(mkexpr(nequal));
11808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CS(UChar r1, UChar r3, IRTemp op2addr)
11812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_cas_32(r1, r3, op2addr);
11814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cs";
11816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CSY(UChar r1, UChar r3, IRTemp op2addr)
11820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_cas_32(r1, r3, op2addr);
11822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "csy";
11824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CSG(UChar r1, UChar r3, IRTemp op2addr)
11828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRCAS *cas;
11830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
11831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp old_mem = newTemp(Ity_I64);
11832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
11833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
11834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp nequal = newTemp(Ity_I1);
11835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
11837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
11838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* The first and second operands are compared. If they are equal,
11840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      the third operand is stored at the second- operand location. */
11841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   cas = mkIRCAS(IRTemp_INVALID, old_mem,
11842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 Iend_BE, mkexpr(op2addr),
11843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 NULL, mkexpr(op1), /* expected value */
11844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 NULL, mkexpr(op3)  /* new value */);
11845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_CAS(cas));
11846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Set CC. Operands compared equal -> 0, else 1. */
11848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(old_mem)));
11849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_BITWISE, result, False);
11850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* If operands were equal (cc == 0) just store the old value op1 in r1.
11852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Otherwise, store the old_value from memory in r1 and yield. */
11853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(nequal, binop(Iop_CmpNE32, s390_call_calculate_cc(), mkU32(0)));
11854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkite(mkexpr(nequal), mkexpr(old_mem), mkexpr(op1)));
11855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   yield_if(mkexpr(nequal));
11856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "csg";
11858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Implementation for 32-bit compare-double-and-swap */
11861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
11862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_cdas_32(UChar r1, UChar r3, IRTemp op2addr)
11863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRCAS *cas;
11865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1_high = newTemp(Ity_I32);
11866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1_low  = newTemp(Ity_I32);
11867663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp old_mem_high = newTemp(Ity_I32);
11868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp old_mem_low  = newTemp(Ity_I32);
11869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op3_high = newTemp(Ity_I32);
11870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op3_low  = newTemp(Ity_I32);
11871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp result = newTemp(Ity_I32);
11872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp nequal = newTemp(Ity_I1);
11873663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1_high, get_gpr_w1(r1));
11875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1_low,  get_gpr_w1(r1+1));
11876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op3_high, get_gpr_w1(r3));
11877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op3_low,  get_gpr_w1(r3+1));
11878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* The first and second operands are compared. If they are equal,
11880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      the third operand is stored at the second-operand location. */
11881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   cas = mkIRCAS(old_mem_high, old_mem_low,
11882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 Iend_BE, mkexpr(op2addr),
11883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 mkexpr(op1_high), mkexpr(op1_low), /* expected value */
11884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 mkexpr(op3_high), mkexpr(op3_low)  /* new value */);
11885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_CAS(cas));
11886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Set CC. Operands compared equal -> 0, else 1. */
11888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(result, unop(Iop_1Uto32,
11889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          binop(Iop_CmpNE32,
11890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                binop(Iop_Or32,
11891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      binop(Iop_Xor32, mkexpr(op1_high), mkexpr(old_mem_high)),
11892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      binop(Iop_Xor32, mkexpr(op1_low), mkexpr(old_mem_low))),
11893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                mkU32(0))));
11894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_thunk_put1(S390_CC_OP_BITWISE, result, False);
11896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* If operands were equal (cc == 0) just store the old value op1 in r1.
11898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Otherwise, store the old_value from memory in r1 and yield. */
11899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(nequal, binop(Iop_CmpNE32, s390_call_calculate_cc(), mkU32(0)));
11900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_w1(r1,   mkite(mkexpr(nequal), mkexpr(old_mem_high), mkexpr(op1_high)));
11901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_w1(r1+1, mkite(mkexpr(nequal), mkexpr(old_mem_low),  mkexpr(op1_low)));
11902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   yield_if(mkexpr(nequal));
11903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CDS(UChar r1, UChar r3, IRTemp op2addr)
11907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_cdas_32(r1, r3, op2addr);
11909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cds";
11911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CDSY(UChar r1, UChar r3, IRTemp op2addr)
11915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_cdas_32(r1, r3, op2addr);
11917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cdsy";
11919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CDSG(UChar r1, UChar r3, IRTemp op2addr)
11923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRCAS *cas;
11925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1_high = newTemp(Ity_I64);
11926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1_low  = newTemp(Ity_I64);
11927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp old_mem_high = newTemp(Ity_I64);
11928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp old_mem_low  = newTemp(Ity_I64);
11929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op3_high = newTemp(Ity_I64);
11930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op3_low  = newTemp(Ity_I64);
11931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp result = newTemp(Ity_I64);
11932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp nequal = newTemp(Ity_I1);
11933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1_high, get_gpr_dw0(r1));
11935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1_low,  get_gpr_dw0(r1+1));
11936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op3_high, get_gpr_dw0(r3));
11937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op3_low,  get_gpr_dw0(r3+1));
11938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* The first and second operands are compared. If they are equal,
11940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      the third operand is stored at the second-operand location. */
11941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   cas = mkIRCAS(old_mem_high, old_mem_low,
11942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 Iend_BE, mkexpr(op2addr),
11943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 mkexpr(op1_high), mkexpr(op1_low), /* expected value */
11944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 mkexpr(op3_high), mkexpr(op3_low)  /* new value */);
11945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_CAS(cas));
11946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Set CC. Operands compared equal -> 0, else 1. */
11948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(result, unop(Iop_1Uto64,
11949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          binop(Iop_CmpNE64,
11950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                binop(Iop_Or64,
11951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      binop(Iop_Xor64, mkexpr(op1_high), mkexpr(old_mem_high)),
11952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      binop(Iop_Xor64, mkexpr(op1_low), mkexpr(old_mem_low))),
11953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                mkU64(0))));
11954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_thunk_put1(S390_CC_OP_BITWISE, result, False);
11956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* If operands were equal (cc == 0) just store the old value op1 in r1.
11958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Otherwise, store the old_value from memory in r1 and yield. */
11959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(nequal, binop(Iop_CmpNE32, s390_call_calculate_cc(), mkU32(0)));
11960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1,   mkite(mkexpr(nequal), mkexpr(old_mem_high), mkexpr(op1_high)));
11961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1+1, mkite(mkexpr(nequal), mkexpr(old_mem_low),  mkexpr(op1_low)));
11962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   yield_if(mkexpr(nequal));
11963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cdsg";
11965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Binary floating point */
11969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AXBR(UChar r1, UChar r2)
11972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F128);
11974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F128);
11975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
11976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
11977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_pair(r1));
11979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_pair(r2));
11980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_AddF128, mkexpr(rounding_mode), mkexpr(op1),
11981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        mkexpr(op2)));
11982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
11983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
11985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "axbr";
11987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
11990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CEBR(UChar r1, UChar r2)
11991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
11993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
11994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_vex  = newTemp(Ity_I32);
11995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_s390 = newTemp(Ity_I32);
11996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
11998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_w0(r2));
11999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cc_vex, binop(Iop_CmpF32, mkexpr(op1), mkexpr(op2)));
12000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(cc_s390, convert_vex_bfpcc_to_s390(cc_vex));
12002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
12003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cebr";
12005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CDBR(UChar r1, UChar r2)
12009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F64);
12011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F64);
12012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_vex  = newTemp(Ity_I32);
12013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_s390 = newTemp(Ity_I32);
12014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_dw0(r1));
12016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_dw0(r2));
12017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cc_vex, binop(Iop_CmpF64, mkexpr(op1), mkexpr(op2)));
12018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(cc_s390, convert_vex_bfpcc_to_s390(cc_vex));
12020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
12021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cdbr";
12023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CXBR(UChar r1, UChar r2)
12027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F128);
12029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F128);
12030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_vex  = newTemp(Ity_I32);
12031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_s390 = newTemp(Ity_I32);
12032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_pair(r1));
12034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_pair(r2));
12035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cc_vex, binop(Iop_CmpF128, mkexpr(op1), mkexpr(op2)));
12036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(cc_s390, convert_vex_bfpcc_to_s390(cc_vex));
12038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
12039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cxbr";
12041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CEB(UChar r1, IRTemp op2addr)
12045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
12047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
12048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_vex  = newTemp(Ity_I32);
12049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_s390 = newTemp(Ity_I32);
12050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
12052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_F32, mkexpr(op2addr)));
12053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cc_vex,  binop(Iop_CmpF32, mkexpr(op1), mkexpr(op2)));
12054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(cc_s390, convert_vex_bfpcc_to_s390(cc_vex));
12056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
12057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ceb";
12059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CDB(UChar r1, IRTemp op2addr)
12063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F64);
12065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F64);
12066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_vex  = newTemp(Ity_I32);
12067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_s390 = newTemp(Ity_I32);
12068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_dw0(r1));
12070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_F64, mkexpr(op2addr)));
12071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cc_vex, binop(Iop_CmpF64, mkexpr(op1), mkexpr(op2)));
12072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(cc_s390, convert_vex_bfpcc_to_s390(cc_vex));
12074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
12075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cdb";
12077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CXFBR(UChar m3 __attribute__((unused)),
12081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar m4 __attribute__((unused)), UChar r1, UChar r2)
12082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
12084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
12086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, unop(Iop_I32StoF128, mkexpr(op2)));
12087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cxfbr";
12089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CXLFBR(UChar m3 __attribute__((unused)),
12093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar m4 __attribute__((unused)), UChar r1, UChar r2)
12094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
12095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
12096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
12097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
12098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op2 = newTemp(Ity_I32);
12099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op2, get_gpr_w1(r2));
12101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_fpr_pair(r1, unop(Iop_I32UtoF128, mkexpr(op2)));
12102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
12103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cxlfbr";
12104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
12105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CXGBR(UChar m3 __attribute__((unused)),
12109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar m4 __attribute__((unused)), UChar r1, UChar r2)
12110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
12112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
12114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, unop(Iop_I64StoF128, mkexpr(op2)));
12115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cxgbr";
12117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CXLGBR(UChar m3 __attribute__((unused)),
12121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar m4 __attribute__((unused)), UChar r1, UChar r2)
12122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
12123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
12124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
12125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
12126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op2 = newTemp(Ity_I64);
12127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op2, get_gpr_dw0(r2));
12129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_fpr_pair(r1, unop(Iop_I64UtoF128, mkexpr(op2)));
12130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
12131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "cxlgbr";
12132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
12133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CFXBR(UChar m3, UChar m4 __attribute__((unused)),
12136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
12137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F128);
12139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
12140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
12141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_pair(r2));
12143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, binop(Iop_F128toI32S, mkexpr(rounding_mode),
12144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        mkexpr(op)));
12145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
12146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1f128Z(S390_CC_OP_BFP_128_TO_INT_32, op, rounding_mode);
12147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cfxbr";
12149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CLFXBR(UChar m3, UChar m4 __attribute__((unused)),
12153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar r1, UChar r2)
12154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
12155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
12156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
12157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
12158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op = newTemp(Ity_F128);
12159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp result = newTemp(Ity_I32);
12160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
12161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op, get_fpr_pair(r2));
12163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(result, binop(Iop_F128toI32U, mkexpr(rounding_mode),
12164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           mkexpr(op)));
12165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_gpr_w1(r1, mkexpr(result));
12166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_cc_thunk_put1f128Z(S390_CC_OP_BFP_128_TO_UINT_32, op, rounding_mode);
12167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
12168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "clfxbr";
12169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
12170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CGXBR(UChar m3, UChar m4 __attribute__((unused)),
12174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
12175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F128);
12177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
12178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
12179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_pair(r2));
12181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, binop(Iop_F128toI64S, mkexpr(rounding_mode),
12182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        mkexpr(op)));
12183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
12184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390_cc_thunk_put1f128Z(S390_CC_OP_BFP_128_TO_INT_64, op, rounding_mode);
12185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgxbr";
12187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_CLGXBR(UChar m3, UChar m4 __attribute__((unused)),
12191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UChar r1, UChar r2)
12192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
12193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext) {
12194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_fpext);
12195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
12196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp op = newTemp(Ity_F128);
12197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp result = newTemp(Ity_I64);
12198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp rounding_mode = encode_bfp_rounding_mode(m3);
12199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(op, get_fpr_pair(r2));
12201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(result, binop(Iop_F128toI64U, mkexpr(rounding_mode),
12202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           mkexpr(op)));
12203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_gpr_dw0(r1, mkexpr(result));
12204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_cc_thunk_put1f128Z(S390_CC_OP_BFP_128_TO_UINT_64, op,
12205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              rounding_mode);
12206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
12207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "clgxbr";
12208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
12209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DXBR(UChar r1, UChar r2)
12212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F128);
12214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F128);
12215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
12216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
12217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_pair(r1));
12219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_pair(r2));
12220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_DivF128, mkexpr(rounding_mode), mkexpr(op1),
12221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        mkexpr(op2)));
12222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
12223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dxbr";
12225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LTXBR(UChar r1, UChar r2)
12229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
12231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, get_fpr_pair(r2));
12233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
12234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
12235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ltxbr";
12237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LCXBR(UChar r1, UChar r2)
12241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
12243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_NegF128, get_fpr_pair(r2)));
12245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
12246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
12247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lcxbr";
12249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LXDBR(UChar r1, UChar r2)
12253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F64);
12255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_dw0(r2));
12257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, unop(Iop_F64toF128, mkexpr(op)));
12258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lxdbr";
12260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LXEBR(UChar r1, UChar r2)
12264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F32);
12266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_w0(r2));
12268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, unop(Iop_F32toF128, mkexpr(op)));
12269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lxebr";
12271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LXDB(UChar r1, IRTemp op2addr)
12275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F64);
12277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, load(Ity_F64, mkexpr(op2addr)));
12279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, unop(Iop_F64toF128, mkexpr(op)));
12280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lxdb";
12282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LXEB(UChar r1, IRTemp op2addr)
12286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F32);
12288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, load(Ity_F32, mkexpr(op2addr)));
12290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, unop(Iop_F32toF128, mkexpr(op)));
12291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lxeb";
12293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LNEBR(UChar r1, UChar r2)
12297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
12299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_NegF32, unop(Iop_AbsF32, get_fpr_w0(r2))));
12301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
12302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f(S390_CC_OP_BFP_RESULT_32, result);
12303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lnebr";
12305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LNDBR(UChar r1, UChar r2)
12309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
12311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_NegF64, unop(Iop_AbsF64, get_fpr_dw0(r2))));
12313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
12314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f(S390_CC_OP_BFP_RESULT_64, result);
12315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lndbr";
12317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LNXBR(UChar r1, UChar r2)
12321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
12323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_NegF128, unop(Iop_AbsF128, get_fpr_pair(r2))));
12325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
12326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
12327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lnxbr";
12329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LPEBR(UChar r1, UChar r2)
12333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
12335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_AbsF32, get_fpr_w0(r2)));
12337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
12338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f(S390_CC_OP_BFP_RESULT_32, result);
12339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lpebr";
12341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LPDBR(UChar r1, UChar r2)
12345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
12347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_AbsF64, get_fpr_dw0(r2)));
12349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
12350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f(S390_CC_OP_BFP_RESULT_64, result);
12351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lpdbr";
12353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LPXBR(UChar r1, UChar r2)
12357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
12359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_AbsF128, get_fpr_pair(r2)));
12361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
12362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
12363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lpxbr";
12365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_LDXBR(UChar m3, UChar m4 __attribute__((unused)),
12369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
12370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m3 != S390_BFP_ROUND_PER_FPC) {
12372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
12373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m3 = S390_BFP_ROUND_PER_FPC;
12374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
12375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
12376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, binop(Iop_F128toF64, mkexpr(encode_bfp_rounding_mode(m3)),
12378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        get_fpr_pair(r2)));
12379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
12380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ldxbr";
12382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_LEXBR(UChar m3, UChar m4 __attribute__((unused)),
12386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UChar r1, UChar r2)
12387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_fpext && m3 != S390_BFP_ROUND_PER_FPC) {
12389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_warning(EmWarn_S390X_fpext_rounding);
12390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      m3 = S390_BFP_ROUND_PER_FPC;
12391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
12392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
12393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, binop(Iop_F128toF32, mkexpr(encode_bfp_rounding_mode(m3)),
12395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        get_fpr_pair(r2)));
12396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
12397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lexbr";
12399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MXBR(UChar r1, UChar r2)
12403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F128);
12405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F128);
12406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
12407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
12408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_pair(r1));
12410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_pair(r2));
12411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_MulF128, mkexpr(rounding_mode), mkexpr(op1),
12412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        mkexpr(op2)));
12413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
12414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mxbr";
12416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MAEBR(UChar r1, UChar r3, UChar r2)
12420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
12422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_w0(r1, qop(Iop_MAddF32, mkexpr(rounding_mode),
12424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      get_fpr_w0(r3), get_fpr_w0(r2), get_fpr_w0(r1)));
12425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "maebr";
12427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MADBR(UChar r1, UChar r3, UChar r2)
12431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
12433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_dw0(r1, qop(Iop_MAddF64, mkexpr(rounding_mode),
12435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       get_fpr_dw0(r3), get_fpr_dw0(r2), get_fpr_dw0(r1)));
12436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "madbr";
12438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MAEB(UChar r3, IRTemp op2addr, UChar r1)
12442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op2 = load(Ity_F32, mkexpr(op2addr));
12444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
12445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_w0(r1, qop(Iop_MAddF32, mkexpr(rounding_mode),
12447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      get_fpr_w0(r3), op2, get_fpr_w0(r1)));
12448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "maeb";
12450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MADB(UChar r3, IRTemp op2addr, UChar r1)
12454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op2 = load(Ity_F64, mkexpr(op2addr));
12456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
12457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_dw0(r1, qop(Iop_MAddF64, mkexpr(rounding_mode),
12459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       get_fpr_dw0(r3), op2, get_fpr_dw0(r1)));
12460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "madb";
12462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSEBR(UChar r1, UChar r3, UChar r2)
12466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
12468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_w0(r1, qop(Iop_MSubF32, mkexpr(rounding_mode),
12470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      get_fpr_w0(r3), get_fpr_w0(r2), get_fpr_w0(r1)));
12471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msebr";
12473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSDBR(UChar r1, UChar r3, UChar r2)
12477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
12479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_dw0(r1, qop(Iop_MSubF64, mkexpr(rounding_mode),
12481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       get_fpr_dw0(r3), get_fpr_dw0(r2), get_fpr_dw0(r1)));
12482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msdbr";
12484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSEB(UChar r3, IRTemp op2addr, UChar r1)
12488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op2 = load(Ity_F32, mkexpr(op2addr));
12490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
12491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_w0(r1, qop(Iop_MSubF32, mkexpr(rounding_mode),
12493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      get_fpr_w0(r3), op2, get_fpr_w0(r1)));
12494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mseb";
12496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSDB(UChar r3, IRTemp op2addr, UChar r1)
12500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op2 = load(Ity_F64, mkexpr(op2addr));
12502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
12503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_dw0(r1, qop(Iop_MSubF64, mkexpr(rounding_mode),
12505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       get_fpr_dw0(r3), op2, get_fpr_dw0(r1)));
12506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msdb";
12508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SQEBR(UChar r1, UChar r2)
12512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
12514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
12515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, binop(Iop_SqrtF32, mkexpr(rounding_mode), get_fpr_w0(r2)));
12517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
12518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sqebr";
12520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SQDBR(UChar r1, UChar r2)
12524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
12526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
12527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, binop(Iop_SqrtF64, mkexpr(rounding_mode), get_fpr_dw0(r2)));
12529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
12530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sqdbr";
12532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SQXBR(UChar r1, UChar r2)
12536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
12538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
12539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, binop(Iop_SqrtF128, mkexpr(rounding_mode),
12541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        get_fpr_pair(r2)));
12542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
12543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sqxbr";
12545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SQEB(UChar r1, IRTemp op2addr)
12549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F32);
12551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
12552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, load(Ity_F32, mkexpr(op2addr)));
12554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_w0(r1, binop(Iop_SqrtF32, mkexpr(rounding_mode), mkexpr(op)));
12555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sqeb";
12557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SQDB(UChar r1, IRTemp op2addr)
12561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F64);
12563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
12564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, load(Ity_F64, mkexpr(op2addr)));
12566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   put_fpr_dw0(r1, binop(Iop_SqrtF64, mkexpr(rounding_mode), mkexpr(op)));
12567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sqdb";
12569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SXBR(UChar r1, UChar r2)
12573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F128);
12575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F128);
12576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
12577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp rounding_mode = encode_bfp_rounding_mode(S390_BFP_ROUND_PER_FPC);
12578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_pair(r1));
12580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_pair(r2));
12581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(result, triop(Iop_SubF128, mkexpr(rounding_mode), mkexpr(op1),
12582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        mkexpr(op2)));
12583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
12584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
12585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sxbr";
12587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TCEB(UChar r1, IRTemp op2addr)
12591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_F32);
12593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_fpr_w0(r1));
12595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putFZ(S390_CC_OP_BFP_TDC_32, value, op2addr);
12597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tceb";
12599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TCDB(UChar r1, IRTemp op2addr)
12603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_F64);
12605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_fpr_dw0(r1));
12607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putFZ(S390_CC_OP_BFP_TDC_64, value, op2addr);
12609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tcdb";
12611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TCXB(UChar r1, IRTemp op2addr)
12615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_F128);
12617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_fpr_pair(r1));
12619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f128Z(S390_CC_OP_BFP_TDC_128, value, op2addr);
12621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tcxb";
12623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LCDFR(UChar r1, UChar r2)
12627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
12629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_NegF64, get_fpr_dw0(r2)));
12631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
12632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lcdfr";
12634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LNDFR(UChar r1, UChar r2)
12638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
12640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_NegF64, unop(Iop_AbsF64, get_fpr_dw0(r2))));
12642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
12643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lndfr";
12645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LPDFR(UChar r1, UChar r2)
12649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
12651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_AbsF64, get_fpr_dw0(r2)));
12653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
12654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lpdfr";
12656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LDGR(UChar r1, UChar r2)
12660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, unop(Iop_ReinterpI64asF64, get_gpr_dw0(r2)));
12662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ldgr";
12664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGDR(UChar r1, UChar r2)
12668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_ReinterpF64asI64, get_fpr_dw0(r2)));
12670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgdr";
12672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CPSDR(UChar r3, UChar r1, UChar r2)
12677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp sign  = newTemp(Ity_I64);
12679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I64);
12680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(sign, binop(Iop_And64, unop(Iop_ReinterpF64asI64, get_fpr_dw0(r3)),
12682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      mkU64(1ULL << 63)));
12683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, binop(Iop_And64, unop(Iop_ReinterpF64asI64, get_fpr_dw0(r2)),
12684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64((1ULL << 63) - 1)));
12685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, unop(Iop_ReinterpI64asF64, binop(Iop_Or64, mkexpr(value),
12686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                    mkexpr(sign))));
12687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cpsdr";
12689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRExpr *
12693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_call_cvb(IRExpr *in)
12694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr **args, *call;
12696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   args = mkIRExprVec_1(in);
12698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call = mkIRExprCCall(Ity_I32, 0 /*regparm*/,
12699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        "s390_do_cvb", &s390_do_cvb, args);
12700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Nothing is excluded from definedness checking. */
12702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call->Iex.CCall.cee->mcx_mask = 0;
12703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return call;
12705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CVB(UChar r1, IRTemp op2addr)
12709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, s390_call_cvb(load(Ity_I64, mkexpr(op2addr))));
12711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cvb";
12713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CVBY(UChar r1, IRTemp op2addr)
12717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, s390_call_cvb(load(Ity_I64, mkexpr(op2addr))));
12719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cvby";
12721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *
12725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_cvd(IRExpr *in)
12726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call;
12728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   args = mkIRExprVec_1(in);
12730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call = mkIRExprCCall(Ity_I64, 0 /*regparm*/,
12731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        "s390_do_cvd", &s390_do_cvd, args);
12732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Nothing is excluded from definedness checking. */
12734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call->Iex.CCall.cee->mcx_mask = 0;
12735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return call;
12737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CVD(UChar r1, IRTemp op2addr)
12741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   store(mkexpr(op2addr), s390_call_cvd(unop(Iop_32Uto64, get_gpr_w1(r1))));
12743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cvd";
12745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CVDY(UChar r1, IRTemp op2addr)
12749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), s390_call_cvd(get_gpr_w1(r1)));
12751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cvdy";
12753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_FLOGR(UChar r1, UChar r2)
12757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp input    = newTemp(Ity_I64);
12759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp not_zero = newTemp(Ity_I64);
12760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp tmpnum   = newTemp(Ity_I64);
12761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp num      = newTemp(Ity_I64);
12762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp shift_amount = newTemp(Ity_I8);
12763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* We use the "count leading zeroes" operator because the number of
12765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      leading zeroes is identical with the bit position of the first '1' bit.
12766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      However, that operator does not work when the input value is zero.
12767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Therefore, we set the LSB of the input value to 1 and use Clz64 on
12768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      the modified value. If input == 0, then the result is 64. Otherwise,
12769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      the result of Clz64 is what we want. */
12770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(input, get_gpr_dw0(r2));
12772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(not_zero, binop(Iop_Or64, mkexpr(input), mkU64(1)));
12773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(tmpnum, unop(Iop_Clz64, mkexpr(not_zero)));
12774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* num = (input == 0) ? 64 : tmpnum */
12776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(num, mkite(binop(Iop_CmpEQ64, mkexpr(input), mkU64(0)),
12777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     /* == 0 */ mkU64(64),
12778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     /* != 0 */ mkexpr(tmpnum)));
12779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(num));
12781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Set the leftmost '1' bit of the input value to zero. The general scheme
12783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      is to first shift the input value by NUM + 1 bits to the left which
12784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      causes the leftmost '1' bit to disappear. Then we shift logically to
12785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      the right by NUM + 1 bits. Because the semantics of Iop_Shl64 and
12786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Iop_Shr64 are undefined if the shift-amount is greater than or equal to
12787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      the width of the value-to-be-shifted, we need to special case
12788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      NUM + 1 >= 64. This is equivalent to INPUT != 0 && INPUT != 1.
12789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      For both such INPUT values the result will be 0. */
12790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(shift_amount, unop(Iop_64to8, binop(Iop_Add64, mkexpr(num),
12792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                          mkU64(1))));
12793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1 + 1,
12795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpLE64U, mkexpr(input), mkU64(1)),
12796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     /* == 0 || == 1*/ mkU64(0),
12797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     /* otherwise */
12798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     binop(Iop_Shr64,
12799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           binop(Iop_Shl64, mkexpr(input),
12800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 mkexpr(shift_amount)),
12801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           mkexpr(shift_amount))));
12802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Compare the original value as an unsigned integer with 0. */
12804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, input,
12805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      mktemp(Ity_I64, mkU64(0)), False);
12806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "flogr";
12808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STCK(IRTemp op2addr)
12812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRDirty *d;
12814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc = newTemp(Ity_I64);
12815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_STCK",
12817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         &s390x_dirtyhelper_STCK,
12818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         mkIRExprVec_1(mkexpr(op2addr)));
12819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mFx   = Ifx_Write;
12820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mAddr = mkexpr(op2addr);
12821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mSize = 8;
12822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Dirty(d));
12823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(mkU64(S390_CC_OP_SET),
12824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      mkexpr(cc), mkU64(0), mkU64(0));
12825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stck";
12826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STCKF(IRTemp op2addr)
12830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_stckf) {
12832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_stckf);
12833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
12834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp cc = newTemp(Ity_I64);
12835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRDirty *d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_STCKF",
12837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     &s390x_dirtyhelper_STCKF,
12838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkIRExprVec_1(mkexpr(op2addr)));
12839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d->mFx   = Ifx_Write;
12840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d->mAddr = mkexpr(op2addr);
12841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d->mSize = 8;
12842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_Dirty(d));
12843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s390_cc_thunk_fill(mkU64(S390_CC_OP_SET),
12844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         mkexpr(cc), mkU64(0), mkU64(0));
12845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
12846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stckf";
12847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STCKE(IRTemp op2addr)
12851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRDirty *d;
12853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc = newTemp(Ity_I64);
12854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_STCKE",
12856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         &s390x_dirtyhelper_STCKE,
12857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         mkIRExprVec_1(mkexpr(op2addr)));
12858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mFx   = Ifx_Write;
12859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mAddr = mkexpr(op2addr);
12860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mSize = 16;
12861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Dirty(d));
12862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(mkU64(S390_CC_OP_SET),
12863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      mkexpr(cc), mkU64(0), mkU64(0));
12864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stcke";
12865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STFLE(IRTemp op2addr)
12869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_stfle) {
12871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_stfle);
12872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return "stfle";
12873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
12874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRDirty *d;
12876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc = newTemp(Ity_I64);
12877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* IRExpr_BBPTR() => Need to pass pointer to guest state to helper */
12879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_STFLE",
12880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         &s390x_dirtyhelper_STFLE,
12881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         mkIRExprVec_2(IRExpr_BBPTR(), mkexpr(op2addr)));
12882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   d->nFxState = 1;
12884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_bzero(&d->fxState, sizeof(d->fxState));
12885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->fxState[0].fx     = Ifx_Modify;  /* read then write */
12887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->fxState[0].offset = S390X_GUEST_OFFSET(guest_r0);
12888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->fxState[0].size   = sizeof(ULong);
12889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mAddr = mkexpr(op2addr);
12891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Pretend all double words are written */
12892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mSize = S390_NUM_FACILITY_DW * sizeof(ULong);
12893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mFx   = Ifx_Write;
12894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Dirty(d));
12896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(mkU64(S390_CC_OP_SET), mkexpr(cc), mkU64(0), mkU64(0));
12898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stfle";
12900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CKSM(UChar r1,UChar r2)
12904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
12906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I32);
12907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp len = newTemp(Ity_I64);
12908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp oldval = newTemp(Ity_I32);
12909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp mask = newTemp(Ity_I32);
12910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp newop = newTemp(Ity_I32);
12911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
12912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result1 = newTemp(Ity_I32);
12913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp inc = newTemp(Ity_I64);
12914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(oldval, get_gpr_w1(r1));
12916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, get_gpr_dw0(r2));
12917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len, get_gpr_dw0(r2+1));
12918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Condition code is always zero. */
12920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(0);
12921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* If length is zero, there is no need to calculate the checksum */
12923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, mkexpr(len), mkU64(0)));
12924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Assiging the increment variable to adjust address and length
12926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      later on. */
12927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(inc, mkite(binop(Iop_CmpLT64U, mkexpr(len), mkU64(4)),
12928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           mkexpr(len), mkU64(4)));
12929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* If length < 4 the final 4-byte 2nd operand value is computed by
12931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      appending the remaining bytes to the right with 0. This is done
12932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      by AND'ing the 4 bytes loaded from memory with an appropriate
12933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask. If length >= 4, that mask is simply 0xffffffff. */
12934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(mask, mkite(binop(Iop_CmpLT64U, mkexpr(len), mkU64(4)),
12936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      /* Mask computation when len < 4:
12937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         0xffffffff << (32 - (len % 4)*8) */
12938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      binop(Iop_Shl32, mkU32(0xffffffff),
12939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            unop(Iop_32to8,
12940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 binop(Iop_Sub32, mkU32(32),
12941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       binop(Iop_Shl32,
12942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                             unop(Iop_64to32,
12943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                  binop(Iop_And64,
12944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                        mkexpr(len), mkU64(3))),
12945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                             mkU8(3))))),
12946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      mkU32(0xffffffff)));
12947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, load(Ity_I32, mkexpr(addr)));
12949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(newop, binop(Iop_And32, mkexpr(op), mkexpr(mask)));
12950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(newop), mkexpr(oldval)));
12951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Checking for carry */
12953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result1, mkite(binop(Iop_CmpLT32U, mkexpr(result), mkexpr(newop)),
12954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         binop(Iop_Add32, mkexpr(result), mkU32(1)),
12955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         mkexpr(result)));
12956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result1));
12958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2, binop(Iop_Add64, mkexpr(addr), mkexpr(inc)));
12959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2+1, binop(Iop_Sub64, mkexpr(len), mkexpr(inc)));
12960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(binop(Iop_CmpNE64, mkexpr(len), mkU64(0)));
12962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cksm";
12964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
12967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_TROO(UChar m3, UChar r1, UChar r2)
12968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
12969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp src_addr, des_addr, tab_addr, src_len, test_byte;
12970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_addr = newTemp(Ity_I64);
12971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   des_addr = newTemp(Ity_I64);
12972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   tab_addr = newTemp(Ity_I64);
12973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_byte = newTemp(Ity_I8);
12974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_len = newTemp(Ity_I64);
12975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_addr, get_gpr_dw0(r2));
12977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(des_addr, get_gpr_dw0(r1));
12978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(tab_addr, get_gpr_dw0(1));
12979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_len, get_gpr_dw0(r1+1));
12980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(test_byte, get_gpr_b7(0));
12981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op = newTemp(Ity_I8);
12983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1 = newTemp(Ity_I8);
12984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp result = newTemp(Ity_I64);
12985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* End of source string? We're done; proceed to next insn */
12987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
12988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, mkexpr(src_len), mkU64(0)));
12989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Load character from source string, index translation table and
12991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      store translated character in op1. */
12992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op, load(Ity_I8, mkexpr(src_addr)));
12993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(result, binop(Iop_Add64, unop(Iop_8Uto64, mkexpr(op)),
12995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        mkexpr(tab_addr)));
12996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1, load(Ity_I8, mkexpr(result)));
12997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (! s390_host_has_etf2 || (m3 & 0x1) == 0) {
12999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_cc_set(1);
13000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      next_insn_if(binop(Iop_CmpEQ8, mkexpr(op1), mkexpr(test_byte)));
13001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
13002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   store(get_gpr_dw0(r1), mkexpr(op1));
13003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(des_addr), mkU64(1)));
13005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2, binop(Iop_Add64, mkexpr(src_addr), mkU64(1)));
13006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1+1, binop(Iop_Sub64, mkexpr(src_len), mkU64(1)));
13007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
13009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "troo";
13011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
13014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_TRTO(UChar m3, UChar r1, UChar r2)
13015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp src_addr, des_addr, tab_addr, src_len, test_byte;
13017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_addr = newTemp(Ity_I64);
13018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   des_addr = newTemp(Ity_I64);
13019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   tab_addr = newTemp(Ity_I64);
13020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_byte = newTemp(Ity_I8);
13021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_len = newTemp(Ity_I64);
13022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_addr, get_gpr_dw0(r2));
13024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(des_addr, get_gpr_dw0(r1));
13025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(tab_addr, get_gpr_dw0(1));
13026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_len, get_gpr_dw0(r1+1));
13027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(test_byte, get_gpr_b7(0));
13028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op = newTemp(Ity_I16);
13030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1 = newTemp(Ity_I8);
13031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp result = newTemp(Ity_I64);
13032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* End of source string? We're done; proceed to next insn */
13034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
13035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, mkexpr(src_len), mkU64(0)));
13036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Load character from source string, index translation table and
13038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      store translated character in op1. */
13039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op, load(Ity_I16, mkexpr(src_addr)));
13040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(result, binop(Iop_Add64, unop(Iop_16Uto64, mkexpr(op)),
13042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        mkexpr(tab_addr)));
13043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1, load(Ity_I8, mkexpr(result)));
13045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (! s390_host_has_etf2 || (m3 & 0x1) == 0) {
13047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_cc_set(1);
13048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      next_insn_if(binop(Iop_CmpEQ8, mkexpr(op1), mkexpr(test_byte)));
13049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
13050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   store(get_gpr_dw0(r1), mkexpr(op1));
13051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2, binop(Iop_Add64, mkexpr(src_addr), mkU64(2)));
13053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(des_addr), mkU64(1)));
13054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1+1, binop(Iop_Sub64, mkexpr(src_len), mkU64(2)));
13055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
13057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "trto";
13059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
13062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_TROT(UChar m3, UChar r1, UChar r2)
13063663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp src_addr, des_addr, tab_addr, src_len, test_byte;
13065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_addr = newTemp(Ity_I64);
13066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   des_addr = newTemp(Ity_I64);
13067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   tab_addr = newTemp(Ity_I64);
13068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_byte = newTemp(Ity_I16);
13069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_len = newTemp(Ity_I64);
13070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_addr, get_gpr_dw0(r2));
13072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(des_addr, get_gpr_dw0(r1));
13073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(tab_addr, get_gpr_dw0(1));
13074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_len, get_gpr_dw0(r1+1));
13075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(test_byte, get_gpr_hw3(0));
13076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op = newTemp(Ity_I8);
13078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1 = newTemp(Ity_I16);
13079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp result = newTemp(Ity_I64);
13080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* End of source string? We're done; proceed to next insn */
13082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
13083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, mkexpr(src_len), mkU64(0)));
13084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Load character from source string, index translation table and
13086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      store translated character in op1. */
13087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op, binop(Iop_Shl8, load(Ity_I8, mkexpr(src_addr)), mkU8(1)));
13088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(result, binop(Iop_Add64, unop(Iop_8Uto64, mkexpr(op)),
13090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        mkexpr(tab_addr)));
13091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1, load(Ity_I16, mkexpr(result)));
13092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (! s390_host_has_etf2 || (m3 & 0x1) == 0) {
13094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_cc_set(1);
13095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      next_insn_if(binop(Iop_CmpEQ16, mkexpr(op1), mkexpr(test_byte)));
13096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
13097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   store(get_gpr_dw0(r1), mkexpr(op1));
13098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2, binop(Iop_Add64, mkexpr(src_addr), mkU64(1)));
13100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(des_addr), mkU64(2)));
13101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1+1, binop(Iop_Sub64, mkexpr(src_len), mkU64(1)));
13102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
13104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "trot";
13106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
13109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_TRTT(UChar m3, UChar r1, UChar r2)
13110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp src_addr, des_addr, tab_addr, src_len, test_byte;
13112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_addr = newTemp(Ity_I64);
13113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   des_addr = newTemp(Ity_I64);
13114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   tab_addr = newTemp(Ity_I64);
13115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_byte = newTemp(Ity_I16);
13116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_len = newTemp(Ity_I64);
13117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_addr, get_gpr_dw0(r2));
13119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(des_addr, get_gpr_dw0(r1));
13120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(tab_addr, get_gpr_dw0(1));
13121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_len, get_gpr_dw0(r1+1));
13122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(test_byte, get_gpr_hw3(0));
13123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op = newTemp(Ity_I16);
13125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1 = newTemp(Ity_I16);
13126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp result = newTemp(Ity_I64);
13127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* End of source string? We're done; proceed to next insn */
13129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
13130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, mkexpr(src_len), mkU64(0)));
13131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Load character from source string, index translation table and
13133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      store translated character in op1. */
13134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op, binop(Iop_Shl16, load(Ity_I16, mkexpr(src_addr)), mkU8(1)));
13135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(result, binop(Iop_Add64, unop(Iop_16Uto64, mkexpr(op)),
13137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        mkexpr(tab_addr)));
13138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1, load(Ity_I16, mkexpr(result)));
13139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (! s390_host_has_etf2 || (m3 & 0x1) == 0) {
13141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_cc_set(1);
13142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      next_insn_if(binop(Iop_CmpEQ16, mkexpr(op1), mkexpr(test_byte)));
13143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
13144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   store(get_gpr_dw0(r1), mkexpr(op1));
13146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2, binop(Iop_Add64, mkexpr(src_addr), mkU64(2)));
13148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(des_addr), mkU64(2)));
13149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1+1, binop(Iop_Sub64, mkexpr(src_len), mkU64(2)));
13150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
13152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "trtt";
13154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
13157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_TR(UChar length, IRTemp start1, IRTemp start2)
13158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len = newTemp(Ity_I64);
13160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len, mkU64(length));
13162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_TR_EX(len, start1, start2);
13163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "tr";
13165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
13168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_TRE(UChar r1,UChar r2)
13169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp src_addr, tab_addr, src_len, test_byte;
13171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_addr = newTemp(Ity_I64);
13172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   tab_addr = newTemp(Ity_I64);
13173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_len = newTemp(Ity_I64);
13174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_byte = newTemp(Ity_I8);
13175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_addr, get_gpr_dw0(r1));
13177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_len, get_gpr_dw0(r1+1));
13178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(tab_addr, get_gpr_dw0(r2));
13179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(test_byte, get_gpr_b7(0));
13180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op = newTemp(Ity_I8);
13182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1 = newTemp(Ity_I8);
13183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp result = newTemp(Ity_I64);
13184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* End of source string? We're done; proceed to next insn */
13186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
13187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, mkexpr(src_len), mkU64(0)));
13188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Load character from source string and compare with test byte */
13190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op, load(Ity_I8, mkexpr(src_addr)));
13191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(1);
13193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ8, mkexpr(op), mkexpr(test_byte)));
13194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(result, binop(Iop_Add64, unop(Iop_8Uto64, mkexpr(op)),
13196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng			mkexpr(tab_addr)));
13197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1, load(Ity_I8, mkexpr(result)));
13199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   store(get_gpr_dw0(r1), mkexpr(op1));
13201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(src_addr), mkU64(1)));
13202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1+1, binop(Iop_Sub64, mkexpr(src_len), mkU64(1)));
13203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
13205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "tre";
13207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *
13210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_cu21(IRExpr *srcval, IRExpr *low_surrogate)
13211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call;
13213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   args = mkIRExprVec_2(srcval, low_surrogate);
13214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call = mkIRExprCCall(Ity_I64, 0 /*regparm*/,
13215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       "s390_do_cu21", &s390_do_cu21, args);
13216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Nothing is excluded from definedness checking. */
13218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call->Iex.CCall.cee->mcx_mask = 0;
13219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return call;
13221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
13224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CU21(UChar m3, UChar r1, UChar r2)
13225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr1 = newTemp(Ity_I64);
13227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr2 = newTemp(Ity_I64);
13228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len1 = newTemp(Ity_I64);
13229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len2 = newTemp(Ity_I64);
13230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr1, get_gpr_dw0(r1));
13232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr2, get_gpr_dw0(r2));
13233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len1, get_gpr_dw0(r1 + 1));
13234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len2, get_gpr_dw0(r2 + 1));
13235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* We're processing the 2nd operand 2 bytes at a time. Therefore, if
13237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      there are less than 2 bytes left, then the 2nd operand is exhausted
13238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      and we're done here. cc = 0 */
13239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
13240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len2), mkU64(2)));
13241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* There are at least two bytes there. Read them. */
13243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp srcval = newTemp(Ity_I32);
13244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(srcval, unop(Iop_16Uto32, load(Ity_I16, mkexpr(addr2))));
13245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Find out whether this is a high surrogate. I.e. SRCVAL lies
13247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      inside the interval [0xd800 - 0xdbff] */
13248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp  is_high_surrogate = newTemp(Ity_I32);
13249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *flag1 = mkite(binop(Iop_CmpLE32U, mkU32(0xd800), mkexpr(srcval)),
13250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         mkU32(1), mkU32(0));
13251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *flag2 = mkite(binop(Iop_CmpLE32U, mkexpr(srcval), mkU32(0xdbff)),
13252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         mkU32(1), mkU32(0));
13253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(is_high_surrogate, binop(Iop_And32, flag1, flag2));
13254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* If SRCVAL is a high surrogate and there are less than 4 bytes left,
13256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      then the 2nd operand is exhausted and we're done here. cc = 0 */
13257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *not_enough_bytes =
13258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mkite(binop(Iop_CmpLT64U, mkexpr(len2), mkU64(4)), mkU32(1), mkU32(0));
13259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ32,
13261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      binop(Iop_And32, mkexpr(is_high_surrogate),
13262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            not_enough_bytes), mkU32(1)));
13263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* The 2nd operand is not exhausted. If the first 2 bytes are a high
13265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      surrogate, read the next two bytes (low surrogate). */
13266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp  low_surrogate = newTemp(Ity_I32);
13267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *low_surrogate_addr = binop(Iop_Add64, mkexpr(addr2), mkU64(2));
13268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(low_surrogate,
13270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          mkite(binop(Iop_CmpEQ32, mkexpr(is_high_surrogate), mkU32(1)),
13271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                unop(Iop_16Uto32, load(Ity_I16, low_surrogate_addr)),
13272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                mkU32(0)));  // any value is fine; it will not be used
13273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Call the helper */
13275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp retval = newTemp(Ity_I64);
13276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(retval, s390_call_cu21(unop(Iop_32Uto64, mkexpr(srcval)),
13277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 unop(Iop_32Uto64, mkexpr(low_surrogate))));
13278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Before we can test whether the 1st operand is exhausted we need to
13280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      test for an invalid low surrogate. Because cc=2 outranks cc=1. */
13281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (s390_host_has_etf3 && (m3 & 0x1) == 1) {
13282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      IRExpr *invalid_low_surrogate =
13283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         binop(Iop_And64, mkexpr(retval), mkU64(0xff));
13284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_cc_set(2);
13286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      next_insn_if(binop(Iop_CmpEQ64, invalid_low_surrogate, mkU64(1)));
13287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
13288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Now test whether the 1st operand is exhausted */
13290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp num_bytes = newTemp(Ity_I64);
13291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(num_bytes, binop(Iop_And64,
13292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           binop(Iop_Shr64, mkexpr(retval), mkU8(8)),
13293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           mkU64(0xff)));
13294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(1);
13295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len1), mkexpr(num_bytes)));
13296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Extract the bytes to be stored at addr1 */
13298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp data = newTemp(Ity_I64);
13299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(data, binop(Iop_Shr64, mkexpr(retval), mkU8(16)));
13300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* To store the bytes construct 4 dirty helper calls. The helper calls
13302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      are guarded (num_bytes == 1, num_bytes == 2, etc) such that only
13303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      one of them will be called at runtime. */
13304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt i;
13305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (i = 1; i <= 4; ++i) {
13306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      IRDirty *d;
13307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d = unsafeIRDirty_0_N(0 /* regparms */, "s390x_dirtyhelper_CUxy",
13309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            &s390x_dirtyhelper_CUxy,
13310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            mkIRExprVec_3(mkexpr(addr1), mkexpr(data),
13311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          mkexpr(num_bytes)));
13312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->guard = binop(Iop_CmpEQ64, mkexpr(num_bytes), mkU64(i));
13313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mFx   = Ifx_Write;
13314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mAddr = mkexpr(addr1);
13315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mSize = i;
13316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      stmt(IRStmt_Dirty(d));
13317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
13318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update source address and length */
13320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp num_src_bytes = newTemp(Ity_I64);
13321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(num_src_bytes,
13322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          mkite(binop(Iop_CmpEQ32, mkexpr(is_high_surrogate), mkU32(1)),
13323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                mkU64(4), mkU64(2)));
13324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2,     binop(Iop_Add64, mkexpr(addr2), mkexpr(num_src_bytes)));
13325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2 + 1, binop(Iop_Sub64, mkexpr(len2),  mkexpr(num_src_bytes)));
13326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update destination address and length */
13328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1,     binop(Iop_Add64, mkexpr(addr1), mkexpr(num_bytes)));
13329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1 + 1, binop(Iop_Sub64, mkexpr(len1),  mkexpr(num_bytes)));
13330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
13332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cu21";
13334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *
13337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_cu24(IRExpr *srcval, IRExpr *low_surrogate)
13338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call;
13340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   args = mkIRExprVec_2(srcval, low_surrogate);
13341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call = mkIRExprCCall(Ity_I64, 0 /*regparm*/,
13342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       "s390_do_cu24", &s390_do_cu24, args);
13343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Nothing is excluded from definedness checking. */
13345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call->Iex.CCall.cee->mcx_mask = 0;
13346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return call;
13348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
13351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CU24(UChar m3, UChar r1, UChar r2)
13352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr1 = newTemp(Ity_I64);
13354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr2 = newTemp(Ity_I64);
13355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len1 = newTemp(Ity_I64);
13356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len2 = newTemp(Ity_I64);
13357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr1, get_gpr_dw0(r1));
13359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr2, get_gpr_dw0(r2));
13360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len1, get_gpr_dw0(r1 + 1));
13361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len2, get_gpr_dw0(r2 + 1));
13362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* We're processing the 2nd operand 2 bytes at a time. Therefore, if
13364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      there are less than 2 bytes left, then the 2nd operand is exhausted
13365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      and we're done here. cc = 0 */
13366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
13367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len2), mkU64(2)));
13368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* There are at least two bytes there. Read them. */
13370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp srcval = newTemp(Ity_I32);
13371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(srcval, unop(Iop_16Uto32, load(Ity_I16, mkexpr(addr2))));
13372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Find out whether this is a high surrogate. I.e. SRCVAL lies
13374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      inside the interval [0xd800 - 0xdbff] */
13375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp  is_high_surrogate = newTemp(Ity_I32);
13376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *flag1 = mkite(binop(Iop_CmpLE32U, mkU32(0xd800), mkexpr(srcval)),
13377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         mkU32(1), mkU32(0));
13378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *flag2 = mkite(binop(Iop_CmpLE32U, mkexpr(srcval), mkU32(0xdbff)),
13379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         mkU32(1), mkU32(0));
13380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(is_high_surrogate, binop(Iop_And32, flag1, flag2));
13381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* If SRCVAL is a high surrogate and there are less than 4 bytes left,
13383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      then the 2nd operand is exhausted and we're done here. cc = 0 */
13384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *not_enough_bytes =
13385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mkite(binop(Iop_CmpLT64U, mkexpr(len2), mkU64(4)), mkU32(1), mkU32(0));
13386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ32,
13388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      binop(Iop_And32, mkexpr(is_high_surrogate),
13389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            not_enough_bytes),
13390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      mkU32(1)));
13391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* The 2nd operand is not exhausted. If the first 2 bytes are a high
13393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      surrogate, read the next two bytes (low surrogate). */
13394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp  low_surrogate = newTemp(Ity_I32);
13395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *low_surrogate_addr = binop(Iop_Add64, mkexpr(addr2), mkU64(2));
13396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(low_surrogate,
13398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          mkite(binop(Iop_CmpEQ32, mkexpr(is_high_surrogate), mkU32(1)),
13399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                unop(Iop_16Uto32, load(Ity_I16, low_surrogate_addr)),
13400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                mkU32(0)));  // any value is fine; it will not be used
13401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Call the helper */
13403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp retval = newTemp(Ity_I64);
13404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(retval, s390_call_cu24(unop(Iop_32Uto64, mkexpr(srcval)),
13405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 unop(Iop_32Uto64, mkexpr(low_surrogate))));
13406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Before we can test whether the 1st operand is exhausted we need to
13408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      test for an invalid low surrogate. Because cc=2 outranks cc=1. */
13409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (s390_host_has_etf3 && (m3 & 0x1) == 1) {
13410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      IRExpr *invalid_low_surrogate =
13411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         binop(Iop_And64, mkexpr(retval), mkU64(0xff));
13412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_cc_set(2);
13414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      next_insn_if(binop(Iop_CmpEQ64, invalid_low_surrogate, mkU64(1)));
13415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
13416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Now test whether the 1st operand is exhausted */
13418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(1);
13419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len1), mkU64(4)));
13420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Extract the bytes to be stored at addr1 */
13422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *data = unop(Iop_64to32, binop(Iop_Shr64, mkexpr(retval), mkU8(8)));
13423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   store(mkexpr(addr1), data);
13425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update source address and length */
13427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp num_src_bytes = newTemp(Ity_I64);
13428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(num_src_bytes,
13429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          mkite(binop(Iop_CmpEQ32, mkexpr(is_high_surrogate), mkU32(1)),
13430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                mkU64(4), mkU64(2)));
13431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2,     binop(Iop_Add64, mkexpr(addr2), mkexpr(num_src_bytes)));
13432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2 + 1, binop(Iop_Sub64, mkexpr(len2),  mkexpr(num_src_bytes)));
13433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update destination address and length */
13435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1,     binop(Iop_Add64, mkexpr(addr1), mkU64(4)));
13436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1 + 1, binop(Iop_Sub64, mkexpr(len1),  mkU64(4)));
13437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
13439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cu24";
13441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *
13444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_cu42(IRExpr *srcval)
13445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call;
13447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   args = mkIRExprVec_1(srcval);
13448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call = mkIRExprCCall(Ity_I64, 0 /*regparm*/,
13449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       "s390_do_cu42", &s390_do_cu42, args);
13450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Nothing is excluded from definedness checking. */
13452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call->Iex.CCall.cee->mcx_mask = 0;
13453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return call;
13455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
13458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CU42(UChar r1, UChar r2)
13459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr1 = newTemp(Ity_I64);
13461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr2 = newTemp(Ity_I64);
13462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len1 = newTemp(Ity_I64);
13463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len2 = newTemp(Ity_I64);
13464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr1, get_gpr_dw0(r1));
13466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr2, get_gpr_dw0(r2));
13467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len1, get_gpr_dw0(r1 + 1));
13468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len2, get_gpr_dw0(r2 + 1));
13469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* We're processing the 2nd operand 4 bytes at a time. Therefore, if
13471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      there are less than 4 bytes left, then the 2nd operand is exhausted
13472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      and we're done here. cc = 0 */
13473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
13474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len2), mkU64(4)));
13475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Read the 2nd operand. */
13477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp srcval = newTemp(Ity_I32);
13478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(srcval, load(Ity_I32, mkexpr(addr2)));
13479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Call the helper */
13481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp retval = newTemp(Ity_I64);
13482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(retval, s390_call_cu42(unop(Iop_32Uto64, mkexpr(srcval))));
13483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* If the UTF-32 character was invalid, set cc=2 and we're done.
13485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      cc=2 outranks cc=1 (1st operand exhausted) */
13486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *invalid_character = binop(Iop_And64, mkexpr(retval), mkU64(0xff));
13487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(2);
13489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, invalid_character, mkU64(1)));
13490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Now test whether the 1st operand is exhausted */
13492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp num_bytes = newTemp(Ity_I64);
13493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(num_bytes, binop(Iop_And64,
13494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           binop(Iop_Shr64, mkexpr(retval), mkU8(8)),
13495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           mkU64(0xff)));
13496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(1);
13497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len1), mkexpr(num_bytes)));
13498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Extract the bytes to be stored at addr1 */
13500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp data = newTemp(Ity_I64);
13501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(data, binop(Iop_Shr64, mkexpr(retval), mkU8(16)));
13502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* To store the bytes construct 2 dirty helper calls. The helper calls
13504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      are guarded (num_bytes == 2 and num_bytes == 4, respectively) such
13505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      that only one of them will be called at runtime. */
13506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Int i;
13508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (i = 2; i <= 4; ++i) {
13509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      IRDirty *d;
13510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (i == 3) continue;  // skip this one
13512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d = unsafeIRDirty_0_N(0 /* regparms */, "s390x_dirtyhelper_CUxy",
13514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            &s390x_dirtyhelper_CUxy,
13515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            mkIRExprVec_3(mkexpr(addr1), mkexpr(data),
13516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          mkexpr(num_bytes)));
13517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->guard = binop(Iop_CmpEQ64, mkexpr(num_bytes), mkU64(i));
13518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mFx   = Ifx_Write;
13519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mAddr = mkexpr(addr1);
13520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mSize = i;
13521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      stmt(IRStmt_Dirty(d));
13522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
13523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update source address and length */
13525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2,     binop(Iop_Add64, mkexpr(addr2), mkU64(4)));
13526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2 + 1, binop(Iop_Sub64, mkexpr(len2),  mkU64(4)));
13527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update destination address and length */
13529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1,     binop(Iop_Add64, mkexpr(addr1), mkexpr(num_bytes)));
13530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1 + 1, binop(Iop_Sub64, mkexpr(len1),  mkexpr(num_bytes)));
13531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
13533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cu42";
13535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *
13538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_cu41(IRExpr *srcval)
13539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call;
13541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   args = mkIRExprVec_1(srcval);
13542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call = mkIRExprCCall(Ity_I64, 0 /*regparm*/,
13543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       "s390_do_cu41", &s390_do_cu41, args);
13544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Nothing is excluded from definedness checking. */
13546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call->Iex.CCall.cee->mcx_mask = 0;
13547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return call;
13549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
13552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CU41(UChar r1, UChar r2)
13553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr1 = newTemp(Ity_I64);
13555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr2 = newTemp(Ity_I64);
13556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len1 = newTemp(Ity_I64);
13557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len2 = newTemp(Ity_I64);
13558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr1, get_gpr_dw0(r1));
13560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr2, get_gpr_dw0(r2));
13561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len1, get_gpr_dw0(r1 + 1));
13562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len2, get_gpr_dw0(r2 + 1));
13563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* We're processing the 2nd operand 4 bytes at a time. Therefore, if
13565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      there are less than 4 bytes left, then the 2nd operand is exhausted
13566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      and we're done here. cc = 0 */
13567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
13568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len2), mkU64(4)));
13569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Read the 2nd operand. */
13571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp srcval = newTemp(Ity_I32);
13572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(srcval, load(Ity_I32, mkexpr(addr2)));
13573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Call the helper */
13575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp retval = newTemp(Ity_I64);
13576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(retval, s390_call_cu41(unop(Iop_32Uto64, mkexpr(srcval))));
13577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* If the UTF-32 character was invalid, set cc=2 and we're done.
13579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      cc=2 outranks cc=1 (1st operand exhausted) */
13580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *invalid_character = binop(Iop_And64, mkexpr(retval), mkU64(0xff));
13581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(2);
13583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, invalid_character, mkU64(1)));
13584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Now test whether the 1st operand is exhausted */
13586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp num_bytes = newTemp(Ity_I64);
13587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(num_bytes, binop(Iop_And64,
13588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           binop(Iop_Shr64, mkexpr(retval), mkU8(8)),
13589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           mkU64(0xff)));
13590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(1);
13591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len1), mkexpr(num_bytes)));
13592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Extract the bytes to be stored at addr1 */
13594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp data = newTemp(Ity_I64);
13595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(data, binop(Iop_Shr64, mkexpr(retval), mkU8(16)));
13596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* To store the bytes construct 4 dirty helper calls. The helper calls
13598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      are guarded (num_bytes == 1, num_bytes == 2, etc) such that only
13599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      one of them will be called at runtime. */
13600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt i;
13601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (i = 1; i <= 4; ++i) {
13602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      IRDirty *d;
13603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d = unsafeIRDirty_0_N(0 /* regparms */, "s390x_dirtyhelper_CUxy",
13605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            &s390x_dirtyhelper_CUxy,
13606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            mkIRExprVec_3(mkexpr(addr1), mkexpr(data),
13607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          mkexpr(num_bytes)));
13608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->guard = binop(Iop_CmpEQ64, mkexpr(num_bytes), mkU64(i));
13609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mFx   = Ifx_Write;
13610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mAddr = mkexpr(addr1);
13611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mSize = i;
13612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      stmt(IRStmt_Dirty(d));
13613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
13614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update source address and length */
13616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2,     binop(Iop_Add64, mkexpr(addr2), mkU64(4)));
13617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2 + 1, binop(Iop_Sub64, mkexpr(len2),  mkU64(4)));
13618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update destination address and length */
13620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1,     binop(Iop_Add64, mkexpr(addr1), mkexpr(num_bytes)));
13621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1 + 1, binop(Iop_Sub64, mkexpr(len1),  mkexpr(num_bytes)));
13622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
13624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cu41";
13626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *
13629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_cu12_cu14_helper1(IRExpr *byte1, IRExpr *etf3_and_m3_is_1)
13630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call;
13632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   args = mkIRExprVec_2(byte1, etf3_and_m3_is_1);
13633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call = mkIRExprCCall(Ity_I64, 0 /*regparm*/, "s390_do_cu12_cu14_helper1",
13634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        &s390_do_cu12_cu14_helper1, args);
13635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Nothing is excluded from definedness checking. */
13637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call->Iex.CCall.cee->mcx_mask = 0;
13638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return call;
13640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *
13643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_cu12_helper2(IRExpr *byte1, IRExpr *byte2, IRExpr *byte3,
13644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       IRExpr *byte4, IRExpr *stuff)
13645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call;
13647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   args = mkIRExprVec_5(byte1, byte2, byte3, byte4, stuff);
13648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call = mkIRExprCCall(Ity_I64, 0 /*regparm*/,
13649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        "s390_do_cu12_helper2", &s390_do_cu12_helper2, args);
13650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Nothing is excluded from definedness checking. */
13652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call->Iex.CCall.cee->mcx_mask = 0;
13653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return call;
13655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *
13658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_cu14_helper2(IRExpr *byte1, IRExpr *byte2, IRExpr *byte3,
13659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       IRExpr *byte4, IRExpr *stuff)
13660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call;
13662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   args = mkIRExprVec_5(byte1, byte2, byte3, byte4, stuff);
13663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call = mkIRExprCCall(Ity_I64, 0 /*regparm*/,
13664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        "s390_do_cu14_helper2", &s390_do_cu14_helper2, args);
13665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Nothing is excluded from definedness checking. */
13667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call->Iex.CCall.cee->mcx_mask = 0;
13668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return call;
13670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
13673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_cu12_cu14(UChar m3, UChar r1, UChar r2, Bool is_cu12)
13674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr1 = newTemp(Ity_I64);
13676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr2 = newTemp(Ity_I64);
13677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len1 = newTemp(Ity_I64);
13678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len2 = newTemp(Ity_I64);
13679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr1, get_gpr_dw0(r1));
13681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr2, get_gpr_dw0(r2));
13682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len1, get_gpr_dw0(r1 + 1));
13683663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len2, get_gpr_dw0(r2 + 1));
13684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt extended_checking = s390_host_has_etf3 && (m3 & 0x1) == 1;
13686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* We're processing the 2nd operand 1 byte at a time. Therefore, if
13688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      there is less than 1 byte left, then the 2nd operand is exhausted
13689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      and we're done here. cc = 0 */
13690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
13691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len2), mkU64(1)));
13692663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* There is at least one byte there. Read it. */
13694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp byte1 = newTemp(Ity_I64);
13695663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(byte1, unop(Iop_8Uto64, load(Ity_I8, mkexpr(addr2))));
13696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Call the helper to get number of bytes and invalid byte indicator */
13698663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp retval1 = newTemp(Ity_I64);
13699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(retval1, s390_call_cu12_cu14_helper1(mkexpr(byte1),
13700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                               mkU64(extended_checking)));
13701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13702663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Check for invalid 1st byte */
13703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *is_invalid = unop(Iop_64to1, mkexpr(retval1));
13704663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(2);
13705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(is_invalid);
13706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* How many bytes do we have to read? */
13708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp num_src_bytes = newTemp(Ity_I64);
13709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(num_src_bytes, binop(Iop_Shr64, mkexpr(retval1), mkU8(8)));
13710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Now test whether the 2nd operand is exhausted */
13712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
13713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len2), mkexpr(num_src_bytes)));
13714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Read the remaining bytes */
13716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *cond, *addr, *byte2, *byte3, *byte4;
13717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   cond  = binop(Iop_CmpLE64U, mkU64(2), mkexpr(num_src_bytes));
13719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   addr  = binop(Iop_Add64, mkexpr(addr2), mkU64(1));
13720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   byte2 = mkite(cond, unop(Iop_8Uto64, load(Ity_I8, addr)), mkU64(0));
13721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   cond  = binop(Iop_CmpLE64U, mkU64(3), mkexpr(num_src_bytes));
13722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   addr  = binop(Iop_Add64, mkexpr(addr2), mkU64(2));
13723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   byte3 = mkite(cond, unop(Iop_8Uto64, load(Ity_I8, addr)), mkU64(0));
13724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   cond  = binop(Iop_CmpLE64U, mkU64(4), mkexpr(num_src_bytes));
13725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   addr  = binop(Iop_Add64, mkexpr(addr2), mkU64(3));
13726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   byte4 = mkite(cond, unop(Iop_8Uto64, load(Ity_I8, addr)), mkU64(0));
13727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Call the helper to get the converted value and invalid byte indicator.
13729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      We can pass at most 5 arguments; therefore some encoding is needed
13730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      here */
13731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *stuff = binop(Iop_Or64,
13732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         binop(Iop_Shl64, mkexpr(num_src_bytes), mkU8(1)),
13733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         mkU64(extended_checking));
13734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp retval2 = newTemp(Ity_I64);
13735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (is_cu12) {
13737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      assign(retval2, s390_call_cu12_helper2(mkexpr(byte1), byte2, byte3,
13738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                             byte4, stuff));
13739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else {
13740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      assign(retval2, s390_call_cu14_helper2(mkexpr(byte1), byte2, byte3,
13741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                             byte4, stuff));
13742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
13743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Check for invalid character */
13745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(2);
13746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   is_invalid = unop(Iop_64to1, mkexpr(retval2));
13747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(is_invalid);
13748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Now test whether the 1st operand is exhausted */
13750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp num_bytes = newTemp(Ity_I64);
13751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(num_bytes, binop(Iop_And64,
13752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           binop(Iop_Shr64, mkexpr(retval2), mkU8(8)),
13753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           mkU64(0xff)));
13754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(1);
13755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len1), mkexpr(num_bytes)));
13756663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13757663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Extract the bytes to be stored at addr1 */
13758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp data = newTemp(Ity_I64);
13759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(data, binop(Iop_Shr64, mkexpr(retval2), mkU8(16)));
13760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (is_cu12) {
13762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* To store the bytes construct 2 dirty helper calls. The helper calls
13763663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         are guarded (num_bytes == 2 and num_bytes == 4, respectively) such
13764663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         that only one of them will be called at runtime. */
13765663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13766663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Int i;
13767663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      for (i = 2; i <= 4; ++i) {
13768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         IRDirty *d;
13769663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13770663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (i == 3) continue;  // skip this one
13771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         d = unsafeIRDirty_0_N(0 /* regparms */, "s390x_dirtyhelper_CUxy",
13773663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               &s390x_dirtyhelper_CUxy,
13774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               mkIRExprVec_3(mkexpr(addr1), mkexpr(data),
13775663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                             mkexpr(num_bytes)));
13776663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         d->guard = binop(Iop_CmpEQ64, mkexpr(num_bytes), mkU64(i));
13777663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         d->mFx   = Ifx_Write;
13778663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         d->mAddr = mkexpr(addr1);
13779663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         d->mSize = i;
13780663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         stmt(IRStmt_Dirty(d));
13781663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else {
13783663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // cu14
13784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      store(mkexpr(addr1), unop(Iop_64to32, mkexpr(data)));
13785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
13786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13787663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update source address and length */
13788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2,     binop(Iop_Add64, mkexpr(addr2), mkexpr(num_src_bytes)));
13789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2 + 1, binop(Iop_Sub64, mkexpr(len2),  mkexpr(num_src_bytes)));
13790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update destination address and length */
13792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1,     binop(Iop_Add64, mkexpr(addr1), mkexpr(num_bytes)));
13793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1 + 1, binop(Iop_Sub64, mkexpr(len1),  mkexpr(num_bytes)));
13794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13795663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
13796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
13799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CU12(UChar m3, UChar r1, UChar r2)
13800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13801663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_cu12_cu14(m3, r1, r2, /* is_cu12 = */ 1);
13802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13803663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cu12";
13804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
13807663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CU14(UChar m3, UChar r1, UChar r2)
13808663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13809663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_cu12_cu14(m3, r1, r2, /* is_cu12 = */ 0);
13810663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13811663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cu14";
13812663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
13813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr *
13815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_call_ecag(IRExpr *op2addr)
13816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
13817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr **args, *call;
13818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   args = mkIRExprVec_1(op2addr);
13820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   call = mkIRExprCCall(Ity_I64, 0 /*regparm*/,
13821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        "s390_do_ecag", &s390_do_ecag, args);
13822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Nothing is excluded from definedness checking. */
13824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   call->Iex.CCall.cee->mcx_mask = 0;
13825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return call;
13827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
13828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar *
13830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovs390_irgen_ECAG(UChar r1, UChar r3 __attribute__((unused)), IRTemp op2addr)
13831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
13832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (! s390_host_has_gie) {
13833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      emulation_failure(EmFail_S390X_ecag);
13834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
13835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_gpr_dw0(r1, s390_call_ecag(mkexpr(op2addr)));
13836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
13837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return "ecag";
13839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
13840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* New insns are added here.
13843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   If an insn is contingent on a facility being installed also
13844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   check whether the list of supported facilities in function
13845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   s390x_dirtyhelper_STFLE needs updating */
13846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
13848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Build IR for special instructions                    ---*/
13849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
13850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
13852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_client_request(void)
13853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
13854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (0)
13855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      vex_printf("%%R3 = client_request ( %%R2 )\n");
13856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Addr64 next = guest_IA_curr_instr + S390_SPECIAL_OP_PREAMBLE_SIZE
13858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     + S390_SPECIAL_OP_SIZE;
13859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->jk_StopHere = Ijk_ClientReq;
13861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dis_res->whatNext = Dis_StopHere;
13862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_IA(mkaddr_expr(next));
13864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
13865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
13867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_guest_NRADDR(void)
13868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
13869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (0)
13870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      vex_printf("%%R3 = guest_NRADDR\n");
13871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(3, IRExpr_Get(S390X_GUEST_OFFSET(guest_NRADDR), Ity_I64));
13873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
13874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
13876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_call_noredir(void)
13877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
13878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Addr64 next = guest_IA_curr_instr + S390_SPECIAL_OP_PREAMBLE_SIZE
13879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     + S390_SPECIAL_OP_SIZE;
13880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Continue after special op */
13882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(14, mkaddr_expr(next));
13883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* The address is in REG1, all parameters are in the right (guest) places */
13885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_IA(get_gpr_dw0(1));
13886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dis_res->whatNext = Dis_StopHere;
13888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->jk_StopHere = Ijk_NoRedir;
13889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
13890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Force proper alignment for the structures below. */
13892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#pragma pack(1)
13893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic s390_decode_t
13896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_decode_2byte_and_irgen(UChar *bytes)
13897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
13898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   typedef union {
13899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
13900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
13901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } E;
13902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
13903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
13904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i  :  8;
13905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } I;
13906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
13907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
13908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
13909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2 :  4;
13910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RR;
13911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } formats;
13912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   union {
13913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      formats fmt;
13914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      UShort value;
13915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } ovl;
13916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(sizeof(formats) == 2);
13918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((UChar *)(&ovl.value))[0] = bytes[0];
13920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((UChar *)(&ovl.value))[1] = bytes[1];
13921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (ovl.value & 0xffff) {
13923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0101: /* PR */ goto unimplemented;
13924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0102: /* UPT */ goto unimplemented;
13925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0104: /* PTFF */ goto unimplemented;
13926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0107: /* SCKPF */ goto unimplemented;
13927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x010a: s390_format_E(s390_irgen_PFPO); goto ok;
13928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x010b: /* TAM */ goto unimplemented;
13929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x010c: /* SAM24 */ goto unimplemented;
13930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x010d: /* SAM31 */ goto unimplemented;
13931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x010e: /* SAM64 */ goto unimplemented;
13932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x01ff: /* TRAP2 */ goto unimplemented;
13933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
13934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch ((ovl.value & 0xff00) >> 8) {
13936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x04: /* SPM */ goto unimplemented;
13937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x05: /* BALR */ goto unimplemented;
13938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x06: s390_format_RR_RR(s390_irgen_BCTR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x07: s390_format_RR(s390_irgen_BCR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             goto ok;
13942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0a: s390_format_I(s390_irgen_SVC, ovl.fmt.I.i);  goto ok;
13943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0b: /* BSM */ goto unimplemented;
13944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0c: /* BASSM */ goto unimplemented;
13945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0d: s390_format_RR_RR(s390_irgen_BASR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0e: s390_format_RR(s390_irgen_MVCL, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             goto ok;
13949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0f: s390_format_RR(s390_irgen_CLCL, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             goto ok;
13951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x10: s390_format_RR_RR(s390_irgen_LPR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x11: s390_format_RR_RR(s390_irgen_LNR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x12: s390_format_RR_RR(s390_irgen_LTR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x13: s390_format_RR_RR(s390_irgen_LCR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x14: s390_format_RR_RR(s390_irgen_NR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x15: s390_format_RR_RR(s390_irgen_CLR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x16: s390_format_RR_RR(s390_irgen_OR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x17: s390_format_RR_RR(s390_irgen_XR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x18: s390_format_RR_RR(s390_irgen_LR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x19: s390_format_RR_RR(s390_irgen_CR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x1a: s390_format_RR_RR(s390_irgen_AR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x1b: s390_format_RR_RR(s390_irgen_SR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x1c: s390_format_RR_RR(s390_irgen_MR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x1d: s390_format_RR_RR(s390_irgen_DR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x1e: s390_format_RR_RR(s390_irgen_ALR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x1f: s390_format_RR_RR(s390_irgen_SLR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x20: /* LPDR */ goto unimplemented;
13984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x21: /* LNDR */ goto unimplemented;
13985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x22: /* LTDR */ goto unimplemented;
13986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x23: /* LCDR */ goto unimplemented;
13987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x24: /* HDR */ goto unimplemented;
13988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x25: /* LDXR */ goto unimplemented;
13989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x26: /* MXR */ goto unimplemented;
13990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x27: /* MXDR */ goto unimplemented;
13991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x28: s390_format_RR_FF(s390_irgen_LDR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
13992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
13993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x29: /* CDR */ goto unimplemented;
13994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x2a: /* ADR */ goto unimplemented;
13995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x2b: /* SDR */ goto unimplemented;
13996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x2c: /* MDR */ goto unimplemented;
13997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x2d: /* DDR */ goto unimplemented;
13998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x2e: /* AWR */ goto unimplemented;
13999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x2f: /* SWR */ goto unimplemented;
14000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x30: /* LPER */ goto unimplemented;
14001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x31: /* LNER */ goto unimplemented;
14002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x32: /* LTER */ goto unimplemented;
14003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x33: /* LCER */ goto unimplemented;
14004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x34: /* HER */ goto unimplemented;
14005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x35: /* LEDR */ goto unimplemented;
14006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x36: /* AXR */ goto unimplemented;
14007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x37: /* SXR */ goto unimplemented;
14008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x38: s390_format_RR_FF(s390_irgen_LER, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
14009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
14010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x39: /* CER */ goto unimplemented;
14011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x3a: /* AER */ goto unimplemented;
14012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x3b: /* SER */ goto unimplemented;
14013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x3c: /* MDER */ goto unimplemented;
14014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x3d: /* DER */ goto unimplemented;
14015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x3e: /* AUR */ goto unimplemented;
14016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x3f: /* SUR */ goto unimplemented;
14017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
14018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_UNKNOWN_INSN;
14020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovok:
14022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_OK;
14023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunimplemented:
14025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_UNIMPLEMENTED_INSN;
14026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
14027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic s390_decode_t
14029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_decode_4byte_and_irgen(UChar *bytes)
14030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
14031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   typedef union {
14032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
14033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
14034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
14035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  4;
14036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2  : 16;
14037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RI;
14038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
14039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
14040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int    :  8;
14041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
14042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2 :  4;
14043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RRE;
14044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
14045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
14046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
14047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int    :  4;
14048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3 :  4;
14049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2 :  4;
14050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RRF;
14051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
14052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
14053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         unsigned int m3 :  4;
14054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int m4 :  4;
14055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
14056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2 :  4;
14057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RRF2;
14058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
14059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
14060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3 :  4;
14061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int    :  4;
14062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
14063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2 :  4;
14064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RRF3;
14065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
14066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
14067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3 :  4;
14068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int    :  4;
14069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
14070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2 :  4;
14071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RRR;
14072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
14073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
14074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3 :  4;
14075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         unsigned int m4 :  4;
14076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
14077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2 :  4;
14078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RRF4;
14079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
14080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         unsigned int op : 16;
14081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         unsigned int    :  4;
14082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         unsigned int m4 :  4;
14083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         unsigned int r1 :  4;
14084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         unsigned int r2 :  4;
14085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } RRF5;
14086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      struct {
14087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
14088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
14089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3 :  4;
14090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2 :  4;
14091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2 : 12;
14092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RS;
14093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
14094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
14095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
14096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3 :  4;
14097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2 : 16;
14098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RSI;
14099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
14100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
14101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
14102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int x2 :  4;
14103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2 :  4;
14104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2 : 12;
14105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RX;
14106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
14107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
14108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2 :  4;
14109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2 : 12;
14110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } S;
14111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
14112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
14113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2 :  8;
14114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b1 :  4;
14115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d1 : 12;
14116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } SI;
14117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } formats;
14118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   union {
14119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      formats fmt;
14120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      UInt value;
14121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } ovl;
14122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(sizeof(formats) == 4);
14124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((UChar *)(&ovl.value))[0] = bytes[0];
14126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((UChar *)(&ovl.value))[1] = bytes[1];
14127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((UChar *)(&ovl.value))[2] = bytes[2];
14128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((UChar *)(&ovl.value))[3] = bytes[3];
14129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch ((ovl.value & 0xff0f0000) >> 16) {
14131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa500: s390_format_RI_RU(s390_irgen_IIHH, ovl.fmt.RI.r1,
14132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa501: s390_format_RI_RU(s390_irgen_IIHL, ovl.fmt.RI.r1,
14134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa502: s390_format_RI_RU(s390_irgen_IILH, ovl.fmt.RI.r1,
14136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa503: s390_format_RI_RU(s390_irgen_IILL, ovl.fmt.RI.r1,
14138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa504: s390_format_RI_RU(s390_irgen_NIHH, ovl.fmt.RI.r1,
14140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa505: s390_format_RI_RU(s390_irgen_NIHL, ovl.fmt.RI.r1,
14142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa506: s390_format_RI_RU(s390_irgen_NILH, ovl.fmt.RI.r1,
14144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa507: s390_format_RI_RU(s390_irgen_NILL, ovl.fmt.RI.r1,
14146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa508: s390_format_RI_RU(s390_irgen_OIHH, ovl.fmt.RI.r1,
14148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa509: s390_format_RI_RU(s390_irgen_OIHL, ovl.fmt.RI.r1,
14150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa50a: s390_format_RI_RU(s390_irgen_OILH, ovl.fmt.RI.r1,
14152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa50b: s390_format_RI_RU(s390_irgen_OILL, ovl.fmt.RI.r1,
14154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa50c: s390_format_RI_RU(s390_irgen_LLIHH, ovl.fmt.RI.r1,
14156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa50d: s390_format_RI_RU(s390_irgen_LLIHL, ovl.fmt.RI.r1,
14158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa50e: s390_format_RI_RU(s390_irgen_LLILH, ovl.fmt.RI.r1,
14160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa50f: s390_format_RI_RU(s390_irgen_LLILL, ovl.fmt.RI.r1,
14162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa700: s390_format_RI_RU(s390_irgen_TMLH, ovl.fmt.RI.r1,
14164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa701: s390_format_RI_RU(s390_irgen_TMLL, ovl.fmt.RI.r1,
14166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa702: s390_format_RI_RU(s390_irgen_TMHH, ovl.fmt.RI.r1,
14168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa703: s390_format_RI_RU(s390_irgen_TMHL, ovl.fmt.RI.r1,
14170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa704: s390_format_RI(s390_irgen_BRC, ovl.fmt.RI.r1, ovl.fmt.RI.i2);
14172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                               goto ok;
14173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa705: s390_format_RI_RP(s390_irgen_BRAS, ovl.fmt.RI.r1,
14174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa706: s390_format_RI_RP(s390_irgen_BRCT, ovl.fmt.RI.r1,
14176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa707: s390_format_RI_RP(s390_irgen_BRCTG, ovl.fmt.RI.r1,
14178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa708: s390_format_RI_RI(s390_irgen_LHI, ovl.fmt.RI.r1, ovl.fmt.RI.i2);
14180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  goto ok;
14181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa709: s390_format_RI_RI(s390_irgen_LGHI, ovl.fmt.RI.r1,
14182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa70a: s390_format_RI_RI(s390_irgen_AHI, ovl.fmt.RI.r1, ovl.fmt.RI.i2);
14184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  goto ok;
14185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa70b: s390_format_RI_RI(s390_irgen_AGHI, ovl.fmt.RI.r1,
14186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa70c: s390_format_RI_RI(s390_irgen_MHI, ovl.fmt.RI.r1, ovl.fmt.RI.i2);
14188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  goto ok;
14189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa70d: s390_format_RI_RI(s390_irgen_MGHI, ovl.fmt.RI.r1,
14190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa70e: s390_format_RI_RI(s390_irgen_CHI, ovl.fmt.RI.r1, ovl.fmt.RI.i2);
14192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  goto ok;
14193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa70f: s390_format_RI_RI(s390_irgen_CGHI, ovl.fmt.RI.r1,
14194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
14195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
14196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch ((ovl.value & 0xffff0000) >> 16) {
14198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x8000: /* SSM */ goto unimplemented;
14199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x8200: /* LPSW */ goto unimplemented;
14200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0x9300: /* TS */ goto unimplemented;
14201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb202: /* STIDP */ goto unimplemented;
14202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb204: /* SCK */ goto unimplemented;
14203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb205: s390_format_S_RD(s390_irgen_STCK, ovl.fmt.S.b2, ovl.fmt.S.d2);
14204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                goto ok;
14205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb206: /* SCKC */ goto unimplemented;
14206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb207: /* STCKC */ goto unimplemented;
14207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb208: /* SPT */ goto unimplemented;
14208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb209: /* STPT */ goto unimplemented;
14209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb20a: /* SPKA */ goto unimplemented;
14210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb20b: /* IPK */ goto unimplemented;
14211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb20d: /* PTLB */ goto unimplemented;
14212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb210: /* SPX */ goto unimplemented;
14213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb211: /* STPX */ goto unimplemented;
14214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb212: /* STAP */ goto unimplemented;
14215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb214: /* SIE */ goto unimplemented;
14216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb218: /* PC */ goto unimplemented;
14217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb219: /* SAC */ goto unimplemented;
14218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb21a: /* CFC */ goto unimplemented;
14219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb221: /* IPTE */ goto unimplemented;
14220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb222: s390_format_RRE_R0(s390_irgen_IPM, ovl.fmt.RRE.r1);  goto ok;
14221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb223: /* IVSK */ goto unimplemented;
14222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb224: /* IAC */ goto unimplemented;
14223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb225: /* SSAR */ goto unimplemented;
14224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb226: /* EPAR */ goto unimplemented;
14225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb227: /* ESAR */ goto unimplemented;
14226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb228: /* PT */ goto unimplemented;
14227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb229: /* ISKE */ goto unimplemented;
14228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb22a: /* RRBE */ goto unimplemented;
14229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb22b: /* SSKE */ goto unimplemented;
14230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb22c: /* TB */ goto unimplemented;
14231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb22d: /* DXR */ goto unimplemented;
14232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb22e: /* PGIN */ goto unimplemented;
14233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb22f: /* PGOUT */ goto unimplemented;
14234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb230: /* CSCH */ goto unimplemented;
14235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb231: /* HSCH */ goto unimplemented;
14236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb232: /* MSCH */ goto unimplemented;
14237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb233: /* SSCH */ goto unimplemented;
14238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb234: /* STSCH */ goto unimplemented;
14239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb235: /* TSCH */ goto unimplemented;
14240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb236: /* TPI */ goto unimplemented;
14241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb237: /* SAL */ goto unimplemented;
14242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb238: /* RSCH */ goto unimplemented;
14243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb239: /* STCRW */ goto unimplemented;
14244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb23a: /* STCPS */ goto unimplemented;
14245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb23b: /* RCHP */ goto unimplemented;
14246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb23c: /* SCHM */ goto unimplemented;
14247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb240: /* BAKR */ goto unimplemented;
14248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb241: s390_format_RRE(s390_irgen_CKSM, ovl.fmt.RRE.r1,
14249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                ovl.fmt.RRE.r2);  goto ok;
14250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb244: /* SQDR */ goto unimplemented;
14251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb245: /* SQER */ goto unimplemented;
14252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb246: /* STURA */ goto unimplemented;
14253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb247: /* MSTA */ goto unimplemented;
14254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb248: /* PALB */ goto unimplemented;
14255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb249: /* EREG */ goto unimplemented;
14256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb24a: /* ESTA */ goto unimplemented;
14257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb24b: /* LURA */ goto unimplemented;
14258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb24c: /* TAR */ goto unimplemented;
14259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb24d: s390_format_RRE(s390_irgen_CPYA, ovl.fmt.RRE.r1,
14260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                ovl.fmt.RRE.r2);  goto ok;
14261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb24e: s390_format_RRE(s390_irgen_SAR, ovl.fmt.RRE.r1, ovl.fmt.RRE.r2);
14262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
14263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb24f: s390_format_RRE(s390_irgen_EAR, ovl.fmt.RRE.r1, ovl.fmt.RRE.r2);
14264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
14265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb250: /* CSP */ goto unimplemented;
14266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb252: s390_format_RRE_RR(s390_irgen_MSR, ovl.fmt.RRE.r1,
14267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb254: /* MVPG */ goto unimplemented;
14269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb255: s390_format_RRE_RR(s390_irgen_MVST, ovl.fmt.RRE.r1,
14270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb257: /* CUSE */ goto unimplemented;
14272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb258: /* BSG */ goto unimplemented;
14273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb25a: /* BSA */ goto unimplemented;
14274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb25d: s390_format_RRE_RR(s390_irgen_CLST, ovl.fmt.RRE.r1,
14275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb25e: s390_format_RRE_RR(s390_irgen_SRST, ovl.fmt.RRE.r1,
14277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb263: /* CMPSC */ goto unimplemented;
14279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb274: /* SIGA */ goto unimplemented;
14280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb276: /* XSCH */ goto unimplemented;
14281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb277: /* RP */ goto unimplemented;
14282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb278: s390_format_S_RD(s390_irgen_STCKE, ovl.fmt.S.b2, ovl.fmt.S.d2);goto ok;
14283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb279: /* SACF */ goto unimplemented;
14284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb27c: s390_format_S_RD(s390_irgen_STCKF, ovl.fmt.S.b2, ovl.fmt.S.d2);goto ok;
14285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb27d: /* STSI */ goto unimplemented;
14286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb280: /* LPP */ goto unimplemented;
14287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb284: /* LCCTL */ goto unimplemented;
14288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb285: /* LPCTL */ goto unimplemented;
14289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb286: /* QSI */ goto unimplemented;
14290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb287: /* LSCTL */ goto unimplemented;
14291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb28e: /* QCTRI */ goto unimplemented;
14292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb299: s390_format_S_RD(s390_irgen_SRNM, ovl.fmt.S.b2, ovl.fmt.S.d2);
14293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 goto ok;
14294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb29c: s390_format_S_RD(s390_irgen_STFPC, ovl.fmt.S.b2, ovl.fmt.S.d2);
14295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 goto ok;
14296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb29d: s390_format_S_RD(s390_irgen_LFPC, ovl.fmt.S.b2, ovl.fmt.S.d2);
14297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 goto ok;
14298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb2a5: s390_format_RRE_FF(s390_irgen_TRE, ovl.fmt.RRE.r1, ovl.fmt.RRE.r2);  goto ok;
14299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb2a6: s390_format_RRF_M0RERE(s390_irgen_CU21, ovl.fmt.RRF3.r3,
14300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
14301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto ok;
14302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb2a7: s390_format_RRF_M0RERE(s390_irgen_CU12, ovl.fmt.RRF3.r3,
14303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
14304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto ok;
14305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb2b0: s390_format_S_RD(s390_irgen_STFLE, ovl.fmt.S.b2, ovl.fmt.S.d2);
14306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 goto ok;
14307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb2b1: /* STFL */ goto unimplemented;
14308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb2b2: /* LPSWE */ goto unimplemented;
14309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb2b8: s390_irgen_srnmb_wrapper(ovl.fmt.S.b2, ovl.fmt.S.d2);
14310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      goto ok;
14311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb2b9: s390_format_S_RD(s390_irgen_SRNMT, ovl.fmt.S.b2, ovl.fmt.S.d2);
14312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      goto ok;
14313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb2bd: /* LFAS */ goto unimplemented;
14314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb2e0: /* SCCTR */ goto unimplemented;
14315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb2e1: /* SPCTR */ goto unimplemented;
14316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb2e4: /* ECCTR */ goto unimplemented;
14317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb2e5: /* EPCTR */ goto unimplemented;
14318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb2e8: /* PPA */ goto unimplemented;
14319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb2ec: /* ETND */ goto unimplemented;
14320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb2ed: /* ECPGA */ goto unimplemented;
14321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb2f8: /* TEND */ goto unimplemented;
14322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb2fa: /* NIAI */ goto unimplemented;
14323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb2fc: /* TABORT */ goto unimplemented;
14324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb2ff: /* TRAP4 */ goto unimplemented;
14325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb300: s390_format_RRE_FF(s390_irgen_LPEBR, ovl.fmt.RRE.r1,
14326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb301: s390_format_RRE_FF(s390_irgen_LNEBR, ovl.fmt.RRE.r1,
14328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb302: s390_format_RRE_FF(s390_irgen_LTEBR, ovl.fmt.RRE.r1,
14330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb303: s390_format_RRE_FF(s390_irgen_LCEBR, ovl.fmt.RRE.r1,
14332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb304: s390_format_RRE_FF(s390_irgen_LDEBR, ovl.fmt.RRE.r1,
14334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb305: s390_format_RRE_FF(s390_irgen_LXDBR, ovl.fmt.RRE.r1,
14336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb306: s390_format_RRE_FF(s390_irgen_LXEBR, ovl.fmt.RRE.r1,
14338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb307: /* MXDBR */ goto unimplemented;
14340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb308: /* KEBR */ goto unimplemented;
14341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb309: s390_format_RRE_FF(s390_irgen_CEBR, ovl.fmt.RRE.r1,
14342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb30a: s390_format_RRE_FF(s390_irgen_AEBR, ovl.fmt.RRE.r1,
14344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb30b: s390_format_RRE_FF(s390_irgen_SEBR, ovl.fmt.RRE.r1,
14346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb30c: /* MDEBR */ goto unimplemented;
14348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb30d: s390_format_RRE_FF(s390_irgen_DEBR, ovl.fmt.RRE.r1,
14349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb30e: s390_format_RRF_F0FF(s390_irgen_MAEBR, ovl.fmt.RRF.r1,
14351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF.r3, ovl.fmt.RRF.r2);  goto ok;
14352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb30f: s390_format_RRF_F0FF(s390_irgen_MSEBR, ovl.fmt.RRF.r1,
14353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF.r3, ovl.fmt.RRF.r2);  goto ok;
14354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb310: s390_format_RRE_FF(s390_irgen_LPDBR, ovl.fmt.RRE.r1,
14355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb311: s390_format_RRE_FF(s390_irgen_LNDBR, ovl.fmt.RRE.r1,
14357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb312: s390_format_RRE_FF(s390_irgen_LTDBR, ovl.fmt.RRE.r1,
14359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb313: s390_format_RRE_FF(s390_irgen_LCDBR, ovl.fmt.RRE.r1,
14361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb314: s390_format_RRE_FF(s390_irgen_SQEBR, ovl.fmt.RRE.r1,
14363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb315: s390_format_RRE_FF(s390_irgen_SQDBR, ovl.fmt.RRE.r1,
14365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb316: s390_format_RRE_FF(s390_irgen_SQXBR, ovl.fmt.RRE.r1,
14367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb317: s390_format_RRE_FF(s390_irgen_MEEBR, ovl.fmt.RRE.r1,
14369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb318: /* KDBR */ goto unimplemented;
14371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb319: s390_format_RRE_FF(s390_irgen_CDBR, ovl.fmt.RRE.r1,
14372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb31a: s390_format_RRE_FF(s390_irgen_ADBR, ovl.fmt.RRE.r1,
14374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb31b: s390_format_RRE_FF(s390_irgen_SDBR, ovl.fmt.RRE.r1,
14376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb31c: s390_format_RRE_FF(s390_irgen_MDBR, ovl.fmt.RRE.r1,
14378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb31d: s390_format_RRE_FF(s390_irgen_DDBR, ovl.fmt.RRE.r1,
14380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb31e: s390_format_RRF_F0FF(s390_irgen_MADBR, ovl.fmt.RRF.r1,
14382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF.r3, ovl.fmt.RRF.r2);  goto ok;
14383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb31f: s390_format_RRF_F0FF(s390_irgen_MSDBR, ovl.fmt.RRF.r1,
14384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF.r3, ovl.fmt.RRF.r2);  goto ok;
14385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb324: /* LDER */ goto unimplemented;
14386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb325: /* LXDR */ goto unimplemented;
14387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb326: /* LXER */ goto unimplemented;
14388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb32e: /* MAER */ goto unimplemented;
14389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb32f: /* MSER */ goto unimplemented;
14390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb336: /* SQXR */ goto unimplemented;
14391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb337: /* MEER */ goto unimplemented;
14392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb338: /* MAYLR */ goto unimplemented;
14393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb339: /* MYLR */ goto unimplemented;
14394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb33a: /* MAYR */ goto unimplemented;
14395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb33b: /* MYR */ goto unimplemented;
14396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb33c: /* MAYHR */ goto unimplemented;
14397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb33d: /* MYHR */ goto unimplemented;
14398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb33e: /* MADR */ goto unimplemented;
14399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb33f: /* MSDR */ goto unimplemented;
14400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb340: s390_format_RRE_FF(s390_irgen_LPXBR, ovl.fmt.RRE.r1,
14401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb341: s390_format_RRE_FF(s390_irgen_LNXBR, ovl.fmt.RRE.r1,
14403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb342: s390_format_RRE_FF(s390_irgen_LTXBR, ovl.fmt.RRE.r1,
14405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb343: s390_format_RRE_FF(s390_irgen_LCXBR, ovl.fmt.RRE.r1,
14407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb344: s390_format_RRF_UUFF(s390_irgen_LEDBR, ovl.fmt.RRF2.m3,
14409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb345: s390_format_RRF_UUFF(s390_irgen_LDXBR, ovl.fmt.RRF2.m3,
14412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb346: s390_format_RRF_UUFF(s390_irgen_LEXBR, ovl.fmt.RRF2.m3,
14415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb347: /* FIXBR */ goto unimplemented;
14418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb348: /* KXBR */ goto unimplemented;
14419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb349: s390_format_RRE_FF(s390_irgen_CXBR, ovl.fmt.RRE.r1,
14420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb34a: s390_format_RRE_FF(s390_irgen_AXBR, ovl.fmt.RRE.r1,
14422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb34b: s390_format_RRE_FF(s390_irgen_SXBR, ovl.fmt.RRE.r1,
14424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb34c: s390_format_RRE_FF(s390_irgen_MXBR, ovl.fmt.RRE.r1,
14426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb34d: s390_format_RRE_FF(s390_irgen_DXBR, ovl.fmt.RRE.r1,
14428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb350: /* TBEDR */ goto unimplemented;
14430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb351: /* TBDR */ goto unimplemented;
14431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb353: /* DIEBR */ goto unimplemented;
14432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb357: /* FIEBR */ goto unimplemented;
14433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb358: /* THDER */ goto unimplemented;
14434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb359: /* THDR */ goto unimplemented;
14435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb35b: /* DIDBR */ goto unimplemented;
14436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb35f: /* FIDBR */ goto unimplemented;
14437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb360: /* LPXR */ goto unimplemented;
14438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb361: /* LNXR */ goto unimplemented;
14439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb362: /* LTXR */ goto unimplemented;
14440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb363: /* LCXR */ goto unimplemented;
14441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb365: s390_format_RRE_FF(s390_irgen_LXR, ovl.fmt.RRE.r1,
14442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb366: /* LEXR */ goto unimplemented;
14444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb367: /* FIXR */ goto unimplemented;
14445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb369: /* CXR */ goto unimplemented;
14446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb370: s390_format_RRE_FF(s390_irgen_LPDFR, ovl.fmt.RRE.r1,
14447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb371: s390_format_RRE_FF(s390_irgen_LNDFR, ovl.fmt.RRE.r1,
14449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb372: s390_format_RRF_F0FF2(s390_irgen_CPSDR, ovl.fmt.RRF3.r3,
14451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
14452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb373: s390_format_RRE_FF(s390_irgen_LCDFR, ovl.fmt.RRE.r1,
14454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb374: s390_format_RRE_F0(s390_irgen_LZER, ovl.fmt.RRE.r1);  goto ok;
14456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb375: s390_format_RRE_F0(s390_irgen_LZDR, ovl.fmt.RRE.r1);  goto ok;
14457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb376: s390_format_RRE_F0(s390_irgen_LZXR, ovl.fmt.RRE.r1);  goto ok;
14458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb377: /* FIER */ goto unimplemented;
14459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb37f: /* FIDR */ goto unimplemented;
14460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb384: s390_format_RRE_R0(s390_irgen_SFPC, ovl.fmt.RRE.r1);  goto ok;
14461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb385: /* SFASR */ goto unimplemented;
14462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb38c: s390_format_RRE_R0(s390_irgen_EFPC, ovl.fmt.RRE.r1);  goto ok;
14463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb390: s390_format_RRF_UUFR(s390_irgen_CELFBR, ovl.fmt.RRF2.m3,
14464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb391: s390_format_RRF_UUFR(s390_irgen_CDLFBR, ovl.fmt.RRF2.m3,
14467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb392: s390_format_RRF_UUFR(s390_irgen_CXLFBR, ovl.fmt.RRF2.m3,
14470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb394: s390_format_RRF_UUFR(s390_irgen_CEFBR, ovl.fmt.RRF2.m3,
14473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb395: s390_format_RRF_UUFR(s390_irgen_CDFBR, ovl.fmt.RRF2.m3,
14476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb396: s390_format_RRF_UUFR(s390_irgen_CXFBR, ovl.fmt.RRF2.m3,
14479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb398: s390_format_RRF_UURF(s390_irgen_CFEBR, ovl.fmt.RRF2.m3,
14482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb399: s390_format_RRF_UURF(s390_irgen_CFDBR, ovl.fmt.RRF2.m3,
14485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb39a: s390_format_RRF_UURF(s390_irgen_CFXBR, ovl.fmt.RRF2.m3,
14488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb39c: s390_format_RRF_UURF(s390_irgen_CLFEBR, ovl.fmt.RRF2.m3,
14491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb39d: s390_format_RRF_UURF(s390_irgen_CLFDBR, ovl.fmt.RRF2.m3,
14494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb39e: s390_format_RRF_UURF(s390_irgen_CLFXBR, ovl.fmt.RRF2.m3,
14497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3a0: s390_format_RRF_UUFR(s390_irgen_CELGBR, ovl.fmt.RRF2.m3,
14500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3a1: s390_format_RRF_UUFR(s390_irgen_CDLGBR, ovl.fmt.RRF2.m3,
14503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3a2: s390_format_RRF_UUFR(s390_irgen_CXLGBR, ovl.fmt.RRF2.m3,
14506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3a4: s390_format_RRF_UUFR(s390_irgen_CEGBR, ovl.fmt.RRF2.m3,
14509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3a5: s390_format_RRF_UUFR(s390_irgen_CDGBR, ovl.fmt.RRF2.m3,
14512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3a6: s390_format_RRF_UUFR(s390_irgen_CXGBR, ovl.fmt.RRF2.m3,
14515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3a8: s390_format_RRF_UURF(s390_irgen_CGEBR, ovl.fmt.RRF2.m3,
14518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3a9: s390_format_RRF_UURF(s390_irgen_CGDBR, ovl.fmt.RRF2.m3,
14521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3aa: s390_format_RRF_UURF(s390_irgen_CGXBR, ovl.fmt.RRF2.m3,
14524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3ac: s390_format_RRF_UURF(s390_irgen_CLGEBR, ovl.fmt.RRF2.m3,
14527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3ad: s390_format_RRF_UURF(s390_irgen_CLGDBR, ovl.fmt.RRF2.m3,
14530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3ae: s390_format_RRF_UURF(s390_irgen_CLGXBR, ovl.fmt.RRF2.m3,
14533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3b4: /* CEFR */ goto unimplemented;
14536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3b5: /* CDFR */ goto unimplemented;
14537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3b6: /* CXFR */ goto unimplemented;
14538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3b8: /* CFER */ goto unimplemented;
14539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3b9: /* CFDR */ goto unimplemented;
14540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3ba: /* CFXR */ goto unimplemented;
14541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3c1: s390_format_RRE_FR(s390_irgen_LDGR, ovl.fmt.RRE.r1,
14542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3c4: /* CEGR */ goto unimplemented;
14544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3c5: /* CDGR */ goto unimplemented;
14545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3c6: /* CXGR */ goto unimplemented;
14546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3c8: /* CGER */ goto unimplemented;
14547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3c9: /* CGDR */ goto unimplemented;
14548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3ca: /* CGXR */ goto unimplemented;
14549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3cd: s390_format_RRE_RF(s390_irgen_LGDR, ovl.fmt.RRE.r1,
14550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3d0: s390_format_RRF_FUFF2(s390_irgen_MDTRA, ovl.fmt.RRF4.r3,
14552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      ovl.fmt.RRF4.m4, ovl.fmt.RRF4.r1,
14553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      ovl.fmt.RRF4.r2); goto ok;
14554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3d1: s390_format_RRF_FUFF2(s390_irgen_DDTRA, ovl.fmt.RRF4.r3,
14555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      ovl.fmt.RRF4.m4, ovl.fmt.RRF4.r1,
14556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      ovl.fmt.RRF4.r2); goto ok;
14557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3d2: s390_format_RRF_FUFF2(s390_irgen_ADTRA, ovl.fmt.RRF4.r3,
14558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      ovl.fmt.RRF4.m4, ovl.fmt.RRF4.r1,
14559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      ovl.fmt.RRF4.r2); goto ok;
14560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3d3: s390_format_RRF_FUFF2(s390_irgen_SDTRA, ovl.fmt.RRF4.r3,
14561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      ovl.fmt.RRF4.m4, ovl.fmt.RRF4.r1,
14562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      ovl.fmt.RRF4.r2); goto ok;
14563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3d4: s390_format_RRF_0UFF(s390_irgen_LDETR, ovl.fmt.RRF5.m4,
14564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF5.r1, ovl.fmt.RRF5.r2); goto ok;
14565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3d5: s390_format_RRF_UUFF(s390_irgen_LEDTR, ovl.fmt.RRF2.m3,
14566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3d6: s390_format_RRE_FF(s390_irgen_LTDTR, ovl.fmt.RRE.r1,
14569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   ovl.fmt.RRE.r2);  goto ok;
14570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3d7: /* FIDTR */ goto unimplemented;
14571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3d8: s390_format_RRF_FUFF2(s390_irgen_MXTRA, ovl.fmt.RRF4.r3,
14572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF4.m4, ovl.fmt.RRF4.r1,
14573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF4.r2); goto ok;
14574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3d9: s390_format_RRF_FUFF2(s390_irgen_DXTRA, ovl.fmt.RRF4.r3,
14575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF4.m4, ovl.fmt.RRF4.r1,
14576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF4.r2); goto ok;
14577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3da: s390_format_RRF_FUFF2(s390_irgen_AXTRA, ovl.fmt.RRF4.r3,
14578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF4.m4, ovl.fmt.RRF4.r1,
14579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF4.r2); goto ok;
14580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3db: s390_format_RRF_FUFF2(s390_irgen_SXTRA, ovl.fmt.RRF4.r3,
14581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF4.m4, ovl.fmt.RRF4.r1,
14582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF4.r2); goto ok;
14583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3dc: s390_format_RRF_0UFF(s390_irgen_LXDTR, ovl.fmt.RRF5.m4,
14584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF5.r1, ovl.fmt.RRF5.r2); goto ok;
14585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3dd: s390_format_RRF_UUFF(s390_irgen_LDXTR, ovl.fmt.RRF2.m3,
14586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3de: s390_format_RRE_FF(s390_irgen_LTXTR, ovl.fmt.RRE.r1,
14589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   ovl.fmt.RRE.r2);  goto ok;
14590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3df: /* FIXTR */ goto unimplemented;
14591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3e0: /* KDTR */ goto unimplemented;
14592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3e1: s390_format_RRF_UURF(s390_irgen_CGDTR, ovl.fmt.RRF2.m3,
14593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3e2: /* CUDTR */ goto unimplemented;
14596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3e3: /* CSDTR */ goto unimplemented;
14597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3e4: s390_format_RRE_FF(s390_irgen_CDTR, ovl.fmt.RRE.r1,
14598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   ovl.fmt.RRE.r2);  goto ok;
14599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3e5: s390_format_RRE_RF(s390_irgen_EEDTR, ovl.fmt.RRE.r1,
14600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   ovl.fmt.RRE.r2);  goto ok;
14601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3e7: s390_format_RRE_RF(s390_irgen_ESDTR, ovl.fmt.RRE.r1,
14602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   ovl.fmt.RRE.r2);  goto ok;
14603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3e8: /* KXTR */ goto unimplemented;
14604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3e9: s390_format_RRF_UURF(s390_irgen_CGXTR, ovl.fmt.RRF2.m3,
14605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3ea: /* CUXTR */ goto unimplemented;
14608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3eb: /* CSXTR */ goto unimplemented;
14609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3ec: s390_format_RRE_FF(s390_irgen_CXTR, ovl.fmt.RRE.r1,
14610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   ovl.fmt.RRE.r2);  goto ok;
14611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3ed: s390_format_RRE_RF(s390_irgen_EEXTR, ovl.fmt.RRE.r1,
14612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   ovl.fmt.RRE.r2);  goto ok;
14613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3ef: s390_format_RRE_RF(s390_irgen_ESXTR, ovl.fmt.RRE.r1,
14614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   ovl.fmt.RRE.r2);  goto ok;
14615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3f1: s390_format_RRF_UUFR(s390_irgen_CDGTRA, ovl.fmt.RRF2.m3,
14616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3f2: /* CDUTR */ goto unimplemented;
14619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3f3: /* CDSTR */ goto unimplemented;
14620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3f4: s390_format_RRE_FF(s390_irgen_CEDTR, ovl.fmt.RRE.r1,
14621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   ovl.fmt.RRE.r2);  goto ok;
14622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3f5: s390_format_RRF_FUFF(s390_irgen_QADTR, ovl.fmt.RRF4.r3,
14623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF4.m4, ovl.fmt.RRF4.r1,
14624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF4.r2); goto ok;
14625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3f6: s390_format_RRF_F0FR(s390_irgen_IEDTR, ovl.fmt.RRF3.r3,
14626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2); goto ok;
14627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3f7: s390_format_RRF_FFRU(s390_irgen_RRDTR, ovl.fmt.RRF4.r3,
14628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF4.m4, ovl.fmt.RRF4.r1,
14629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF4.r2); goto ok;
14630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3f9: s390_format_RRF_UUFR(s390_irgen_CXGTR, ovl.fmt.RRF2.m3,
14631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3fa: /* CXUTR */ goto unimplemented;
14634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3fb: /* CXSTR */ goto unimplemented;
14635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3fc: s390_format_RRE_FF(s390_irgen_CEXTR, ovl.fmt.RRE.r1,
14636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   ovl.fmt.RRE.r2);  goto ok;
14637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3fd: s390_format_RRF_FUFF(s390_irgen_QAXTR, ovl.fmt.RRF4.r3,
14638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF4.m4, ovl.fmt.RRF4.r1,
14639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF4.r2); goto ok;
14640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3fe: s390_format_RRF_F0FR(s390_irgen_IEXTR, ovl.fmt.RRF3.r3,
14641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2); goto ok;
14642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb3ff: s390_format_RRF_FFRU(s390_irgen_RRXTR, ovl.fmt.RRF4.r3,
14643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF4.m4, ovl.fmt.RRF4.r1,
14644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF4.r2); goto ok;
14645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb900: s390_format_RRE_RR(s390_irgen_LPGR, ovl.fmt.RRE.r1,
14646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb901: s390_format_RRE_RR(s390_irgen_LNGR, ovl.fmt.RRE.r1,
14648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb902: s390_format_RRE_RR(s390_irgen_LTGR, ovl.fmt.RRE.r1,
14650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb903: s390_format_RRE_RR(s390_irgen_LCGR, ovl.fmt.RRE.r1,
14652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb904: s390_format_RRE_RR(s390_irgen_LGR, ovl.fmt.RRE.r1,
14654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb905: /* LURAG */ goto unimplemented;
14656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb906: s390_format_RRE_RR(s390_irgen_LGBR, ovl.fmt.RRE.r1,
14657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb907: s390_format_RRE_RR(s390_irgen_LGHR, ovl.fmt.RRE.r1,
14659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb908: s390_format_RRE_RR(s390_irgen_AGR, ovl.fmt.RRE.r1,
14661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb909: s390_format_RRE_RR(s390_irgen_SGR, ovl.fmt.RRE.r1,
14663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb90a: s390_format_RRE_RR(s390_irgen_ALGR, ovl.fmt.RRE.r1,
14665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb90b: s390_format_RRE_RR(s390_irgen_SLGR, ovl.fmt.RRE.r1,
14667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb90c: s390_format_RRE_RR(s390_irgen_MSGR, ovl.fmt.RRE.r1,
14669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb90d: s390_format_RRE_RR(s390_irgen_DSGR, ovl.fmt.RRE.r1,
14671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb90e: /* EREGG */ goto unimplemented;
14673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb90f: s390_format_RRE_RR(s390_irgen_LRVGR, ovl.fmt.RRE.r1,
14674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb910: s390_format_RRE_RR(s390_irgen_LPGFR, ovl.fmt.RRE.r1,
14676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb911: s390_format_RRE_RR(s390_irgen_LNGFR, ovl.fmt.RRE.r1,
14678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb912: s390_format_RRE_RR(s390_irgen_LTGFR, ovl.fmt.RRE.r1,
14680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb913: s390_format_RRE_RR(s390_irgen_LCGFR, ovl.fmt.RRE.r1,
14682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb914: s390_format_RRE_RR(s390_irgen_LGFR, ovl.fmt.RRE.r1,
14684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb916: s390_format_RRE_RR(s390_irgen_LLGFR, ovl.fmt.RRE.r1,
14686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb917: s390_format_RRE_RR(s390_irgen_LLGTR, ovl.fmt.RRE.r1,
14688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb918: s390_format_RRE_RR(s390_irgen_AGFR, ovl.fmt.RRE.r1,
14690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb919: s390_format_RRE_RR(s390_irgen_SGFR, ovl.fmt.RRE.r1,
14692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb91a: s390_format_RRE_RR(s390_irgen_ALGFR, ovl.fmt.RRE.r1,
14694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb91b: s390_format_RRE_RR(s390_irgen_SLGFR, ovl.fmt.RRE.r1,
14696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb91c: s390_format_RRE_RR(s390_irgen_MSGFR, ovl.fmt.RRE.r1,
14698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb91d: s390_format_RRE_RR(s390_irgen_DSGFR, ovl.fmt.RRE.r1,
14700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb91e: /* KMAC */ goto unimplemented;
14702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb91f: s390_format_RRE_RR(s390_irgen_LRVR, ovl.fmt.RRE.r1,
14703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb920: s390_format_RRE_RR(s390_irgen_CGR, ovl.fmt.RRE.r1,
14705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb921: s390_format_RRE_RR(s390_irgen_CLGR, ovl.fmt.RRE.r1,
14707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb925: /* STURG */ goto unimplemented;
14709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb926: s390_format_RRE_RR(s390_irgen_LBR, ovl.fmt.RRE.r1,
14710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb927: s390_format_RRE_RR(s390_irgen_LHR, ovl.fmt.RRE.r1,
14712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb928: /* PCKMO */ goto unimplemented;
14714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb92a: /* KMF */ goto unimplemented;
14715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb92b: /* KMO */ goto unimplemented;
14716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb92c: /* PCC */ goto unimplemented;
14717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb92d: /* KMCTR */ goto unimplemented;
14718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb92e: /* KM */ goto unimplemented;
14719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb92f: /* KMC */ goto unimplemented;
14720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb930: s390_format_RRE_RR(s390_irgen_CGFR, ovl.fmt.RRE.r1,
14721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb931: s390_format_RRE_RR(s390_irgen_CLGFR, ovl.fmt.RRE.r1,
14723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb93e: /* KIMD */ goto unimplemented;
14725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb93f: /* KLMD */ goto unimplemented;
14726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb941: s390_format_RRF_UURF(s390_irgen_CFDTR, ovl.fmt.RRF2.m3,
14727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb942: s390_format_RRF_UURF(s390_irgen_CLGDTR, ovl.fmt.RRF2.m3,
14730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb943: s390_format_RRF_UURF(s390_irgen_CLFDTR, ovl.fmt.RRF2.m3,
14733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb946: s390_format_RRE_RR(s390_irgen_BCTGR, ovl.fmt.RRE.r1,
14736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb949: s390_format_RRF_UURF(s390_irgen_CFXTR, ovl.fmt.RRF2.m3,
14738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb94a: s390_format_RRF_UURF(s390_irgen_CLGXTR, ovl.fmt.RRF2.m3,
14741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb94b: s390_format_RRF_UURF(s390_irgen_CLFXTR, ovl.fmt.RRF2.m3,
14744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb951: s390_format_RRF_UUFR(s390_irgen_CDFTR, ovl.fmt.RRF2.m3,
14747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb952: s390_format_RRF_UUFR(s390_irgen_CDLGTR, ovl.fmt.RRF2.m3,
14750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb953: s390_format_RRF_UUFR(s390_irgen_CDLFTR, ovl.fmt.RRF2.m3,
14753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb959: s390_format_RRF_UUFR(s390_irgen_CXFTR, ovl.fmt.RRF2.m3,
14756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb95a: s390_format_RRF_UUFR(s390_irgen_CXLGTR, ovl.fmt.RRF2.m3,
14759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb95b: s390_format_RRF_UUFR(s390_irgen_CXLFTR, ovl.fmt.RRF2.m3,
14762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.m4, ovl.fmt.RRF2.r1,
14763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     ovl.fmt.RRF2.r2);  goto ok;
14764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb960: /* CGRT */ goto unimplemented;
14765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb961: /* CLGRT */ goto unimplemented;
14766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb972: /* CRT */ goto unimplemented;
14767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb973: /* CLRT */ goto unimplemented;
14768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb980: s390_format_RRE_RR(s390_irgen_NGR, ovl.fmt.RRE.r1,
14769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb981: s390_format_RRE_RR(s390_irgen_OGR, ovl.fmt.RRE.r1,
14771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb982: s390_format_RRE_RR(s390_irgen_XGR, ovl.fmt.RRE.r1,
14773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb983: s390_format_RRE_RR(s390_irgen_FLOGR, ovl.fmt.RRE.r1,
14775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb984: s390_format_RRE_RR(s390_irgen_LLGCR, ovl.fmt.RRE.r1,
14777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb985: s390_format_RRE_RR(s390_irgen_LLGHR, ovl.fmt.RRE.r1,
14779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb986: s390_format_RRE_RR(s390_irgen_MLGR, ovl.fmt.RRE.r1,
14781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb987: s390_format_RRE_RR(s390_irgen_DLGR, ovl.fmt.RRE.r1,
14783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb988: s390_format_RRE_RR(s390_irgen_ALCGR, ovl.fmt.RRE.r1,
14785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb989: s390_format_RRE_RR(s390_irgen_SLBGR, ovl.fmt.RRE.r1,
14787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb98a: /* CSPG */ goto unimplemented;
14789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb98d: /* EPSW */ goto unimplemented;
14790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb98e: /* IDTE */ goto unimplemented;
14791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xb98f: /* CRDTE */ goto unimplemented;
14792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb990: s390_format_RRF_M0RERE(s390_irgen_TRTT, ovl.fmt.RRF3.r3,
14793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);  goto ok;
14794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb991: s390_format_RRF_M0RERE(s390_irgen_TRTO, ovl.fmt.RRF3.r3,
14795663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);  goto ok;
14796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb992: s390_format_RRF_M0RERE(s390_irgen_TROT, ovl.fmt.RRF3.r3,
14797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);  goto ok;
14798663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb993: s390_format_RRF_M0RERE(s390_irgen_TROO, ovl.fmt.RRF3.r3,
14799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);  goto ok;
14800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb994: s390_format_RRE_RR(s390_irgen_LLCR, ovl.fmt.RRE.r1,
14801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb995: s390_format_RRE_RR(s390_irgen_LLHR, ovl.fmt.RRE.r1,
14803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb996: s390_format_RRE_RR(s390_irgen_MLR, ovl.fmt.RRE.r1,
14805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb997: s390_format_RRE_RR(s390_irgen_DLR, ovl.fmt.RRE.r1,
14807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb998: s390_format_RRE_RR(s390_irgen_ALCR, ovl.fmt.RRE.r1,
14809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb999: s390_format_RRE_RR(s390_irgen_SLBR, ovl.fmt.RRE.r1,
14811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb99a: /* EPAIR */ goto unimplemented;
14813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb99b: /* ESAIR */ goto unimplemented;
14814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb99d: /* ESEA */ goto unimplemented;
14815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb99e: /* PTI */ goto unimplemented;
14816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb99f: /* SSAIR */ goto unimplemented;
14817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9a2: /* PTF */ goto unimplemented;
14818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9aa: /* LPTEA */ goto unimplemented;
14819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9ae: /* RRBM */ goto unimplemented;
14820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9af: /* PFMF */ goto unimplemented;
14821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb9b0: s390_format_RRF_M0RERE(s390_irgen_CU14, ovl.fmt.RRF3.r3,
14822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
14823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto ok;
14824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb9b1: s390_format_RRF_M0RERE(s390_irgen_CU24, ovl.fmt.RRF3.r3,
14825663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
14826663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto ok;
14827663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb9b2: s390_format_RRE_RR(s390_irgen_CU41, ovl.fmt.RRE.r1,
14828663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   ovl.fmt.RRE.r2);  goto ok;
14829663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb9b3: s390_format_RRE_RR(s390_irgen_CU42, ovl.fmt.RRE.r1,
14830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   ovl.fmt.RRE.r2);  goto ok;
14831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9bd: /* TRTRE */ goto unimplemented;
14832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9be: /* SRSTU */ goto unimplemented;
14833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9bf: /* TRTE */ goto unimplemented;
14834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9c8: s390_format_RRF_R0RR2(s390_irgen_AHHHR, ovl.fmt.RRF4.r3,
14835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9c9: s390_format_RRF_R0RR2(s390_irgen_SHHHR, ovl.fmt.RRF4.r3,
14838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9ca: s390_format_RRF_R0RR2(s390_irgen_ALHHHR, ovl.fmt.RRF4.r3,
14841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9cb: s390_format_RRF_R0RR2(s390_irgen_SLHHHR, ovl.fmt.RRF4.r3,
14844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9cd: s390_format_RRE_RR(s390_irgen_CHHR, ovl.fmt.RRE.r1,
14847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9cf: s390_format_RRE_RR(s390_irgen_CLHHR, ovl.fmt.RRE.r1,
14849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9d8: s390_format_RRF_R0RR2(s390_irgen_AHHLR, ovl.fmt.RRF4.r3,
14851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9d9: s390_format_RRF_R0RR2(s390_irgen_SHHLR, ovl.fmt.RRF4.r3,
14854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9da: s390_format_RRF_R0RR2(s390_irgen_ALHHLR, ovl.fmt.RRF4.r3,
14857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9db: s390_format_RRF_R0RR2(s390_irgen_SLHHLR, ovl.fmt.RRF4.r3,
14860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9dd: s390_format_RRE_RR(s390_irgen_CHLR, ovl.fmt.RRE.r1,
14863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9df: s390_format_RRE_RR(s390_irgen_CLHLR, ovl.fmt.RRE.r1,
14865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
14866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9e1: /* POPCNT */ goto unimplemented;
14867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9e2: s390_format_RRF_U0RR(s390_irgen_LOCGR, ovl.fmt.RRF3.r3,
14868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2,
14869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     S390_XMNM_LOCGR);  goto ok;
14870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9e4: s390_format_RRF_R0RR2(s390_irgen_NGRK, ovl.fmt.RRF4.r3,
14871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9e6: s390_format_RRF_R0RR2(s390_irgen_OGRK, ovl.fmt.RRF4.r3,
14874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9e7: s390_format_RRF_R0RR2(s390_irgen_XGRK, ovl.fmt.RRF4.r3,
14877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9e8: s390_format_RRF_R0RR2(s390_irgen_AGRK, ovl.fmt.RRF4.r3,
14880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9e9: s390_format_RRF_R0RR2(s390_irgen_SGRK, ovl.fmt.RRF4.r3,
14883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9ea: s390_format_RRF_R0RR2(s390_irgen_ALGRK, ovl.fmt.RRF4.r3,
14886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9eb: s390_format_RRF_R0RR2(s390_irgen_SLGRK, ovl.fmt.RRF4.r3,
14889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9f2: s390_format_RRF_U0RR(s390_irgen_LOCR, ovl.fmt.RRF3.r3,
14892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2,
14893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     S390_XMNM_LOCR);  goto ok;
14894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9f4: s390_format_RRF_R0RR2(s390_irgen_NRK, ovl.fmt.RRF4.r3,
14895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9f6: s390_format_RRF_R0RR2(s390_irgen_ORK, ovl.fmt.RRF4.r3,
14898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9f7: s390_format_RRF_R0RR2(s390_irgen_XRK, ovl.fmt.RRF4.r3,
14901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9f8: s390_format_RRF_R0RR2(s390_irgen_ARK, ovl.fmt.RRF4.r3,
14904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9f9: s390_format_RRF_R0RR2(s390_irgen_SRK, ovl.fmt.RRF4.r3,
14907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9fa: s390_format_RRF_R0RR2(s390_irgen_ALRK, ovl.fmt.RRF4.r3,
14910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9fb: s390_format_RRF_R0RR2(s390_irgen_SLRK, ovl.fmt.RRF4.r3,
14913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
14914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
14915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
14916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch ((ovl.value & 0xff000000) >> 24) {
14918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x40: s390_format_RX_RRRD(s390_irgen_STH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x41: s390_format_RX_RRRD(s390_irgen_LA, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x42: s390_format_RX_RRRD(s390_irgen_STC, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x43: s390_format_RX_RRRD(s390_irgen_IC, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x44: s390_format_RX_RRRD(s390_irgen_EX, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x45: /* BAL */ goto unimplemented;
14929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x46: s390_format_RX_RRRD(s390_irgen_BCT, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x47: s390_format_RX(s390_irgen_BC, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x48: s390_format_RX_RRRD(s390_irgen_LH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x49: s390_format_RX_RRRD(s390_irgen_CH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x4a: s390_format_RX_RRRD(s390_irgen_AH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x4b: s390_format_RX_RRRD(s390_irgen_SH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x4c: s390_format_RX_RRRD(s390_irgen_MH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x4d: s390_format_RX_RRRD(s390_irgen_BAS, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x4e: s390_format_RX_RRRD(s390_irgen_CVD, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x4f: s390_format_RX_RRRD(s390_irgen_CVB, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x50: s390_format_RX_RRRD(s390_irgen_ST, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x51: s390_format_RX_RRRD(s390_irgen_LAE, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x54: s390_format_RX_RRRD(s390_irgen_N, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x55: s390_format_RX_RRRD(s390_irgen_CL, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x56: s390_format_RX_RRRD(s390_irgen_O, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x57: s390_format_RX_RRRD(s390_irgen_X, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x58: s390_format_RX_RRRD(s390_irgen_L, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x59: s390_format_RX_RRRD(s390_irgen_C, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x5a: s390_format_RX_RRRD(s390_irgen_A, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x5b: s390_format_RX_RRRD(s390_irgen_S, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x5c: s390_format_RX_RRRD(s390_irgen_M, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x5d: s390_format_RX_RRRD(s390_irgen_D, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x5e: s390_format_RX_RRRD(s390_irgen_AL, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x5f: s390_format_RX_RRRD(s390_irgen_SL, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x60: s390_format_RX_FRRD(s390_irgen_STD, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x67: /* MXD */ goto unimplemented;
14980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x68: s390_format_RX_FRRD(s390_irgen_LD, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x69: /* CD */ goto unimplemented;
14983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x6a: /* AD */ goto unimplemented;
14984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x6b: /* SD */ goto unimplemented;
14985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x6c: /* MD */ goto unimplemented;
14986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x6d: /* DD */ goto unimplemented;
14987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x6e: /* AW */ goto unimplemented;
14988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x6f: /* SW */ goto unimplemented;
14989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x70: s390_format_RX_FRRD(s390_irgen_STE, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x71: s390_format_RX_RRRD(s390_irgen_MS, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x78: s390_format_RX_FRRD(s390_irgen_LE, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
14994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
14995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x79: /* CE */ goto unimplemented;
14996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x7a: /* AE */ goto unimplemented;
14997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x7b: /* SE */ goto unimplemented;
14998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x7c: /* MDE */ goto unimplemented;
14999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x7d: /* DE */ goto unimplemented;
15000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x7e: /* AU */ goto unimplemented;
15001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x7f: /* SU */ goto unimplemented;
15002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x83: /* DIAG */ goto unimplemented;
15003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x84: s390_format_RSI_RRP(s390_irgen_BRXH, ovl.fmt.RSI.r1,
15004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RSI.r3, ovl.fmt.RSI.i2);  goto ok;
15005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x85: s390_format_RSI_RRP(s390_irgen_BRXLE, ovl.fmt.RSI.r1,
15006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RSI.r3, ovl.fmt.RSI.i2);  goto ok;
15007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x86: s390_format_RS_RRRD(s390_irgen_BXH, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
15008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
15009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x87: s390_format_RS_RRRD(s390_irgen_BXLE, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
15010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
15011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x88: s390_format_RS_R0RD(s390_irgen_SRL, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
15012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.d2);  goto ok;
15013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x89: s390_format_RS_R0RD(s390_irgen_SLL, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
15014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.d2);  goto ok;
15015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x8a: s390_format_RS_R0RD(s390_irgen_SRA, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
15016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.d2);  goto ok;
15017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x8b: s390_format_RS_R0RD(s390_irgen_SLA, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
15018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.d2);  goto ok;
15019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x8c: s390_format_RS_R0RD(s390_irgen_SRDL, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
15020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.d2);  goto ok;
15021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x8d: s390_format_RS_R0RD(s390_irgen_SLDL, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
15022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.d2);  goto ok;
15023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x8e: s390_format_RS_R0RD(s390_irgen_SRDA, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
15024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.d2);  goto ok;
15025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x8f: s390_format_RS_R0RD(s390_irgen_SLDA, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
15026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.d2);  goto ok;
15027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x90: s390_format_RS_RRRD(s390_irgen_STM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
15028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
15029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x91: s390_format_SI_URD(s390_irgen_TM, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
15030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 ovl.fmt.SI.d1);  goto ok;
15031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x92: s390_format_SI_URD(s390_irgen_MVI, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
15032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 ovl.fmt.SI.d1);  goto ok;
15033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x94: s390_format_SI_URD(s390_irgen_NI, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
15034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 ovl.fmt.SI.d1);  goto ok;
15035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x95: s390_format_SI_URD(s390_irgen_CLI, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
15036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 ovl.fmt.SI.d1);  goto ok;
15037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x96: s390_format_SI_URD(s390_irgen_OI, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
15038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 ovl.fmt.SI.d1);  goto ok;
15039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x97: s390_format_SI_URD(s390_irgen_XI, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
15040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 ovl.fmt.SI.d1);  goto ok;
15041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x98: s390_format_RS_RRRD(s390_irgen_LM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
15042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
15043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x99: /* TRACE */ goto unimplemented;
15044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x9a: s390_format_RS_AARD(s390_irgen_LAM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
15045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
15046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x9b: s390_format_RS_AARD(s390_irgen_STAM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
15047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
15048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa8: s390_format_RS_RRRD(s390_irgen_MVCLE, ovl.fmt.RS.r1,
15049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.r3, ovl.fmt.RS.b2, ovl.fmt.RS.d2);
15050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  goto ok;
15051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa9: s390_format_RS_RRRD(s390_irgen_CLCLE, ovl.fmt.RS.r1,
15052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.r3, ovl.fmt.RS.b2, ovl.fmt.RS.d2);
15053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  goto ok;
15054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xac: /* STNSM */ goto unimplemented;
15055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xad: /* STOSM */ goto unimplemented;
15056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xae: /* SIGP */ goto unimplemented;
15057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xaf: /* MC */ goto unimplemented;
15058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb1: /* LRA */ goto unimplemented;
15059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb6: /* STCTL */ goto unimplemented;
15060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb7: /* LCTL */ goto unimplemented;
15061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xba: s390_format_RS_RRRD(s390_irgen_CS, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
15062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
15063663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xbb: s390_format_RS_RRRD(s390_irgen_CDS, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
15064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
15065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xbd: s390_format_RS_RURD(s390_irgen_CLM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
15066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
15067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xbe: s390_format_RS_RURD(s390_irgen_STCM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
15068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
15069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xbf: s390_format_RS_RURD(s390_irgen_ICM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
15070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
15071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
15072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
15073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_UNKNOWN_INSN;
15074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
15075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovok:
15076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_OK;
15077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
15078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunimplemented:
15079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_UNIMPLEMENTED_INSN;
15080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
15081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
15082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic s390_decode_t
15083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_decode_6byte_and_irgen(UChar *bytes)
15084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
15085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   typedef union {
15086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
15088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
15089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3  :  4;
15090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2  : 16;
15091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  8;
15092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
15093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RIE;
15094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
15096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
15097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2  :  4;
15098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i3  :  8;
15099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i4  :  8;
15100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i5  :  8;
15101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
15102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RIE_RRUUU;
15103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
15105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
15106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  4;
15107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2  : 16;
15108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int m3  :  4;
15109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  4;
15110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
15111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RIEv1;
15112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
15114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
15115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2  :  4;
15116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i4  : 16;
15117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int m3  :  4;
15118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  4;
15119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
15120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RIE_RRPU;
15121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
15123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
15124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int m3  :  4;
15125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i4  : 16;
15126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2  :  8;
15127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
15128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RIEv3;
15129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
15131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
15132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  4;
15133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2  : 32;
15134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RIL;
15135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
15137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
15138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int m3  :  4;
15139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b4  :  4;
15140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d4  : 12;
15141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2  :  8;
15142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
15143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RIS;
15144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
15146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
15147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2  :  4;
15148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b4  :  4;
15149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d4  : 12;
15150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int m3  :  4;
15151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  4;
15152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
15153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RRS;
15154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
15156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int l1  :  4;
15157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  4;
15158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b1  :  4;
15159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d1  : 12;
15160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  8;
15161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
15162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RSL;
15163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
15165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
15166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3  :  4;
15167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2  :  4;
15168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int dl2 : 12;
15169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int dh2 :  8;
15170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
15171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RSY;
15172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
15174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
15175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int x2  :  4;
15176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2  :  4;
15177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2  : 12;
15178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  8;
15179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
15180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RXE;
15181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
15183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3  :  4;
15184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int x2  :  4;
15185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2  :  4;
15186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2  : 12;
15187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
15188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  4;
15189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
15190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RXF;
15191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
15193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
15194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int x2  :  4;
15195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2  :  4;
15196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int dl2 : 12;
15197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int dh2 :  8;
15198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
15199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RXY;
15200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
15202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2  :  8;
15203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b1  :  4;
15204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int dl1 : 12;
15205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int dh1 :  8;
15206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
15207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } SIY;
15208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
15210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int l  :  8;
15211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b1 :  4;
15212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d1 : 12;
15213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2 :  4;
15214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2 : 12;
15215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } SS;
15216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
15218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int l1 :  4;
15219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int l2 :  4;
15220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b1 :  4;
15221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d1 : 12;
15222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2 :  4;
15223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2 : 12;
15224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } SS_LLRDRD;
15225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
15227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
15228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3 :  4;
15229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2 :  4;
15230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2 : 12;
15231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b4 :  4;
15232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d4 : 12;
15233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } SS_RRRDRD2;
15234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
15236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b1 :  4;
15237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d1 : 12;
15238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2 :  4;
15239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2 : 12;
15240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } SSE;
15241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
15243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3  :  4;
15244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  4;
15245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b1  :  4;
15246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d1  : 12;
15247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2  :  4;
15248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2  : 12;
15249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } SSF;
15250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
15251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
15252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b1 :  4;
15253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d1 : 12;
15254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2 : 16;
15255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } SIL;
15256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } formats;
15257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   union {
15258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      formats fmt;
15259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ULong value;
15260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } ovl;
15261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
15262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(sizeof(formats) == 6);
15263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
15264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((UChar *)(&ovl.value))[0] = bytes[0];
15265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((UChar *)(&ovl.value))[1] = bytes[1];
15266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((UChar *)(&ovl.value))[2] = bytes[2];
15267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((UChar *)(&ovl.value))[3] = bytes[3];
15268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((UChar *)(&ovl.value))[4] = bytes[4];
15269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((UChar *)(&ovl.value))[5] = bytes[5];
15270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((UChar *)(&ovl.value))[6] = 0x0;
15271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ((UChar *)(&ovl.value))[7] = 0x0;
15272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
15273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch ((ovl.value >> 16) & 0xff00000000ffULL) {
15274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000002ULL: s390_format_RXY_RRRD(s390_irgen_LTG, ovl.fmt.RXY.r1,
15275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000003ULL: /* LRAG */ goto unimplemented;
15279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000004ULL: s390_format_RXY_RRRD(s390_irgen_LG, ovl.fmt.RXY.r1,
15280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000006ULL: s390_format_RXY_RRRD(s390_irgen_CVBY, ovl.fmt.RXY.r1,
15284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000008ULL: s390_format_RXY_RRRD(s390_irgen_AG, ovl.fmt.RXY.r1,
15288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000009ULL: s390_format_RXY_RRRD(s390_irgen_SG, ovl.fmt.RXY.r1,
15292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000000aULL: s390_format_RXY_RRRD(s390_irgen_ALG, ovl.fmt.RXY.r1,
15296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000000bULL: s390_format_RXY_RRRD(s390_irgen_SLG, ovl.fmt.RXY.r1,
15300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000000cULL: s390_format_RXY_RRRD(s390_irgen_MSG, ovl.fmt.RXY.r1,
15304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000000dULL: s390_format_RXY_RRRD(s390_irgen_DSG, ovl.fmt.RXY.r1,
15308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000000eULL: /* CVBG */ goto unimplemented;
15312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000000fULL: s390_format_RXY_RRRD(s390_irgen_LRVG, ovl.fmt.RXY.r1,
15313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000012ULL: s390_format_RXY_RRRD(s390_irgen_LT, ovl.fmt.RXY.r1,
15317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000013ULL: /* LRAY */ goto unimplemented;
15321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000014ULL: s390_format_RXY_RRRD(s390_irgen_LGF, ovl.fmt.RXY.r1,
15322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000015ULL: s390_format_RXY_RRRD(s390_irgen_LGH, ovl.fmt.RXY.r1,
15326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000016ULL: s390_format_RXY_RRRD(s390_irgen_LLGF, ovl.fmt.RXY.r1,
15330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000017ULL: s390_format_RXY_RRRD(s390_irgen_LLGT, ovl.fmt.RXY.r1,
15334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000018ULL: s390_format_RXY_RRRD(s390_irgen_AGF, ovl.fmt.RXY.r1,
15338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000019ULL: s390_format_RXY_RRRD(s390_irgen_SGF, ovl.fmt.RXY.r1,
15342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000001aULL: s390_format_RXY_RRRD(s390_irgen_ALGF, ovl.fmt.RXY.r1,
15346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000001bULL: s390_format_RXY_RRRD(s390_irgen_SLGF, ovl.fmt.RXY.r1,
15350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000001cULL: s390_format_RXY_RRRD(s390_irgen_MSGF, ovl.fmt.RXY.r1,
15354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000001dULL: s390_format_RXY_RRRD(s390_irgen_DSGF, ovl.fmt.RXY.r1,
15358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000001eULL: s390_format_RXY_RRRD(s390_irgen_LRV, ovl.fmt.RXY.r1,
15362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000001fULL: s390_format_RXY_RRRD(s390_irgen_LRVH, ovl.fmt.RXY.r1,
15366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000020ULL: s390_format_RXY_RRRD(s390_irgen_CG, ovl.fmt.RXY.r1,
15370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000021ULL: s390_format_RXY_RRRD(s390_irgen_CLG, ovl.fmt.RXY.r1,
15374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000024ULL: s390_format_RXY_RRRD(s390_irgen_STG, ovl.fmt.RXY.r1,
15378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xe30000000025ULL: /* NTSTG */ goto unimplemented;
15382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000026ULL: s390_format_RXY_RRRD(s390_irgen_CVDY, ovl.fmt.RXY.r1,
15383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000002eULL: /* CVDG */ goto unimplemented;
15387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000002fULL: s390_format_RXY_RRRD(s390_irgen_STRVG,
15388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.r1, ovl.fmt.RXY.x2,
15389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.b2, ovl.fmt.RXY.dl2,
15390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000030ULL: s390_format_RXY_RRRD(s390_irgen_CGF, ovl.fmt.RXY.r1,
15392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000031ULL: s390_format_RXY_RRRD(s390_irgen_CLGF, ovl.fmt.RXY.r1,
15396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000032ULL: s390_format_RXY_RRRD(s390_irgen_LTGF, ovl.fmt.RXY.r1,
15400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000034ULL: s390_format_RXY_RRRD(s390_irgen_CGH, ovl.fmt.RXY.r1,
15404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000036ULL: s390_format_RXY_URRD(s390_irgen_PFD, ovl.fmt.RXY.r1,
15408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000003eULL: s390_format_RXY_RRRD(s390_irgen_STRV, ovl.fmt.RXY.r1,
15412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000003fULL: s390_format_RXY_RRRD(s390_irgen_STRVH,
15416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.r1, ovl.fmt.RXY.x2,
15417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.b2, ovl.fmt.RXY.dl2,
15418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000046ULL: s390_format_RXY_RRRD(s390_irgen_BCTG, ovl.fmt.RXY.r1,
15420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000050ULL: s390_format_RXY_RRRD(s390_irgen_STY, ovl.fmt.RXY.r1,
15424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000051ULL: s390_format_RXY_RRRD(s390_irgen_MSY, ovl.fmt.RXY.r1,
15428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000054ULL: s390_format_RXY_RRRD(s390_irgen_NY, ovl.fmt.RXY.r1,
15432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000055ULL: s390_format_RXY_RRRD(s390_irgen_CLY, ovl.fmt.RXY.r1,
15436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000056ULL: s390_format_RXY_RRRD(s390_irgen_OY, ovl.fmt.RXY.r1,
15440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000057ULL: s390_format_RXY_RRRD(s390_irgen_XY, ovl.fmt.RXY.r1,
15444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000058ULL: s390_format_RXY_RRRD(s390_irgen_LY, ovl.fmt.RXY.r1,
15448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000059ULL: s390_format_RXY_RRRD(s390_irgen_CY, ovl.fmt.RXY.r1,
15452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000005aULL: s390_format_RXY_RRRD(s390_irgen_AY, ovl.fmt.RXY.r1,
15456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000005bULL: s390_format_RXY_RRRD(s390_irgen_SY, ovl.fmt.RXY.r1,
15460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000005cULL: s390_format_RXY_RRRD(s390_irgen_MFY, ovl.fmt.RXY.r1,
15464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000005eULL: s390_format_RXY_RRRD(s390_irgen_ALY, ovl.fmt.RXY.r1,
15468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000005fULL: s390_format_RXY_RRRD(s390_irgen_SLY, ovl.fmt.RXY.r1,
15472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000070ULL: s390_format_RXY_RRRD(s390_irgen_STHY, ovl.fmt.RXY.r1,
15476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000071ULL: s390_format_RXY_RRRD(s390_irgen_LAY, ovl.fmt.RXY.r1,
15480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000072ULL: s390_format_RXY_RRRD(s390_irgen_STCY, ovl.fmt.RXY.r1,
15484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000073ULL: s390_format_RXY_RRRD(s390_irgen_ICY, ovl.fmt.RXY.r1,
15488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000075ULL: s390_format_RXY_RRRD(s390_irgen_LAEY, ovl.fmt.RXY.r1,
15492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000076ULL: s390_format_RXY_RRRD(s390_irgen_LB, ovl.fmt.RXY.r1,
15496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000077ULL: s390_format_RXY_RRRD(s390_irgen_LGB, ovl.fmt.RXY.r1,
15500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000078ULL: s390_format_RXY_RRRD(s390_irgen_LHY, ovl.fmt.RXY.r1,
15504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000079ULL: s390_format_RXY_RRRD(s390_irgen_CHY, ovl.fmt.RXY.r1,
15508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000007aULL: s390_format_RXY_RRRD(s390_irgen_AHY, ovl.fmt.RXY.r1,
15512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000007bULL: s390_format_RXY_RRRD(s390_irgen_SHY, ovl.fmt.RXY.r1,
15516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000007cULL: s390_format_RXY_RRRD(s390_irgen_MHY, ovl.fmt.RXY.r1,
15520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000080ULL: s390_format_RXY_RRRD(s390_irgen_NG, ovl.fmt.RXY.r1,
15524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000081ULL: s390_format_RXY_RRRD(s390_irgen_OG, ovl.fmt.RXY.r1,
15528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000082ULL: s390_format_RXY_RRRD(s390_irgen_XG, ovl.fmt.RXY.r1,
15532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xe30000000085ULL: /* LGAT */ goto unimplemented;
15536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000086ULL: s390_format_RXY_RRRD(s390_irgen_MLG, ovl.fmt.RXY.r1,
15537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000087ULL: s390_format_RXY_RRRD(s390_irgen_DLG, ovl.fmt.RXY.r1,
15541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000088ULL: s390_format_RXY_RRRD(s390_irgen_ALCG, ovl.fmt.RXY.r1,
15545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000089ULL: s390_format_RXY_RRRD(s390_irgen_SLBG, ovl.fmt.RXY.r1,
15549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000008eULL: s390_format_RXY_RRRD(s390_irgen_STPQ, ovl.fmt.RXY.r1,
15553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000008fULL: s390_format_RXY_RRRD(s390_irgen_LPQ, ovl.fmt.RXY.r1,
15557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000090ULL: s390_format_RXY_RRRD(s390_irgen_LLGC, ovl.fmt.RXY.r1,
15561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000091ULL: s390_format_RXY_RRRD(s390_irgen_LLGH, ovl.fmt.RXY.r1,
15565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000094ULL: s390_format_RXY_RRRD(s390_irgen_LLC, ovl.fmt.RXY.r1,
15569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000095ULL: s390_format_RXY_RRRD(s390_irgen_LLH, ovl.fmt.RXY.r1,
15573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000096ULL: s390_format_RXY_RRRD(s390_irgen_ML, ovl.fmt.RXY.r1,
15577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000097ULL: s390_format_RXY_RRRD(s390_irgen_DL, ovl.fmt.RXY.r1,
15581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000098ULL: s390_format_RXY_RRRD(s390_irgen_ALC, ovl.fmt.RXY.r1,
15585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000099ULL: s390_format_RXY_RRRD(s390_irgen_SLB, ovl.fmt.RXY.r1,
15589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xe3000000009cULL: /* LLGTAT */ goto unimplemented;
15593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xe3000000009dULL: /* LLGFAT */ goto unimplemented;
15594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xe3000000009fULL: /* LAT */ goto unimplemented;
15595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000c0ULL: s390_format_RXY_RRRD(s390_irgen_LBH, ovl.fmt.RXY.r1,
15596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000c2ULL: s390_format_RXY_RRRD(s390_irgen_LLCH, ovl.fmt.RXY.r1,
15600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000c3ULL: s390_format_RXY_RRRD(s390_irgen_STCH, ovl.fmt.RXY.r1,
15604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000c4ULL: s390_format_RXY_RRRD(s390_irgen_LHH, ovl.fmt.RXY.r1,
15608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000c6ULL: s390_format_RXY_RRRD(s390_irgen_LLHH, ovl.fmt.RXY.r1,
15612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000c7ULL: s390_format_RXY_RRRD(s390_irgen_STHH, ovl.fmt.RXY.r1,
15616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xe300000000c8ULL: /* LFHAT */ goto unimplemented;
15620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000caULL: s390_format_RXY_RRRD(s390_irgen_LFH, ovl.fmt.RXY.r1,
15621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000cbULL: s390_format_RXY_RRRD(s390_irgen_STFH, ovl.fmt.RXY.r1,
15625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000cdULL: s390_format_RXY_RRRD(s390_irgen_CHF, ovl.fmt.RXY.r1,
15629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000cfULL: s390_format_RXY_RRRD(s390_irgen_CLHF, ovl.fmt.RXY.r1,
15633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
15634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
15635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
15636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000004ULL: s390_format_RSY_RRRD(s390_irgen_LMG, ovl.fmt.RSY.r1,
15637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000000aULL: s390_format_RSY_RRRD(s390_irgen_SRAG, ovl.fmt.RSY.r1,
15641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000000bULL: s390_format_RSY_RRRD(s390_irgen_SLAG, ovl.fmt.RSY.r1,
15645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000000cULL: s390_format_RSY_RRRD(s390_irgen_SRLG, ovl.fmt.RSY.r1,
15649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000000dULL: s390_format_RSY_RRRD(s390_irgen_SLLG, ovl.fmt.RSY.r1,
15653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000000fULL: /* TRACG */ goto unimplemented;
15657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000014ULL: s390_format_RSY_RRRD(s390_irgen_CSY, ovl.fmt.RSY.r1,
15658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000001cULL: s390_format_RSY_RRRD(s390_irgen_RLLG, ovl.fmt.RSY.r1,
15662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000001dULL: s390_format_RSY_RRRD(s390_irgen_RLL, ovl.fmt.RSY.r1,
15666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000020ULL: s390_format_RSY_RURD(s390_irgen_CLMH, ovl.fmt.RSY.r1,
15670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000021ULL: s390_format_RSY_RURD(s390_irgen_CLMY, ovl.fmt.RSY.r1,
15674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xeb0000000023ULL: /* CLT */ goto unimplemented;
15678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000024ULL: s390_format_RSY_RRRD(s390_irgen_STMG, ovl.fmt.RSY.r1,
15679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000025ULL: /* STCTG */ goto unimplemented;
15683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000026ULL: s390_format_RSY_RRRD(s390_irgen_STMH, ovl.fmt.RSY.r1,
15684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xeb000000002bULL: /* CLGT */ goto unimplemented;
15688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000002cULL: s390_format_RSY_RURD(s390_irgen_STCMH,
15689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
15690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
15691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000002dULL: s390_format_RSY_RURD(s390_irgen_STCMY,
15693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
15694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
15695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000002fULL: /* LCTLG */ goto unimplemented;
15697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000030ULL: s390_format_RSY_RRRD(s390_irgen_CSG, ovl.fmt.RSY.r1,
15698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xeb0000000031ULL: s390_format_RSY_RRRD(s390_irgen_CDSY, ovl.fmt.RSY.r1,
15702663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                                ovl.fmt.RSY.dl2,
15704663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                                ovl.fmt.RSY.dh2);  goto ok;
15705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xeb000000003eULL: s390_format_RSY_RRRD(s390_irgen_CDSG, ovl.fmt.RSY.r1,
15706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                                ovl.fmt.RSY.dl2,
15708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                                ovl.fmt.RSY.dh2);  goto ok;
15709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000044ULL: s390_format_RSY_RRRD(s390_irgen_BXHG, ovl.fmt.RSY.r1,
15710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000045ULL: s390_format_RSY_RRRD(s390_irgen_BXLEG,
15714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
15715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
15716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xeb000000004cULL: s390_format_RSY_RRRD(s390_irgen_ECAG, ovl.fmt.RSY.r1,
15718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                ovl.fmt.RSY.dl2,
15720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                ovl.fmt.RSY.dh2);  goto ok;
15721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000051ULL: s390_format_SIY_URD(s390_irgen_TMY, ovl.fmt.SIY.i2,
15722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
15723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
15724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000052ULL: s390_format_SIY_URD(s390_irgen_MVIY, ovl.fmt.SIY.i2,
15725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
15726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
15727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000054ULL: s390_format_SIY_URD(s390_irgen_NIY, ovl.fmt.SIY.i2,
15728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
15729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
15730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000055ULL: s390_format_SIY_URD(s390_irgen_CLIY, ovl.fmt.SIY.i2,
15731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
15732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
15733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000056ULL: s390_format_SIY_URD(s390_irgen_OIY, ovl.fmt.SIY.i2,
15734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
15735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
15736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000057ULL: s390_format_SIY_URD(s390_irgen_XIY, ovl.fmt.SIY.i2,
15737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
15738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
15739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000006aULL: s390_format_SIY_IRD(s390_irgen_ASI, ovl.fmt.SIY.i2,
15740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
15741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
15742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000006eULL: s390_format_SIY_IRD(s390_irgen_ALSI, ovl.fmt.SIY.i2,
15743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
15744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
15745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000007aULL: s390_format_SIY_IRD(s390_irgen_AGSI, ovl.fmt.SIY.i2,
15746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
15747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
15748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000007eULL: s390_format_SIY_IRD(s390_irgen_ALGSI, ovl.fmt.SIY.i2,
15749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
15750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
15751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000080ULL: s390_format_RSY_RURD(s390_irgen_ICMH, ovl.fmt.RSY.r1,
15752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000081ULL: s390_format_RSY_RURD(s390_irgen_ICMY, ovl.fmt.RSY.r1,
15756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000008eULL: /* MVCLU */ goto unimplemented;
15760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000008fULL: /* CLCLU */ goto unimplemented;
15761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000090ULL: s390_format_RSY_RRRD(s390_irgen_STMY, ovl.fmt.RSY.r1,
15762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000096ULL: s390_format_RSY_RRRD(s390_irgen_LMH, ovl.fmt.RSY.r1,
15766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000098ULL: s390_format_RSY_RRRD(s390_irgen_LMY, ovl.fmt.RSY.r1,
15770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000009aULL: s390_format_RSY_AARD(s390_irgen_LAMY, ovl.fmt.RSY.r1,
15774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000009bULL: s390_format_RSY_AARD(s390_irgen_STAMY,
15778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
15779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
15780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000c0ULL: /* TP */ goto unimplemented;
15782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000dcULL: s390_format_RSY_RRRD(s390_irgen_SRAK, ovl.fmt.RSY.r1,
15783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000ddULL: s390_format_RSY_RRRD(s390_irgen_SLAK, ovl.fmt.RSY.r1,
15787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000deULL: s390_format_RSY_RRRD(s390_irgen_SRLK, ovl.fmt.RSY.r1,
15791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000dfULL: s390_format_RSY_RRRD(s390_irgen_SLLK, ovl.fmt.RSY.r1,
15795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000e2ULL: s390_format_RSY_RDRM(s390_irgen_LOCG, ovl.fmt.RSY.r1,
15799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2,
15802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                S390_XMNM_LOCG);  goto ok;
15803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000e3ULL: s390_format_RSY_RDRM(s390_irgen_STOCG,
15804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
15805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
15806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2,
15807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                S390_XMNM_STOCG);  goto ok;
15808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000e4ULL: s390_format_RSY_RRRD(s390_irgen_LANG, ovl.fmt.RSY.r1,
15809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000e6ULL: s390_format_RSY_RRRD(s390_irgen_LAOG, ovl.fmt.RSY.r1,
15813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000e7ULL: s390_format_RSY_RRRD(s390_irgen_LAXG, ovl.fmt.RSY.r1,
15817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000e8ULL: s390_format_RSY_RRRD(s390_irgen_LAAG, ovl.fmt.RSY.r1,
15821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000eaULL: s390_format_RSY_RRRD(s390_irgen_LAALG,
15825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
15826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
15827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000f2ULL: s390_format_RSY_RDRM(s390_irgen_LOC, ovl.fmt.RSY.r1,
15829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2, S390_XMNM_LOC);
15832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                goto ok;
15833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000f3ULL: s390_format_RSY_RDRM(s390_irgen_STOC, ovl.fmt.RSY.r1,
15834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2,
15837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                S390_XMNM_STOC);  goto ok;
15838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000f4ULL: s390_format_RSY_RRRD(s390_irgen_LAN, ovl.fmt.RSY.r1,
15839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000f6ULL: s390_format_RSY_RRRD(s390_irgen_LAO, ovl.fmt.RSY.r1,
15843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000f7ULL: s390_format_RSY_RRRD(s390_irgen_LAX, ovl.fmt.RSY.r1,
15847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000f8ULL: s390_format_RSY_RRRD(s390_irgen_LAA, ovl.fmt.RSY.r1,
15851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000faULL: s390_format_RSY_RRRD(s390_irgen_LAAL, ovl.fmt.RSY.r1,
15855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
15856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
15857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
15858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000044ULL: s390_format_RIE_RRP(s390_irgen_BRXHG, ovl.fmt.RIE.r1,
15859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.RIE.r3, ovl.fmt.RIE.i2);
15860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               goto ok;
15861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000045ULL: s390_format_RIE_RRP(s390_irgen_BRXLG, ovl.fmt.RIE.r1,
15862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.RIE.r3, ovl.fmt.RIE.i2);
15863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               goto ok;
15864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000051ULL: /* RISBLG */ goto unimplemented;
15865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000054ULL: s390_format_RIE_RRUUU(s390_irgen_RNSBG,
15866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.r1,
15867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.r2,
15868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i3,
15869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i4,
15870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i5);
15871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 goto ok;
15872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000055ULL: s390_format_RIE_RRUUU(s390_irgen_RISBG,
15873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.r1,
15874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.r2,
15875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i3,
15876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i4,
15877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i5);
15878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 goto ok;
15879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000056ULL: s390_format_RIE_RRUUU(s390_irgen_ROSBG,
15880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.r1,
15881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.r2,
15882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i3,
15883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i4,
15884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i5);
15885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 goto ok;
15886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000057ULL: s390_format_RIE_RRUUU(s390_irgen_RXSBG,
15887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.r1,
15888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.r2,
15889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i3,
15890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i4,
15891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i5);
15892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 goto ok;
15893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xec0000000059ULL: /* RISBGN */ goto unimplemented;
15894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec000000005dULL: /* RISBHG */ goto unimplemented;
15895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000064ULL: s390_format_RIE_RRPU(s390_irgen_CGRJ,
15896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.r1,
15897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.r2,
15898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.i4,
15899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.m3);  goto ok;
15900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000065ULL: s390_format_RIE_RRPU(s390_irgen_CLGRJ,
15901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.r1,
15902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.r2,
15903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.i4,
15904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.m3);  goto ok;
15905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000070ULL: /* CGIT */ goto unimplemented;
15906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000071ULL: /* CLGIT */ goto unimplemented;
15907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000072ULL: /* CIT */ goto unimplemented;
15908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000073ULL: /* CLFIT */ goto unimplemented;
15909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000076ULL: s390_format_RIE_RRPU(s390_irgen_CRJ,
15910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.r1,
15911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.r2,
15912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.i4,
15913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.m3);  goto ok;
15914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000077ULL: s390_format_RIE_RRPU(s390_irgen_CLRJ,
15915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.r1,
15916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.r2,
15917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.i4,
15918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.m3);  goto ok;
15919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec000000007cULL: s390_format_RIE_RUPI(s390_irgen_CGIJ,
15920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.r1,
15921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.m3,
15922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.i4,
15923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.i2);  goto ok;
15924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec000000007dULL: s390_format_RIE_RUPU(s390_irgen_CLGIJ,
15925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.r1,
15926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.m3,
15927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.i4,
15928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.i2);  goto ok;
15929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec000000007eULL: s390_format_RIE_RUPI(s390_irgen_CIJ,
15930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.r1,
15931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.m3,
15932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.i4,
15933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.i2);  goto ok;
15934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec000000007fULL: s390_format_RIE_RUPU(s390_irgen_CLIJ,
15935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.r1,
15936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.m3,
15937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.i4,
15938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.i2);  goto ok;
15939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000d8ULL: s390_format_RIE_RRI0(s390_irgen_AHIK, ovl.fmt.RIE.r1,
15940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE.r3, ovl.fmt.RIE.i2);
15941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                goto ok;
15942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000d9ULL: s390_format_RIE_RRI0(s390_irgen_AGHIK,
15943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE.r1, ovl.fmt.RIE.r3,
15944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE.i2);  goto ok;
15945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000daULL: s390_format_RIE_RRI0(s390_irgen_ALHSIK,
15946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE.r1, ovl.fmt.RIE.r3,
15947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE.i2);  goto ok;
15948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000dbULL: s390_format_RIE_RRI0(s390_irgen_ALGHSIK,
15949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE.r1, ovl.fmt.RIE.r3,
15950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE.i2);  goto ok;
15951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000e4ULL: s390_format_RRS(s390_irgen_CGRB, ovl.fmt.RRS.r1,
15952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           ovl.fmt.RRS.r2, ovl.fmt.RRS.b4,
15953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           ovl.fmt.RRS.d4, ovl.fmt.RRS.m3);
15954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           goto ok;
15955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000e5ULL: s390_format_RRS(s390_irgen_CLGRB, ovl.fmt.RRS.r1,
15956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           ovl.fmt.RRS.r2, ovl.fmt.RRS.b4,
15957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           ovl.fmt.RRS.d4, ovl.fmt.RRS.m3);
15958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           goto ok;
15959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000f6ULL: s390_format_RRS(s390_irgen_CRB, ovl.fmt.RRS.r1,
15960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           ovl.fmt.RRS.r2, ovl.fmt.RRS.b4,
15961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           ovl.fmt.RRS.d4, ovl.fmt.RRS.m3);
15962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           goto ok;
15963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000f7ULL: s390_format_RRS(s390_irgen_CLRB, ovl.fmt.RRS.r1,
15964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           ovl.fmt.RRS.r2, ovl.fmt.RRS.b4,
15965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           ovl.fmt.RRS.d4, ovl.fmt.RRS.m3);
15966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           goto ok;
15967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000fcULL: s390_format_RIS_RURDI(s390_irgen_CGIB,
15968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.r1, ovl.fmt.RIS.m3,
15969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.b4, ovl.fmt.RIS.d4,
15970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.i2);  goto ok;
15971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000fdULL: s390_format_RIS_RURDU(s390_irgen_CLGIB,
15972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.r1, ovl.fmt.RIS.m3,
15973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.b4, ovl.fmt.RIS.d4,
15974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.i2);  goto ok;
15975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000feULL: s390_format_RIS_RURDI(s390_irgen_CIB, ovl.fmt.RIS.r1,
15976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.m3, ovl.fmt.RIS.b4,
15977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.d4,
15978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.i2);  goto ok;
15979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000ffULL: s390_format_RIS_RURDU(s390_irgen_CLIB,
15980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.r1, ovl.fmt.RIS.m3,
15981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.b4, ovl.fmt.RIS.d4,
15982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.i2);  goto ok;
15983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000004ULL: s390_format_RXE_FRRD(s390_irgen_LDEB, ovl.fmt.RXE.r1,
15984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
15985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
15986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000005ULL: s390_format_RXE_FRRD(s390_irgen_LXDB, ovl.fmt.RXE.r1,
15987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
15988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
15989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000006ULL: s390_format_RXE_FRRD(s390_irgen_LXEB, ovl.fmt.RXE.r1,
15990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
15991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
15992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000007ULL: /* MXDB */ goto unimplemented;
15993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000008ULL: /* KEB */ goto unimplemented;
15994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000009ULL: s390_format_RXE_FRRD(s390_irgen_CEB, ovl.fmt.RXE.r1,
15995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
15996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
15997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000000aULL: s390_format_RXE_FRRD(s390_irgen_AEB, ovl.fmt.RXE.r1,
15998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
15999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
16000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000000bULL: s390_format_RXE_FRRD(s390_irgen_SEB, ovl.fmt.RXE.r1,
16001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
16003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000000cULL: /* MDEB */ goto unimplemented;
16004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000000dULL: s390_format_RXE_FRRD(s390_irgen_DEB, ovl.fmt.RXE.r1,
16005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
16007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000000eULL: s390_format_RXF_FRRDF(s390_irgen_MAEB,
16008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.r3, ovl.fmt.RXF.x2,
16009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.b2, ovl.fmt.RXF.d2,
16010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.r1);  goto ok;
16011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000000fULL: s390_format_RXF_FRRDF(s390_irgen_MSEB,
16012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.r3, ovl.fmt.RXF.x2,
16013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.b2, ovl.fmt.RXF.d2,
16014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.r1);  goto ok;
16015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000010ULL: s390_format_RXE_FRRD(s390_irgen_TCEB, ovl.fmt.RXE.r1,
16016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
16018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000011ULL: s390_format_RXE_FRRD(s390_irgen_TCDB, ovl.fmt.RXE.r1,
16019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
16021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000012ULL: s390_format_RXE_FRRD(s390_irgen_TCXB, ovl.fmt.RXE.r1,
16022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
16024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000014ULL: s390_format_RXE_FRRD(s390_irgen_SQEB, ovl.fmt.RXE.r1,
16025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
16027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000015ULL: s390_format_RXE_FRRD(s390_irgen_SQDB, ovl.fmt.RXE.r1,
16028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
16030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000017ULL: s390_format_RXE_FRRD(s390_irgen_MEEB, ovl.fmt.RXE.r1,
16031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
16033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000018ULL: /* KDB */ goto unimplemented;
16034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000019ULL: s390_format_RXE_FRRD(s390_irgen_CDB, ovl.fmt.RXE.r1,
16035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
16037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000001aULL: s390_format_RXE_FRRD(s390_irgen_ADB, ovl.fmt.RXE.r1,
16038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
16040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000001bULL: s390_format_RXE_FRRD(s390_irgen_SDB, ovl.fmt.RXE.r1,
16041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
16043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000001cULL: s390_format_RXE_FRRD(s390_irgen_MDB, ovl.fmt.RXE.r1,
16044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
16046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000001dULL: s390_format_RXE_FRRD(s390_irgen_DDB, ovl.fmt.RXE.r1,
16047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
16049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000001eULL: s390_format_RXF_FRRDF(s390_irgen_MADB,
16050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.r3, ovl.fmt.RXF.x2,
16051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.b2, ovl.fmt.RXF.d2,
16052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.r1);  goto ok;
16053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000001fULL: s390_format_RXF_FRRDF(s390_irgen_MSDB,
16054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.r3, ovl.fmt.RXF.x2,
16055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.b2, ovl.fmt.RXF.d2,
16056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.r1);  goto ok;
16057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000024ULL: /* LDE */ goto unimplemented;
16058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000025ULL: /* LXD */ goto unimplemented;
16059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000026ULL: /* LXE */ goto unimplemented;
16060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000002eULL: /* MAE */ goto unimplemented;
16061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000002fULL: /* MSE */ goto unimplemented;
16062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000034ULL: /* SQE */ goto unimplemented;
16063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000035ULL: /* SQD */ goto unimplemented;
16064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000037ULL: /* MEE */ goto unimplemented;
16065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000038ULL: /* MAYL */ goto unimplemented;
16066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000039ULL: /* MYL */ goto unimplemented;
16067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000003aULL: /* MAY */ goto unimplemented;
16068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000003bULL: /* MY */ goto unimplemented;
16069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000003cULL: /* MAYH */ goto unimplemented;
16070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000003dULL: /* MYH */ goto unimplemented;
16071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000003eULL: /* MAD */ goto unimplemented;
16072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000003fULL: /* MSD */ goto unimplemented;
16073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xed0000000040ULL: s390_format_RXF_FRRDF(s390_irgen_SLDT,
16074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 ovl.fmt.RXF.r3, ovl.fmt.RXF.x2,
16075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 ovl.fmt.RXF.b2, ovl.fmt.RXF.d2,
16076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 ovl.fmt.RXF.r1);  goto ok;
16077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xed0000000041ULL: s390_format_RXF_FRRDF(s390_irgen_SRDT,
16078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 ovl.fmt.RXF.r3, ovl.fmt.RXF.x2,
16079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 ovl.fmt.RXF.b2, ovl.fmt.RXF.d2,
16080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 ovl.fmt.RXF.r1);  goto ok;
16081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xed0000000048ULL: s390_format_RXF_FRRDF(s390_irgen_SLXT,
16082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 ovl.fmt.RXF.r3, ovl.fmt.RXF.x2,
16083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 ovl.fmt.RXF.b2, ovl.fmt.RXF.d2,
16084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 ovl.fmt.RXF.r1);  goto ok;
16085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xed0000000049ULL: s390_format_RXF_FRRDF(s390_irgen_SRXT,
16086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 ovl.fmt.RXF.r3, ovl.fmt.RXF.x2,
16087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 ovl.fmt.RXF.b2, ovl.fmt.RXF.d2,
16088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 ovl.fmt.RXF.r1);  goto ok;
16089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xed0000000050ULL: s390_format_RXE_FRRD(s390_irgen_TDCET, ovl.fmt.RXE.r1,
16090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                ovl.fmt.RXE.d2);  goto ok;
16092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xed0000000051ULL: s390_format_RXE_FRRD(s390_irgen_TDGET, ovl.fmt.RXE.r1,
16093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                ovl.fmt.RXE.d2);  goto ok;
16095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xed0000000054ULL: s390_format_RXE_FRRD(s390_irgen_TDCDT, ovl.fmt.RXE.r1,
16096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                ovl.fmt.RXE.d2);  goto ok;
16098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xed0000000055ULL: s390_format_RXE_FRRD(s390_irgen_TDGDT, ovl.fmt.RXE.r1,
16099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                ovl.fmt.RXE.d2);  goto ok;
16101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xed0000000058ULL: s390_format_RXE_FRRD(s390_irgen_TDCXT, ovl.fmt.RXE.r1,
16102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                ovl.fmt.RXE.d2);  goto ok;
16104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xed0000000059ULL: s390_format_RXE_FRRD(s390_irgen_TDGXT, ovl.fmt.RXE.r1,
16105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
16106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                ovl.fmt.RXE.d2);  goto ok;
16107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000064ULL: s390_format_RXY_FRRD(s390_irgen_LEY, ovl.fmt.RXY.r1,
16108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
16109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
16110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
16111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000065ULL: s390_format_RXY_FRRD(s390_irgen_LDY, ovl.fmt.RXY.r1,
16112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
16113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
16114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
16115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000066ULL: s390_format_RXY_FRRD(s390_irgen_STEY, ovl.fmt.RXY.r1,
16116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
16117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
16118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
16119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000067ULL: s390_format_RXY_FRRD(s390_irgen_STDY, ovl.fmt.RXY.r1,
16120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
16121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
16122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
16123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xed00000000a8ULL: /* CZDT */ goto unimplemented;
16124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xed00000000a9ULL: /* CZXT */ goto unimplemented;
16125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xed00000000aaULL: /* CDZT */ goto unimplemented;
16126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xed00000000abULL: /* CXZT */ goto unimplemented;
16127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
16128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (((ovl.value >> 16) & 0xff0f00000000ULL) >> 32) {
16130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc000ULL: s390_format_RIL_RP(s390_irgen_LARL, ovl.fmt.RIL.r1,
16131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc001ULL: s390_format_RIL_RI(s390_irgen_LGFI, ovl.fmt.RIL.r1,
16133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc004ULL: s390_format_RIL(s390_irgen_BRCL, ovl.fmt.RIL.r1,
16135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RIL.i2);  goto ok;
16136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc005ULL: s390_format_RIL_RP(s390_irgen_BRASL, ovl.fmt.RIL.r1,
16137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc006ULL: s390_format_RIL_RU(s390_irgen_XIHF, ovl.fmt.RIL.r1,
16139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc007ULL: s390_format_RIL_RU(s390_irgen_XILF, ovl.fmt.RIL.r1,
16141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc008ULL: s390_format_RIL_RU(s390_irgen_IIHF, ovl.fmt.RIL.r1,
16143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc009ULL: s390_format_RIL_RU(s390_irgen_IILF, ovl.fmt.RIL.r1,
16145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc00aULL: s390_format_RIL_RU(s390_irgen_NIHF, ovl.fmt.RIL.r1,
16147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc00bULL: s390_format_RIL_RU(s390_irgen_NILF, ovl.fmt.RIL.r1,
16149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc00cULL: s390_format_RIL_RU(s390_irgen_OIHF, ovl.fmt.RIL.r1,
16151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc00dULL: s390_format_RIL_RU(s390_irgen_OILF, ovl.fmt.RIL.r1,
16153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc00eULL: s390_format_RIL_RU(s390_irgen_LLIHF, ovl.fmt.RIL.r1,
16155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc00fULL: s390_format_RIL_RU(s390_irgen_LLILF, ovl.fmt.RIL.r1,
16157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc200ULL: s390_format_RIL_RI(s390_irgen_MSGFI, ovl.fmt.RIL.r1,
16159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc201ULL: s390_format_RIL_RI(s390_irgen_MSFI, ovl.fmt.RIL.r1,
16161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc204ULL: s390_format_RIL_RU(s390_irgen_SLGFI, ovl.fmt.RIL.r1,
16163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc205ULL: s390_format_RIL_RU(s390_irgen_SLFI, ovl.fmt.RIL.r1,
16165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc208ULL: s390_format_RIL_RI(s390_irgen_AGFI, ovl.fmt.RIL.r1,
16167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc209ULL: s390_format_RIL_RI(s390_irgen_AFI, ovl.fmt.RIL.r1,
16169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc20aULL: s390_format_RIL_RU(s390_irgen_ALGFI, ovl.fmt.RIL.r1,
16171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc20bULL: s390_format_RIL_RU(s390_irgen_ALFI, ovl.fmt.RIL.r1,
16173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc20cULL: s390_format_RIL_RI(s390_irgen_CGFI, ovl.fmt.RIL.r1,
16175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc20dULL: s390_format_RIL_RI(s390_irgen_CFI, ovl.fmt.RIL.r1,
16177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc20eULL: s390_format_RIL_RU(s390_irgen_CLGFI, ovl.fmt.RIL.r1,
16179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc20fULL: s390_format_RIL_RU(s390_irgen_CLFI, ovl.fmt.RIL.r1,
16181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc402ULL: s390_format_RIL_RP(s390_irgen_LLHRL, ovl.fmt.RIL.r1,
16183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc404ULL: s390_format_RIL_RP(s390_irgen_LGHRL, ovl.fmt.RIL.r1,
16185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc405ULL: s390_format_RIL_RP(s390_irgen_LHRL, ovl.fmt.RIL.r1,
16187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc406ULL: s390_format_RIL_RP(s390_irgen_LLGHRL, ovl.fmt.RIL.r1,
16189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc407ULL: s390_format_RIL_RP(s390_irgen_STHRL, ovl.fmt.RIL.r1,
16191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc408ULL: s390_format_RIL_RP(s390_irgen_LGRL, ovl.fmt.RIL.r1,
16193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc40bULL: s390_format_RIL_RP(s390_irgen_STGRL, ovl.fmt.RIL.r1,
16195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc40cULL: s390_format_RIL_RP(s390_irgen_LGFRL, ovl.fmt.RIL.r1,
16197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc40dULL: s390_format_RIL_RP(s390_irgen_LRL, ovl.fmt.RIL.r1,
16199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc40eULL: s390_format_RIL_RP(s390_irgen_LLGFRL, ovl.fmt.RIL.r1,
16201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc40fULL: s390_format_RIL_RP(s390_irgen_STRL, ovl.fmt.RIL.r1,
16203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc600ULL: s390_format_RIL_RP(s390_irgen_EXRL, ovl.fmt.RIL.r1,
16205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc602ULL: s390_format_RIL_UP(s390_irgen_PFDRL, ovl.fmt.RIL.r1,
16207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc604ULL: s390_format_RIL_RP(s390_irgen_CGHRL, ovl.fmt.RIL.r1,
16209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc605ULL: s390_format_RIL_RP(s390_irgen_CHRL, ovl.fmt.RIL.r1,
16211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc606ULL: s390_format_RIL_RP(s390_irgen_CLGHRL, ovl.fmt.RIL.r1,
16213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc607ULL: s390_format_RIL_RP(s390_irgen_CLHRL, ovl.fmt.RIL.r1,
16215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc608ULL: s390_format_RIL_RP(s390_irgen_CGRL, ovl.fmt.RIL.r1,
16217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc60aULL: s390_format_RIL_RP(s390_irgen_CLGRL, ovl.fmt.RIL.r1,
16219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc60cULL: s390_format_RIL_RP(s390_irgen_CGFRL, ovl.fmt.RIL.r1,
16221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc60dULL: s390_format_RIL_RP(s390_irgen_CRL, ovl.fmt.RIL.r1,
16223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc60eULL: s390_format_RIL_RP(s390_irgen_CLGFRL, ovl.fmt.RIL.r1,
16225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc60fULL: s390_format_RIL_RP(s390_irgen_CLRL, ovl.fmt.RIL.r1,
16227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc800ULL: /* MVCOS */ goto unimplemented;
16229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc801ULL: /* ECTG */ goto unimplemented;
16230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc802ULL: /* CSST */ goto unimplemented;
16231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc804ULL: /* LPD */ goto unimplemented;
16232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc805ULL: /* LPDG */ goto unimplemented;
16233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xcc06ULL: /* BRCTH */ goto unimplemented;
16234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xcc08ULL: s390_format_RIL_RI(s390_irgen_AIH, ovl.fmt.RIL.r1,
16235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xcc0aULL: s390_format_RIL_RI(s390_irgen_ALSIH, ovl.fmt.RIL.r1,
16237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xcc0bULL: s390_format_RIL_RI(s390_irgen_ALSIHN, ovl.fmt.RIL.r1,
16239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xcc0dULL: s390_format_RIL_RI(s390_irgen_CIH, ovl.fmt.RIL.r1,
16241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xcc0fULL: s390_format_RIL_RU(s390_irgen_CLIH, ovl.fmt.RIL.r1,
16243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
16244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
16245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (((ovl.value >> 16) & 0xff0000000000ULL) >> 40) {
16247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xc5ULL: /* BPRP */ goto unimplemented;
16248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xc7ULL: /* BPP */ goto unimplemented;
16249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd0ULL: /* TRTR */ goto unimplemented;
16250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd1ULL: /* MVN */ goto unimplemented;
16251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd2ULL: s390_format_SS_L0RDRD(s390_irgen_MVC, ovl.fmt.SS.l,
16252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SS.b1, ovl.fmt.SS.d1,
16253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SS.b2, ovl.fmt.SS.d2);  goto ok;
16254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd3ULL: /* MVZ */ goto unimplemented;
16255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd4ULL: s390_format_SS_L0RDRD(s390_irgen_NC, ovl.fmt.SS.l,
16256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SS.b1, ovl.fmt.SS.d1,
16257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SS.b2, ovl.fmt.SS.d2);  goto ok;
16258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd5ULL: s390_format_SS_L0RDRD(s390_irgen_CLC, ovl.fmt.SS.l,
16259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SS.b1, ovl.fmt.SS.d1,
16260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SS.b2, ovl.fmt.SS.d2);  goto ok;
16261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd6ULL: s390_format_SS_L0RDRD(s390_irgen_OC, ovl.fmt.SS.l,
16262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SS.b1, ovl.fmt.SS.d1,
16263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SS.b2, ovl.fmt.SS.d2);  goto ok;
16264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd7ULL:
16265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (ovl.fmt.SS.b1 == ovl.fmt.SS.b2 && ovl.fmt.SS.d1 == ovl.fmt.SS.d2)
16266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_irgen_XC_sameloc(ovl.fmt.SS.l, ovl.fmt.SS.b1, ovl.fmt.SS.d1);
16267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      else
16268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        s390_format_SS_L0RDRD(s390_irgen_XC, ovl.fmt.SS.l,
16269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                              ovl.fmt.SS.b1, ovl.fmt.SS.d1,
16270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                              ovl.fmt.SS.b2, ovl.fmt.SS.d2);
16271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      goto ok;
16272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd9ULL: /* MVCK */ goto unimplemented;
16273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xdaULL: /* MVCP */ goto unimplemented;
16274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xdbULL: /* MVCS */ goto unimplemented;
16275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xdcULL: s390_format_SS_L0RDRD(s390_irgen_TR, ovl.fmt.SS.l,
16276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       ovl.fmt.SS.b1, ovl.fmt.SS.d1,
16277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       ovl.fmt.SS.b2, ovl.fmt.SS.d2);  goto ok;
16278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xddULL: /* TRT */ goto unimplemented;
16279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xdeULL: /* ED */ goto unimplemented;
16280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xdfULL: /* EDMK */ goto unimplemented;
16281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe1ULL: /* PKU */ goto unimplemented;
16282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe2ULL: /* UNPKU */ goto unimplemented;
16283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe8ULL: /* MVCIN */ goto unimplemented;
16284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe9ULL: /* PKA */ goto unimplemented;
16285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeaULL: /* UNPKA */ goto unimplemented;
16286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeeULL: /* PLO */ goto unimplemented;
16287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xefULL: /* LMD */ goto unimplemented;
16288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xf0ULL: /* SRP */ goto unimplemented;
16289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xf1ULL: /* MVO */ goto unimplemented;
16290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xf2ULL: /* PACK */ goto unimplemented;
16291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xf3ULL: /* UNPK */ goto unimplemented;
16292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xf8ULL: /* ZAP */ goto unimplemented;
16293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xf9ULL: /* CP */ goto unimplemented;
16294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xfaULL: /* AP */ goto unimplemented;
16295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xfbULL: /* SP */ goto unimplemented;
16296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xfcULL: /* MP */ goto unimplemented;
16297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xfdULL: /* DP */ goto unimplemented;
16298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
16299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (((ovl.value >> 16) & 0xffff00000000ULL) >> 32) {
16301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe500ULL: /* LASP */ goto unimplemented;
16302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe501ULL: /* TPROT */ goto unimplemented;
16303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe502ULL: /* STRAG */ goto unimplemented;
16304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe50eULL: /* MVCSK */ goto unimplemented;
16305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe50fULL: /* MVCDK */ goto unimplemented;
16306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe544ULL: s390_format_SIL_RDI(s390_irgen_MVHHI, ovl.fmt.SIL.b1,
16307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
16308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
16309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe548ULL: s390_format_SIL_RDI(s390_irgen_MVGHI, ovl.fmt.SIL.b1,
16310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
16311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
16312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe54cULL: s390_format_SIL_RDI(s390_irgen_MVHI, ovl.fmt.SIL.b1,
16313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
16314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
16315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe554ULL: s390_format_SIL_RDI(s390_irgen_CHHSI, ovl.fmt.SIL.b1,
16316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
16317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
16318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe555ULL: s390_format_SIL_RDU(s390_irgen_CLHHSI, ovl.fmt.SIL.b1,
16319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
16320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
16321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe558ULL: s390_format_SIL_RDI(s390_irgen_CGHSI, ovl.fmt.SIL.b1,
16322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
16323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
16324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe559ULL: s390_format_SIL_RDU(s390_irgen_CLGHSI, ovl.fmt.SIL.b1,
16325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
16326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
16327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe55cULL: s390_format_SIL_RDI(s390_irgen_CHSI, ovl.fmt.SIL.b1,
16328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
16329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
16330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe55dULL: s390_format_SIL_RDU(s390_irgen_CLFHSI, ovl.fmt.SIL.b1,
16331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
16332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
16333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xe560ULL: /* TBEGIN */ goto unimplemented;
16334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0xe561ULL: /* TBEGINC */ goto unimplemented;
16335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
16336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_UNKNOWN_INSN;
16338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovok:
16340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_OK;
16341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunimplemented:
16343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_UNIMPLEMENTED_INSN;
16344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
16345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Handle "special" instructions. */
16347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic s390_decode_t
16348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_decode_special_and_irgen(UChar *bytes)
16349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
16350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_decode_t status = S390_DECODE_OK;
16351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Got a "Special" instruction preamble.  Which one is it? */
16353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (bytes[0] == 0x18 && bytes[1] == 0x22 /* lr %r2, %r2 */) {
16354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_irgen_client_request();
16355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else if (bytes[0] == 0x18 && bytes[1] == 0x33 /* lr %r3, %r3 */) {
16356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_irgen_guest_NRADDR();
16357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else if (bytes[0] == 0x18 && bytes[1] == 0x44 /* lr %r4, %r4 */) {
16358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_irgen_call_noredir();
16359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else if (bytes[0] == 0x18 && bytes[1] == 0x55 /* lr %r5, %r5 */) {
16360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_inject_ir(irsb, Iend_BE);
16361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Invalidate the current insn. The reason is that the IRop we're
16363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         injecting here can change. In which case the translation has to
16364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         be redone. For ease of handling, we simply invalidate all the
16365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         time. */
16366eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_CMSTART),
16367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      mkU64(guest_IA_curr_instr)));
16368eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_CMLEN),
16369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      mkU64(guest_IA_next_instr - guest_IA_curr_instr)));
16370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(guest_IA_next_instr - guest_IA_curr_instr ==
16371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              S390_SPECIAL_OP_PREAMBLE_SIZE + S390_SPECIAL_OP_SIZE);
16372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      put_IA(mkaddr_expr(guest_IA_next_instr));
16374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      dis_res->whatNext    = Dis_StopHere;
16375eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      dis_res->jk_StopHere = Ijk_InvalICache;
16376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
16377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* We don't know what it is. */
16378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return S390_DECODE_UNKNOWN_SPECIAL_INSN;
16379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
16380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dis_res->len = S390_SPECIAL_OP_PREAMBLE_SIZE + S390_SPECIAL_OP_SIZE;
16382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return status;
16384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
16385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Function returns # bytes that were decoded or 0 in case of failure */
16388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic UInt
16389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_decode_and_irgen(UChar *bytes, UInt insn_length, DisResult *dres)
16390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
16391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_decode_t status;
16392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dis_res = dres;
16394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Spot the 8-byte preamble:   18ff lr r15,r15
16396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  1811 lr r1,r1
16397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  1822 lr r2,r2
16398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  1833 lr r3,r3 */
16399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (bytes[ 0] == 0x18 && bytes[ 1] == 0xff && bytes[ 2] == 0x18 &&
16400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       bytes[ 3] == 0x11 && bytes[ 4] == 0x18 && bytes[ 5] == 0x22 &&
16401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       bytes[ 6] == 0x18 && bytes[ 7] == 0x33) {
16402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* Handle special instruction that follows that preamble. */
16404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (0) vex_printf("special function handling...\n");
16405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      insn_length = S390_SPECIAL_OP_PREAMBLE_SIZE + S390_SPECIAL_OP_SIZE;
16407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      guest_IA_next_instr = guest_IA_curr_instr + insn_length;
16408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      status =
16410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_decode_special_and_irgen(bytes + S390_SPECIAL_OP_PREAMBLE_SIZE);
16411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
16412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* Handle normal instructions. */
16413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      switch (insn_length) {
16414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 2:
16415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         status = s390_decode_2byte_and_irgen(bytes);
16416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
16417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 4:
16419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         status = s390_decode_4byte_and_irgen(bytes);
16420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
16421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 6:
16423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         status = s390_decode_6byte_and_irgen(bytes);
16424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
16425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      default:
16427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        status = S390_DECODE_ERROR;
16428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
16429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
16430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
16431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* If next instruction is execute, stop here */
16432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (dis_res->whatNext == Dis_Continue && bytes[insn_length] == 0x44) {
16433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      put_IA(mkaddr_expr(guest_IA_next_instr));
16434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      dis_res->whatNext = Dis_StopHere;
16435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dis_res->jk_StopHere = Ijk_Boring;
16436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
16437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (status == S390_DECODE_OK) return insn_length;  /* OK */
16439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Decoding failed somehow */
16441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (sigill_diag) {
16442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf("vex s390->IR: ");
16443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      switch (status) {
16444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case S390_DECODE_UNKNOWN_INSN:
16445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("unknown insn: ");
16446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
16447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case S390_DECODE_UNIMPLEMENTED_INSN:
16449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("unimplemented insn: ");
16450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
16451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case S390_DECODE_UNKNOWN_SPECIAL_INSN:
16453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("unimplemented special insn: ");
16454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
16455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
16457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case S390_DECODE_ERROR:
16458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("decoding error: ");
16459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
16460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
16461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf("%02x%02x", bytes[0], bytes[1]);
16463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (insn_length > 2) {
16464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(" %02x%02x", bytes[2], bytes[3]);
16465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
16466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (insn_length > 4) {
16467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf(" %02x%02x", bytes[4], bytes[5]);
16468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
16469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf("\n");
16470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
16471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return 0;  /* Failed */
16473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
16474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Disassemble a single instruction INSN into IR. */
16477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic DisResult
16478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovdisInstr_S390_WRK(UChar *insn)
16479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
16480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar byte;
16481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt  insn_length;
16482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   DisResult dres;
16483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* ---------------------------------------------------- */
16485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* --- Compute instruction length                    -- */
16486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* ---------------------------------------------------- */
16487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Get the first byte of the insn. */
16489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   byte = insn[0];
16490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* The leftmost two bits (0:1) encode the length of the insn in bytes.
16492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      00 -> 2 bytes, 01 -> 4 bytes, 10 -> 4 bytes, 11 -> 6 bytes. */
16493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   insn_length = ((((byte >> 6) + 1) >> 1) + 1) << 1;
16494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   guest_IA_next_instr = guest_IA_curr_instr + insn_length;
16496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* ---------------------------------------------------- */
16498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* --- Initialise the DisResult data                 -- */
16499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* ---------------------------------------------------- */
16500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dres.whatNext   = Dis_Continue;
16501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dres.len        = insn_length;
16502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dres.continueAt = 0;
16503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dres.jk_StopHere = Ijk_INVALID;
16504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* fixs390: consider chasing of conditional jumps */
16506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Normal and special instruction handling starts here. */
16508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (s390_decode_and_irgen(insn, insn_length, &dres) == 0) {
16509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* All decode failures end up here. The decoder has already issued an
16510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         error message.
16511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         Tell the dispatcher that this insn cannot be decoded, and so has
16512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         not been executed, and (is currently) the next to be executed.
16513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         The insn address in the guest state needs to be set to
16514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         guest_IA_curr_instr, otherwise the complaint will report an
16515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         incorrect address. */
16516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      put_IA(mkaddr_expr(guest_IA_curr_instr));
16517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dres.whatNext    = Dis_StopHere;
16519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dres.jk_StopHere = Ijk_NoDecode;
16520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dres.continueAt  = 0;
16521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dres.len         = 0;
16522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else {
16523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Decode success */
16524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (dres.whatNext) {
16525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Dis_Continue:
16526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         put_IA(mkaddr_expr(guest_IA_next_instr));
16527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Dis_ResteerU:
16529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Dis_ResteerC:
16530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         put_IA(mkaddr_expr(dres.continueAt));
16531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Dis_StopHere:
16533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (dres.jk_StopHere == Ijk_EmWarn ||
16534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov             dres.jk_StopHere == Ijk_EmFail) {
16535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* We assume here, that emulation warnings are not given for
16536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               insns that transfer control. There is no good way to
16537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               do that. */
16538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            put_IA(mkaddr_expr(guest_IA_next_instr));
16539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
16540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
16542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(0);
16543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
16544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
16545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return dres;
16547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
16548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
16551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Top-level fn                                         ---*/
16552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
16553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Disassemble a single instruction into IR.  The instruction
16555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   is located in host memory at &guest_code[delta]. */
16556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDisResult
16558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovdisInstr_S390(IRSB        *irsb_IN,
16559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              Bool       (*resteerOkFn)(void *, Addr64),
16560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              Bool         resteerCisOk,
16561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              void        *callback_opaque,
16562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              UChar       *guest_code,
16563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              Long         delta,
16564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              Addr64       guest_IP,
16565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              VexArch      guest_arch,
16566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              VexArchInfo *archinfo,
16567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              VexAbiInfo  *abiinfo,
16568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              Bool         host_bigendian,
16569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              Bool         sigill_diag_IN)
16570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
16571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(guest_arch == VexArchS390X);
16572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* The instruction decoder requires a big-endian machine. */
16574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(host_bigendian == True);
16575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Set globals (see top of this file) */
16577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   guest_IA_curr_instr = guest_IP;
16578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irsb = irsb_IN;
16579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   resteer_fn = resteerOkFn;
16580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   resteer_data = callback_opaque;
16581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   sigill_diag = sigill_diag_IN;
16582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return disInstr_S390_WRK(guest_code + delta);
16584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
16585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------------------------------------------------------*/
16587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- end                                   guest_s390_toIR.c ---*/
16588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------------------------------------------------------*/
16589