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
11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Copyright IBM Corp. 2010-2012
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"
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "libvex.h"                  /* needed for bb_to_IR.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 */
43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "host_s390_disasm.h"
44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "host_s390_defs.h"          /* S390_ROUND_xyzzy */
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Forward declarations                                 ---*/
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic UInt s390_decode_and_irgen(UChar *, UInt, DisResult *);
51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void s390_irgen_xonc(IROp, IRTemp, IRTemp, IRTemp);
52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void s390_irgen_CLC_EX(IRTemp, IRTemp, IRTemp);
53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Globals                                              ---*/
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The IRSB* into which we're generating code. */
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRSB *irsb;
61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The guest address for the instruction currently being
63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   translated. */
64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic Addr64 guest_IA_curr_instr;
65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The guest address for the instruction following the current instruction. */
67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic Addr64 guest_IA_next_instr;
68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Result of disassembly step. */
70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic DisResult *dis_res;
71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Resteer function and callback data */
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic Bool (*resteer_fn)(void *, Addr64);
74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void *resteer_data;
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The last seen execute target instruction */
77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovULong last_execute_target;
78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The possible outcomes of a decoding operation */
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef enum {
81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_DECODE_OK,
82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_DECODE_UNKNOWN_INSN,
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_DECODE_UNIMPLEMENTED_INSN,
84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_DECODE_UNKNOWN_SPECIAL_INSN,
85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   S390_DECODE_ERROR
86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} s390_decode_t;
87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
88663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Helpers for constructing IR.                         ---*/
91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Sign extend a value with the given number of bits. This is a
94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   macro because it allows us to overload the type of the value.
95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Note that VALUE must have a signed type! */
96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#undef sign_extend
97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define sign_extend(value,num_bits) \
98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov(((value) << (sizeof(__typeof__(value)) * 8 - (num_bits))) >> \
99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (sizeof(__typeof__(value)) * 8 - (num_bits)))
100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Add a statement to the current irsb. */
103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstmt(IRStmt *st)
105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   addStmtToIRSB(irsb, st);
107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Allocate a new temporary of the given type. */
110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRTemp
111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovnewTemp(IRType type)
112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(isPlausibleIRType(type));
114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return newIRTemp(irsb->tyenv, type);
116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression node for a temporary */
119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmkexpr(IRTemp tmp)
121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_RdTmp(tmp);
123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Generate an expression node for an address. */
126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic __inline__ IRExpr *
127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengmkaddr_expr(Addr64 addr)
128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return IRExpr_Const(IRConst_U64(addr));
130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Add a statement that assigns to a temporary */
133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovassign(IRTemp dst, IRExpr *expr)
135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_WrTmp(dst, expr));
137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Write an address into the guest_IA */
140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic __inline__ void
141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengput_IA(IRExpr *address)
142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_IA), address));
144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create a temporary of the given type and assign the expression to it */
147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRTemp
148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmktemp(IRType type, IRExpr *expr)
149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp temp = newTemp(type);
151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(temp, expr);
153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return temp;
155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create a unary expression */
158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunop(IROp kind, IRExpr *op)
160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Unop(kind, op);
162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create a binary expression */
165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovbinop(IROp kind, IRExpr *op1, IRExpr *op2)
167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Binop(kind, op1, op2);
169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create a ternary expression */
172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtriop(IROp kind, IRExpr *op1, IRExpr *op2, IRExpr *op3)
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Triop(kind, op1, op2, op3);
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create a quaternary expression */
179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__  IRExpr *
180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovqop(IROp kind, IRExpr *op1, IRExpr *op2, IRExpr *op3, IRExpr *op4)
181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Qop(kind, op1, op2, op3, op4);
183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression node for an 8-bit integer constant */
186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovmkU8(UInt value)
188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(value < 256);
190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Const(IRConst_U8((UChar)value));
192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression node for a 16-bit integer constant */
195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovmkU16(UInt value)
197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(value < 65536);
199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Const(IRConst_U16((UShort)value));
201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression node for a 32-bit integer constant */
204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovmkU32(UInt value)
206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Const(IRConst_U32(value));
208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression node for a 64-bit integer constant */
211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovmkU64(ULong value)
213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Const(IRConst_U64(value));
215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression node for a 32-bit floating point constant
218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   whose value is given by a bit pattern. */
219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovmkF32i(UInt value)
221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Const(IRConst_F32i(value));
223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression node for a 32-bit floating point constant
226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   whose value is given by a bit pattern. */
227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovmkF64i(ULong value)
229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Const(IRConst_F64i(value));
231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Little helper function for my sanity. ITE = if-then-else */
234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRExpr *
235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmkite(IRExpr *condition, IRExpr *iftrue, IRExpr *iffalse)
236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, condition) == Ity_I1);
238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Mux0X(unop(Iop_1Uto8, condition), iffalse, iftrue);
240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Add a statement that stores DATA at ADDR. This is a big-endian machine. */
243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void __inline__
244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstore(IRExpr *addr, IRExpr *data)
245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Store(Iend_BE, addr, data));
247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression that loads a TYPE sized value from ADDR.
250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This is a big-endian machine. */
251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovload(IRType type, IRExpr *addr)
253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Load(Iend_BE, type, addr);
255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Function call */
258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcall_function(IRExpr *callee_address)
260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_IA(callee_address);
262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->whatNext    = Dis_StopHere;
264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->jk_StopHere = Ijk_Call;
265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Function call with known target. */
268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcall_function_and_chase(Addr64 callee_address)
270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (resteer_fn(resteer_data, callee_address)) {
272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      dis_res->whatNext   = Dis_ResteerU;
273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      dis_res->continueAt = callee_address;
274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      put_IA(mkaddr_expr(callee_address));
276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      dis_res->whatNext = Dis_StopHere;
278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dis_res->jk_StopHere = Ijk_Call;
279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Function return sequence */
283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovreturn_from_function(IRExpr *return_address)
285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_IA(return_address);
287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->whatNext    = Dis_StopHere;
289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->jk_StopHere = Ijk_Ret;
290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* A conditional branch whose target is not known at instrumentation time.
293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (condition) goto computed_target;
295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Needs to be represented as:
297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (! condition) goto next_instruction;
299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   goto computed_target;
300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengif_condition_goto_computed(IRExpr *condition, IRExpr *target)
303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, condition) == Ity_I1);
305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   condition = unop(Iop_Not1, condition);
307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Exit(condition, Ijk_Boring, IRConst_U64(guest_IA_next_instr),
309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    S390X_GUEST_OFFSET(guest_IA)));
310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_IA(target);
312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->whatNext    = Dis_StopHere;
314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->jk_StopHere = Ijk_Boring;
315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* A conditional branch whose target is known at instrumentation time. */
318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovif_condition_goto(IRExpr *condition, Addr64 target)
320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, condition) == Ity_I1);
322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Exit(condition, Ijk_Boring, IRConst_U64(target),
324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    S390X_GUEST_OFFSET(guest_IA)));
325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_IA(mkaddr_expr(guest_IA_next_instr));
327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->whatNext    = Dis_StopHere;
329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->jk_StopHere = Ijk_Boring;
330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* An unconditional branch. Target may or may not be known at instrumentation
333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   time. */
334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovalways_goto(IRExpr *target)
336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_IA(target);
338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->whatNext    = Dis_StopHere;
340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->jk_StopHere = Ijk_Boring;
341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* An unconditional branch to a known target. */
345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovalways_goto_and_chase(Addr64 target)
347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (resteer_fn(resteer_data, target)) {
349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Follow into the target */
350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      dis_res->whatNext   = Dis_ResteerU;
351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      dis_res->continueAt = target;
352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      put_IA(mkaddr_expr(target));
354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dis_res->whatNext    = Dis_StopHere;
356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dis_res->jk_StopHere = Ijk_Boring;
357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* A system call */
361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovsystem_call(IRExpr *sysno)
363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Store the system call number in the pseudo register. */
365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_SYSNO), sysno));
366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Store the current IA into guest_IP_AT_SYSCALL. libvex_ir.h says so. */
368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_IP_AT_SYSCALL),
369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                   mkU64(guest_IA_curr_instr)));
370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_IA(mkaddr_expr(guest_IA_next_instr));
372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* It's important that all ArchRegs carry their up-to-date value
374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      at this point.  So we declare an end-of-block here, which
375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      forces any TempRegs caching ArchRegs to be flushed. */
376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->whatNext    = Dis_StopHere;
377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->jk_StopHere = Ijk_Sys_syscall;
378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* A side exit that branches back to the current insn if CONDITION is
381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   true. Does not set DisResult. */
382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengiterate_if(IRExpr *condition)
384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(typeOfIRExpr(irsb->tyenv, condition) == Ity_I1);
386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Exit(condition, Ijk_Boring, IRConst_U64(guest_IA_curr_instr),
388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    S390X_GUEST_OFFSET(guest_IA)));
389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* A side exit that branches back to the current insn.
392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Does not set DisResult. */
393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic __inline__ void
394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengiterate(void)
395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(IRExpr_Const(IRConst_U1(True)));
397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* A side exit that branches back to the insn immediately following the
400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   current insn if CONDITION is true. Does not set DisResult. */
401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengnext_insn_if(IRExpr *condition)
403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(typeOfIRExpr(irsb->tyenv, condition) == Ity_I1);
405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Exit(condition, Ijk_Boring, IRConst_U64(guest_IA_next_instr),
407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    S390X_GUEST_OFFSET(guest_IA)));
408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Convenience function to restart the current insn */
411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengrestart_if(IRExpr *condition)
413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(typeOfIRExpr(irsb->tyenv, condition) == Ity_I1);
415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Exit(condition, Ijk_TInval, IRConst_U64(guest_IA_curr_instr),
417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    S390X_GUEST_OFFSET(guest_IA)));
418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Convenience function to yield to thread scheduler */
421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengyield_if(IRExpr *condition)
423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Exit(condition, Ijk_Yield, IRConst_U64(guest_IA_next_instr),
425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    S390X_GUEST_OFFSET(guest_IA)));
426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Encode the s390 rounding mode as it appears in the m3/m4 fields of certain
429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   instructions to VEX's IRRoundingMode. */
430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRRoundingMode
431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovencode_rounding_mode(UChar mode)
432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (mode) {
434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case S390_ROUND_NEAREST_EVEN:  return Irrm_NEAREST;
435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case S390_ROUND_ZERO:          return Irrm_ZERO;
436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case S390_ROUND_POSINF:        return Irrm_PosINF;
437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case S390_ROUND_NEGINF:        return Irrm_NegINF;
438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vpanic("encode_rounding_mode");
440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *get_fpr_dw0(UInt);
443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void    put_fpr_dw0(UInt, IRExpr *);
444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read a floating point register pair and combine their contents into a
446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   128-bit value */
447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRExpr *
448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_fpr_pair(UInt archreg)
449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *high = get_fpr_dw0(archreg);
451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *low  = get_fpr_dw0(archreg + 2);
452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return binop(Iop_F64HLtoF128, high, low);
454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write a 128-bit floating point value into a register pair. */
457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_fpr_pair(UInt archreg, IRExpr *expr)
459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *high = unop(Iop_F128HItoF64, expr);
461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *low  = unop(Iop_F128LOtoF64, expr);
462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(archreg,     high);
464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(archreg + 2, low);
465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- IR Debugging aids.                                   ---*/
470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if 0
472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic ULong
474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_do_print(HChar *text, ULong value)
475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_printf("%s %llu\n", text, value);
477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return 0;
478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_print(HChar *text, IRExpr *value)
482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRDirty *d;
484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   d = unsafeIRDirty_0_N(0 /* regparms */, "s390_do_print", &s390_do_print,
486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         mkIRExprVec_2(mkU64((ULong)text), value));
487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Dirty(d));
488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Build the flags thunk.                               ---*/
494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Completely fill the flags thunk. We're always filling all fields.
497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Apparently, that is better for redundant PUT elimination. */
498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_thunk_fill(IRExpr *op, IRExpr *dep1, IRExpr *dep2, IRExpr *ndep)
500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op_off, dep1_off, dep2_off, ndep_off;
502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   op_off   = S390X_GUEST_OFFSET(guest_CC_OP);
504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dep1_off = S390X_GUEST_OFFSET(guest_CC_DEP1);
505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dep2_off = S390X_GUEST_OFFSET(guest_CC_DEP2);
506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ndep_off = S390X_GUEST_OFFSET(guest_CC_NDEP);
507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(op_off,   op));
509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(dep1_off, dep1));
510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(dep2_off, dep2));
511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(ndep_off, ndep));
512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Create an expression for V and widen the result to 64 bit. */
516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRExpr *
517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_widen(IRTemp v, Bool sign_extend)
518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *expr;
520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   expr = mkexpr(v);
522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (typeOfIRTemp(irsb->tyenv, v)) {
524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case Ity_I64:
525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case Ity_I32:
527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      expr = unop(sign_extend ? Iop_32Sto64 : Iop_32Uto64, expr);
528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case Ity_I16:
530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      expr = unop(sign_extend ? Iop_16Sto64 : Iop_16Uto64, expr);
531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case Ity_I8:
533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      expr = unop(sign_extend ? Iop_8Sto64 : Iop_8Uto64, expr);
534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   default:
536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      vpanic("s390_cc_widen");
537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return expr;
540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_thunk_put1(UInt opc, IRTemp d1, Bool sign_extend)
544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op, *dep1, *dep2, *ndep;
546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op   = mkU64(opc);
548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep1 = s390_cc_widen(d1, sign_extend);
549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep2 = mkU64(0);
550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ndep = mkU64(0);
551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(op, dep1, dep2, ndep);
553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_thunk_put2(UInt opc, IRTemp d1, IRTemp d2, Bool sign_extend)
558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op, *dep1, *dep2, *ndep;
560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op   = mkU64(opc);
562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep1 = s390_cc_widen(d1, sign_extend);
563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep2 = s390_cc_widen(d2, sign_extend);
564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ndep = mkU64(0);
565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(op, dep1, dep2, ndep);
567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* memcheck believes that the NDEP field in the flags thunk is always
571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   defined. But for some flag computations (e.g. add with carry) that is
572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   just not true. We therefore need to convey to memcheck that the value
573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   of the ndep field does matter and therefore we make the DEP2 field
574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   depend on it:
575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   DEP2 = original_DEP2 ^ NDEP
577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   In s390_calculate_cc we exploit that  (a^b)^b == a
579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   I.e. we xor the DEP2 value with the NDEP value to recover the
580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   original_DEP2 value. */
581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_thunk_put3(UInt opc, IRTemp d1, IRTemp d2, IRTemp nd, Bool sign_extend)
583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op, *dep1, *dep2, *ndep, *dep2x;
585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op   = mkU64(opc);
587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep1 = s390_cc_widen(d1, sign_extend);
588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep2 = s390_cc_widen(d2, sign_extend);
589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ndep = s390_cc_widen(nd, sign_extend);
590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep2x = binop(Iop_Xor64, dep2, ndep);
592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(op, dep1, dep2x, ndep);
594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write one floating point value into the flags thunk */
598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_thunk_put1f(UInt opc, IRTemp d1)
600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op, *dep1, *dep2, *ndep;
602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op   = mkU64(opc);
604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep1 = mkexpr(d1);
605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep2 = mkU64(0);
606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ndep = mkU64(0);
607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(op, dep1, dep2, ndep);
609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write a floating point value and an integer into the flags thunk. The
613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   integer value is zero-extended first. */
614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_thunk_putFZ(UInt opc, IRTemp d1, IRTemp d2)
616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op, *dep1, *dep2, *ndep;
618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op   = mkU64(opc);
620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep1 = mkexpr(d1);
621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dep2 = s390_cc_widen(d2, False);
622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ndep = mkU64(0);
623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(op, dep1, dep2, ndep);
625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write a 128-bit floating point value into the flags thunk. This is
629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   done by splitting the value into two 64-bits values. */
630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_thunk_put1f128(UInt opc, IRTemp d1)
632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op, *hi, *lo, *ndep;
634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op   = mkU64(opc);
636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   hi   = unop(Iop_F128HItoF64, mkexpr(d1));
637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   lo   = unop(Iop_F128LOtoF64, mkexpr(d1));
638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ndep = mkU64(0);
639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(op, hi, lo, ndep);
641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write a 128-bit floating point value and an integer into the flags thunk.
645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   The integer value is zero-extended first. */
646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_thunk_put1f128Z(UInt opc, IRTemp d1, IRTemp nd)
648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op, *hi, *lo, *lox, *ndep;
650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op   = mkU64(opc);
652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   hi   = unop(Iop_F128HItoF64, mkexpr(d1));
653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   lo   = unop(Iop_ReinterpF64asI64, unop(Iop_F128LOtoF64, mkexpr(d1)));
654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ndep = s390_cc_widen(nd, False);
655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   lox = binop(Iop_Xor64, lo, ndep);  /* convey dependency */
657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(op, hi, lox, ndep);
659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_cc_set(UInt val)
664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(mkU64(S390_CC_OP_SET),
666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      mkU64(val), mkU64(0), mkU64(0));
667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Build IR to calculate the condition code from flags thunk.
670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Returns an expression of type Ity_I32 */
671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRExpr *
672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_call_calculate_cc(void)
673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr **args, *call, *op, *dep1, *dep2, *ndep;
675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   op   = IRExpr_Get(S390X_GUEST_OFFSET(guest_CC_OP),   Ity_I64);
677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dep1 = IRExpr_Get(S390X_GUEST_OFFSET(guest_CC_DEP1), Ity_I64);
678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dep2 = IRExpr_Get(S390X_GUEST_OFFSET(guest_CC_DEP2), Ity_I64);
679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ndep = IRExpr_Get(S390X_GUEST_OFFSET(guest_CC_NDEP), Ity_I64);
680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   args = mkIRExprVec_4(op, dep1, dep2, ndep);
682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call = mkIRExprCCall(Ity_I32, 0 /*regparm*/,
683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        "s390_calculate_cc", &s390_calculate_cc, args);
684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Exclude OP and NDEP from definedness checking.  We're only
686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      interested in DEP1 and DEP2. */
687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call->Iex.CCall.cee->mcx_mask = (1<<0) | (1<<3);
688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return call;
690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Build IR to calculate the internal condition code for a "compare and branch"
693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   insn. Returns an expression of type Ity_I32 */
694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRExpr *
695663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_calculate_icc(UInt m, UInt opc, IRTemp op1, IRTemp op2)
696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call, *op, *dep1, *dep2, *mask;
698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   switch (opc) {
700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case S390_CC_OP_SIGNED_COMPARE:
701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dep1 = s390_cc_widen(op1, True);
702663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dep2 = s390_cc_widen(op2, True);
703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
704663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case S390_CC_OP_UNSIGNED_COMPARE:
706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dep1 = s390_cc_widen(op1, False);
707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dep2 = s390_cc_widen(op2, False);
708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   default:
711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vpanic("s390_call_calculate_icc");
712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mask = mkU64(m);
715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op   = mkU64(opc);
716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   args = mkIRExprVec_5(mask, op, dep1, dep2, mkU64(0) /* unused */);
718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call = mkIRExprCCall(Ity_I32, 0 /*regparm*/,
719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        "s390_calculate_cond", &s390_calculate_cond, args);
720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Exclude the requested condition, OP and NDEP from definedness
722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      checking.  We're only interested in DEP1 and DEP2. */
723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call->Iex.CCall.cee->mcx_mask = (1<<0) | (1<<1) | (1<<4);
724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return call;
726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Build IR to calculate the condition code from flags thunk.
729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Returns an expression of type Ity_I32 */
730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRExpr *
731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_call_calculate_cond(UInt m)
732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr **args, *call, *op, *dep1, *dep2, *ndep, *mask;
734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = mkU64(m);
736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   op   = IRExpr_Get(S390X_GUEST_OFFSET(guest_CC_OP),   Ity_I64);
737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dep1 = IRExpr_Get(S390X_GUEST_OFFSET(guest_CC_DEP1), Ity_I64);
738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dep2 = IRExpr_Get(S390X_GUEST_OFFSET(guest_CC_DEP2), Ity_I64);
739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ndep = IRExpr_Get(S390X_GUEST_OFFSET(guest_CC_NDEP), Ity_I64);
740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   args = mkIRExprVec_5(mask, op, dep1, dep2, ndep);
742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call = mkIRExprCCall(Ity_I32, 0 /*regparm*/,
743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        "s390_calculate_cond", &s390_calculate_cond, args);
744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Exclude the requested condition, OP and NDEP from definedness
746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      checking.  We're only interested in DEP1 and DEP2. */
747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call->Iex.CCall.cee->mcx_mask = (1<<0) | (1<<1) | (1<<4);
748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return call;
750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_cc_thunk_putZ(op,dep1)  s390_cc_thunk_put1(op,dep1,False)
753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_cc_thunk_putS(op,dep1)  s390_cc_thunk_put1(op,dep1,True)
754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_cc_thunk_putF(op,dep1)  s390_cc_thunk_put1f(op,dep1)
755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_cc_thunk_putZZ(op,dep1,dep2) s390_cc_thunk_put2(op,dep1,dep2,False)
756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_cc_thunk_putSS(op,dep1,dep2) s390_cc_thunk_put2(op,dep1,dep2,True)
757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_cc_thunk_putFF(op,dep1,dep2) s390_cc_thunk_put2f(op,dep1,dep2)
758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_cc_thunk_putZZZ(op,dep1,dep2,ndep) \
759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        s390_cc_thunk_put3(op,dep1,dep2,ndep,False)
760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define s390_cc_thunk_putSSS(op,dep1,dep2,ndep) \
761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        s390_cc_thunk_put3(op,dep1,dep2,ndep,True)
762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Guest register access                                ---*/
768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- ar registers                                         ---*/
773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of a ar register. */
776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic UInt
777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovar_offset(UInt archreg)
778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   static const UInt offset[16] = {
780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a0),
781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a1),
782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a2),
783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a3),
784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a4),
785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a5),
786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a6),
787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a7),
788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a8),
789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a9),
790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a10),
791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a11),
792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a12),
793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a13),
794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a14),
795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_a15),
796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   };
797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(archreg < 16);
799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return offset[archreg];
801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of word #0 of a ar register. */
805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovar_w0_offset(UInt archreg)
807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return ar_offset(archreg) + 0;
809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write word #0 of a ar to the guest state. */
812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_ar_w0(UInt archreg, IRExpr *expr)
814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(ar_w0_offset(archreg), expr));
818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read word #0 of a ar register. */
821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_ar_w0(UInt archreg)
823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(ar_w0_offset(archreg), Ity_I32);
825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- fpr registers                                        ---*/
830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of a fpr register. */
833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic UInt
834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfpr_offset(UInt archreg)
835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   static const UInt offset[16] = {
837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f0),
838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f1),
839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f2),
840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f3),
841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f4),
842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f5),
843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f6),
844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f7),
845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f8),
846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f9),
847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f10),
848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f11),
849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f12),
850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f13),
851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f14),
852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_f15),
853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   };
854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(archreg < 16);
856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return offset[archreg];
858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of word #0 of a fpr register. */
862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfpr_w0_offset(UInt archreg)
864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return fpr_offset(archreg) + 0;
866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write word #0 of a fpr to the guest state. */
869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_fpr_w0(UInt archreg, IRExpr *expr)
871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_F32);
873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(fpr_w0_offset(archreg), expr));
875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read word #0 of a fpr register. */
878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_fpr_w0(UInt archreg)
880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(fpr_w0_offset(archreg), Ity_F32);
882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of double word #0 of a fpr register. */
885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfpr_dw0_offset(UInt archreg)
887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return fpr_offset(archreg) + 0;
889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write double word #0 of a fpr to the guest state. */
892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_fpr_dw0(UInt archreg, IRExpr *expr)
894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_F64);
896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(fpr_dw0_offset(archreg), expr));
898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read double word #0 of a fpr register. */
901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_fpr_dw0(UInt archreg)
903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(fpr_dw0_offset(archreg), Ity_F64);
905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- gpr registers                                        ---*/
910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of a gpr register. */
913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic UInt
914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_offset(UInt archreg)
915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   static const UInt offset[16] = {
917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r0),
918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r1),
919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r2),
920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r3),
921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r4),
922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r5),
923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r6),
924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r7),
925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r8),
926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r9),
927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r10),
928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r11),
929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r12),
930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r13),
931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r14),
932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      S390X_GUEST_OFFSET(guest_r15),
933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   };
934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(archreg < 16);
936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return offset[archreg];
938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of word #0 of a gpr register. */
942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_w0_offset(UInt archreg)
944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 0;
946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write word #0 of a gpr to the guest state. */
949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_w0(UInt archreg, IRExpr *expr)
951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_w0_offset(archreg), expr));
955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read word #0 of a gpr register. */
958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_w0(UInt archreg)
960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_w0_offset(archreg), Ity_I32);
962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of double word #0 of a gpr register. */
965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_dw0_offset(UInt archreg)
967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 0;
969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write double word #0 of a gpr to the guest state. */
972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_dw0(UInt archreg, IRExpr *expr)
974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I64);
976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_dw0_offset(archreg), expr));
978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read double word #0 of a gpr register. */
981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_dw0(UInt archreg)
983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_dw0_offset(archreg), Ity_I64);
985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of half word #1 of a gpr register. */
988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_hw1_offset(UInt archreg)
990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 2;
992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write half word #1 of a gpr to the guest state. */
995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_hw1(UInt archreg, IRExpr *expr)
997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I16);
999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_hw1_offset(archreg), expr));
1001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read half word #1 of a gpr register. */
1004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_hw1(UInt archreg)
1006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_hw1_offset(archreg), Ity_I16);
1008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of byte #6 of a gpr register. */
1011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_b6_offset(UInt archreg)
1013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 6;
1015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write byte #6 of a gpr to the guest state. */
1018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_b6(UInt archreg, IRExpr *expr)
1020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_b6_offset(archreg), expr));
1024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read byte #6 of a gpr register. */
1027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_b6(UInt archreg)
1029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_b6_offset(archreg), Ity_I8);
1031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of byte #3 of a gpr register. */
1034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_b3_offset(UInt archreg)
1036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 3;
1038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write byte #3 of a gpr to the guest state. */
1041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_b3(UInt archreg, IRExpr *expr)
1043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_b3_offset(archreg), expr));
1047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read byte #3 of a gpr register. */
1050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_b3(UInt archreg)
1052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_b3_offset(archreg), Ity_I8);
1054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of byte #0 of a gpr register. */
1057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_b0_offset(UInt archreg)
1059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 0;
1061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write byte #0 of a gpr to the guest state. */
1064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_b0(UInt archreg, IRExpr *expr)
1066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_b0_offset(archreg), expr));
1070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read byte #0 of a gpr register. */
1073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_b0(UInt archreg)
1075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_b0_offset(archreg), Ity_I8);
1077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of word #1 of a gpr register. */
1080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_w1_offset(UInt archreg)
1082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 4;
1084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write word #1 of a gpr to the guest state. */
1087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_w1(UInt archreg, IRExpr *expr)
1089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
1091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_w1_offset(archreg), expr));
1093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read word #1 of a gpr register. */
1096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_w1(UInt archreg)
1098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_w1_offset(archreg), Ity_I32);
1100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of half word #3 of a gpr register. */
1103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_hw3_offset(UInt archreg)
1105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 6;
1107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write half word #3 of a gpr to the guest state. */
1110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_hw3(UInt archreg, IRExpr *expr)
1112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I16);
1114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_hw3_offset(archreg), expr));
1116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read half word #3 of a gpr register. */
1119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_hw3(UInt archreg)
1121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_hw3_offset(archreg), Ity_I16);
1123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of byte #7 of a gpr register. */
1126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_b7_offset(UInt archreg)
1128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 7;
1130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write byte #7 of a gpr to the guest state. */
1133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_b7(UInt archreg, IRExpr *expr)
1135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_b7_offset(archreg), expr));
1139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read byte #7 of a gpr register. */
1142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_b7(UInt archreg)
1144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_b7_offset(archreg), Ity_I8);
1146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of half word #0 of a gpr register. */
1149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_hw0_offset(UInt archreg)
1151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 0;
1153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write half word #0 of a gpr to the guest state. */
1156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_hw0(UInt archreg, IRExpr *expr)
1158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I16);
1160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_hw0_offset(archreg), expr));
1162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read half word #0 of a gpr register. */
1165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_hw0(UInt archreg)
1167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_hw0_offset(archreg), Ity_I16);
1169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of byte #4 of a gpr register. */
1172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_b4_offset(UInt archreg)
1174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 4;
1176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write byte #4 of a gpr to the guest state. */
1179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_b4(UInt archreg, IRExpr *expr)
1181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_b4_offset(archreg), expr));
1185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read byte #4 of a gpr register. */
1188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_b4(UInt archreg)
1190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_b4_offset(archreg), Ity_I8);
1192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of byte #1 of a gpr register. */
1195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_b1_offset(UInt archreg)
1197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 1;
1199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write byte #1 of a gpr to the guest state. */
1202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_b1(UInt archreg, IRExpr *expr)
1204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_b1_offset(archreg), expr));
1208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read byte #1 of a gpr register. */
1211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_b1(UInt archreg)
1213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_b1_offset(archreg), Ity_I8);
1215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of half word #2 of a gpr register. */
1218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_hw2_offset(UInt archreg)
1220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 4;
1222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write half word #2 of a gpr to the guest state. */
1225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_hw2(UInt archreg, IRExpr *expr)
1227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I16);
1229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_hw2_offset(archreg), expr));
1231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read half word #2 of a gpr register. */
1234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_hw2(UInt archreg)
1236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_hw2_offset(archreg), Ity_I16);
1238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of byte #5 of a gpr register. */
1241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_b5_offset(UInt archreg)
1243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 5;
1245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write byte #5 of a gpr to the guest state. */
1248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_b5(UInt archreg, IRExpr *expr)
1250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_b5_offset(archreg), expr));
1254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read byte #5 of a gpr register. */
1257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_b5(UInt archreg)
1259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_b5_offset(archreg), Ity_I8);
1261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of byte #2 of a gpr register. */
1264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovgpr_b2_offset(UInt archreg)
1266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return gpr_offset(archreg) + 2;
1268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write byte #2 of a gpr to the guest state. */
1271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_gpr_b2(UInt archreg, IRExpr *expr)
1273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(gpr_b2_offset(archreg), expr));
1277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read byte #2 of a gpr register. */
1280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_gpr_b2(UInt archreg)
1282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(gpr_b2_offset(archreg), Ity_I8);
1284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of the counter register. */
1287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic UInt
1288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcounter_offset(void)
1289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390X_GUEST_OFFSET(guest_counter);
1291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of double word #0 of the counter register. */
1294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcounter_dw0_offset(void)
1296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return counter_offset() + 0;
1298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write double word #0 of the counter to the guest state. */
1301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_counter_dw0(IRExpr *expr)
1303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I64);
1305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(counter_dw0_offset(), expr));
1307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read double word #0 of the counter register. */
1310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_counter_dw0(void)
1312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(counter_dw0_offset(), Ity_I64);
1314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of word #0 of the counter register. */
1317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcounter_w0_offset(void)
1319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return counter_offset() + 0;
1321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of word #1 of the counter register. */
1324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcounter_w1_offset(void)
1326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return counter_offset() + 4;
1328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write word #0 of the counter to the guest state. */
1331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_counter_w0(IRExpr *expr)
1333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
1335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(counter_w0_offset(), expr));
1337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read word #0 of the counter register. */
1340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_counter_w0(void)
1342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(counter_w0_offset(), Ity_I32);
1344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write word #1 of the counter to the guest state. */
1347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_counter_w1(IRExpr *expr)
1349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
1351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(counter_w1_offset(), expr));
1353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read word #1 of the counter register. */
1356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_counter_w1(void)
1358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(counter_w1_offset(), Ity_I32);
1360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of the fpc register. */
1363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic UInt
1364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfpc_offset(void)
1365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390X_GUEST_OFFSET(guest_fpc);
1367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Return the guest state offset of word #0 of the fpc register. */
1370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ UInt
1371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovfpc_w0_offset(void)
1372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return fpc_offset() + 0;
1374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write word #0 of the fpc to the guest state. */
1377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ void
1378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovput_fpc_w0(IRExpr *expr)
1379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
1381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Put(fpc_w0_offset(), expr));
1383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Read word #0 of the fpc register. */
1386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __inline__ IRExpr *
1387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovget_fpc_w0(void)
1388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return IRExpr_Get(fpc_w0_offset(), Ity_I32);
1390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
1394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Build IR for formats                                 ---*/
1395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
1396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_I(HChar *(*irgen)(UChar i),
1398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              UChar i)
1399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(i);
1401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC2(MNM, UINT), mnm, i);
1404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RI(HChar *(*irgen)(UChar r1, UShort i2),
1408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               UChar r1, UShort i2)
1409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irgen(r1, i2);
1411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RI_RU(HChar *(*irgen)(UChar r1, UShort i2),
1415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  UChar r1, UShort i2)
1416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, i2);
1418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, UINT), mnm, r1, i2);
1421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RI_RI(HChar *(*irgen)(UChar r1, UShort i2),
1425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  UChar r1, UShort i2)
1426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, i2);
1428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, INT), mnm, r1, (Int)(Short)i2);
1431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RI_RP(HChar *(*irgen)(UChar r1, UShort i2),
1435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  UChar r1, UShort i2)
1436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, i2);
1438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, PCREL), mnm, r1, (Int)(Short)i2);
1441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RIE_RRP(HChar *(*irgen)(UChar r1, UChar r3, UShort i2),
1445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar r1, UChar r3, UShort i2)
1446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, r3, i2);
1448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, GPR, GPR, PCREL), mnm, r1, r3, (Int)(Short)i2);
1451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RIE_RRI0(HChar *(*irgen)(UChar r1, UChar r3, UShort i2),
1455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar r3, UShort i2)
1456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, r3, i2);
1458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, GPR, GPR, INT), mnm, r1, r3, (Int)(Short)i2);
1461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RIE_RRUUU(HChar *(*irgen)(UChar r1, UChar r2, UChar i3, UChar i4,
1465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      UChar i5),
1466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      UChar r1, UChar r2, UChar i3, UChar i4, UChar i5)
1467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, r2, i3, i4, i5);
1469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC6(MNM, GPR, GPR, UINT, UINT, UINT), mnm, r1, r2, i3, i4,
1472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  i5);
1473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RIE_RRPU(HChar *(*irgen)(UChar r1, UChar r2, UShort i4, UChar m3),
1477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar r2, UShort i4, UChar m3)
1478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, r2, i4, m3);
1480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC5(XMNM, GPR, GPR, CABM, PCREL), S390_XMNM_CAB, mnm, m3, r1,
1483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  r2, m3, (Int)(Short)i4);
1484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RIE_RUPU(HChar *(*irgen)(UChar r1, UChar m3, UShort i4, UChar i2),
1488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar m3, UShort i4, UChar i2)
1489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, m3, i4, i2);
1491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC5(XMNM, GPR, UINT, CABM, PCREL), S390_XMNM_CAB, mnm, m3,
1494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  r1, i2, m3, (Int)(Short)i4);
1495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RIE_RUPI(HChar *(*irgen)(UChar r1, UChar m3, UShort i4, UChar i2),
1499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar m3, UShort i4, UChar i2)
1500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, m3, i4, i2);
1502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC5(XMNM, GPR, INT, CABM, PCREL), S390_XMNM_CAB, mnm, m3, r1,
1505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  (Int)(Char)i2, m3, (Int)(Short)i4);
1506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RIL(HChar *(*irgen)(UChar r1, UInt i2),
1510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                UChar r1, UInt i2)
1511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irgen(r1, i2);
1513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RIL_RU(HChar *(*irgen)(UChar r1, UInt i2),
1517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1, UInt i2)
1518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, i2);
1520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, UINT), mnm, r1, i2);
1523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RIL_RI(HChar *(*irgen)(UChar r1, UInt i2),
1527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1, UInt i2)
1528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, i2);
1530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, INT), mnm, r1, i2);
1533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RIL_RP(HChar *(*irgen)(UChar r1, UInt i2),
1537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1, UInt i2)
1538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, i2);
1540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, PCREL), mnm, r1, i2);
1543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RIL_UP(HChar *(*irgen)(void),
1547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1, UInt i2)
1548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen();
1550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, UINT, PCREL), mnm, r1, i2);
1553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RIS_RURDI(HChar *(*irgen)(UChar r1, UChar m3, UChar i2,
1557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      IRTemp op4addr),
1558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      UChar r1, UChar m3, UChar b4, UShort d4, UChar i2)
1559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
1561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op4addr = newTemp(Ity_I64);
1562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op4addr, binop(Iop_Add64, mkU64(d4), b4 != 0 ? get_gpr_dw0(b4) :
1564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, m3, i2, op4addr);
1567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC5(XMNM, GPR, INT, CABM, UDXB), S390_XMNM_CAB, mnm, m3, r1,
1570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  (Int)(Char)i2, m3, d4, 0, b4);
1571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RIS_RURDU(HChar *(*irgen)(UChar r1, UChar m3, UChar i2,
1575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      IRTemp op4addr),
1576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      UChar r1, UChar m3, UChar b4, UShort d4, UChar i2)
1577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
1579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op4addr = newTemp(Ity_I64);
1580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op4addr, binop(Iop_Add64, mkU64(d4), b4 != 0 ? get_gpr_dw0(b4) :
1582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, m3, i2, op4addr);
1585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC5(XMNM, GPR, UINT, CABM, UDXB), S390_XMNM_CAB, mnm, m3, r1,
1588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  i2, m3, d4, 0, b4);
1589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RR(HChar *(*irgen)(UChar r1, UChar r2),
1593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               UChar r1, UChar r2)
1594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irgen(r1, r2);
1596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RR_RR(HChar *(*irgen)(UChar r1, UChar r2),
1600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  UChar r1, UChar r2)
1601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, r2);
1603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, GPR), mnm, r1, r2);
1606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RR_FF(HChar *(*irgen)(UChar r1, UChar r2),
1610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  UChar r1, UChar r2)
1611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, r2);
1613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, FPR, FPR), mnm, r1, r2);
1616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RRE(HChar *(*irgen)(UChar r1, UChar r2),
1620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                UChar r1, UChar r2)
1621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irgen(r1, r2);
1623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RRE_RR(HChar *(*irgen)(UChar r1, UChar r2),
1627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1, UChar r2)
1628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, r2);
1630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, GPR), mnm, r1, r2);
1633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RRE_FF(HChar *(*irgen)(UChar r1, UChar r2),
1637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1, UChar r2)
1638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, r2);
1640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, FPR, FPR), mnm, r1, r2);
1643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RRE_RF(HChar *(*irgen)(UChar, UChar),
1647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1, UChar r2)
1648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, r2);
1650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, FPR), mnm, r1, r2);
1653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RRE_FR(HChar *(*irgen)(UChar r1, UChar r2),
1657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1, UChar r2)
1658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, r2);
1660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, FPR, GPR), mnm, r1, r2);
1663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RRE_R0(HChar *(*irgen)(UChar r1),
1667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1)
1668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1);
1670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC2(MNM, GPR), mnm, r1);
1673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RRE_F0(HChar *(*irgen)(UChar r1),
1677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar r1)
1678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1);
1680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC2(MNM, FPR), mnm, r1);
1683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_format_RRF_M0RERE(HChar *(*irgen)(UChar m3, UChar r1, UChar r2),
1687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       UChar m3, UChar r1, UChar r2)
1688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   HChar *mnm = irgen(m3, r1, r2);
1690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1692663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_disasm(ENC4(MNM, GPR, GPR, UINT), mnm, r1, r2, m3);
1693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1695663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
1696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RRF_F0FF(HChar *(*irgen)(UChar, UChar, UChar),
1697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar r3, UChar r2)
1698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, r3, r2);
1700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, FPR, FPR, FPR), mnm, r1, r3, r2);
1703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RRF_U0RR(HChar *(*irgen)(UChar m3, UChar r1, UChar r2),
1707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar m3, UChar r1, UChar r2, Int xmnm_kind)
1708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irgen(m3, r1, r2);
1710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(XMNM, GPR, GPR), xmnm_kind, m3, r1, r2);
1713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RRF_U0RF(HChar *(*irgen)(UChar r3, UChar r1, UChar r2),
1717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r3, UChar r1, UChar r2)
1718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r3, r1, r2);
1720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, GPR, UINT, FPR), mnm, r1, r3, r2);
1723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RRF_F0FF2(HChar *(*irgen)(UChar, UChar, UChar),
1727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      UChar r3, UChar r1, UChar r2)
1728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r3, r1, r2);
1730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, FPR, FPR, FPR), mnm, r1, r3, r2);
1733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RRF_R0RR2(HChar *(*irgen)(UChar r3, UChar r1, UChar r2),
1737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      UChar r3, UChar r1, UChar r2)
1738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r3, r1, r2);
1740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, GPR, GPR, GPR), mnm, r1, r2, r3);
1743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RRS(HChar *(*irgen)(UChar r1, UChar r2, UChar m3, IRTemp op4addr),
1747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                UChar r1, UChar r2, UChar b4, UShort d4, UChar m3)
1748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
1750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op4addr = newTemp(Ity_I64);
1751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op4addr, binop(Iop_Add64, mkU64(d4), b4 != 0 ? get_gpr_dw0(b4) :
1753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, r2, m3, op4addr);
1756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC5(XMNM, GPR, GPR, CABM, UDXB), S390_XMNM_CAB, mnm, m3, r1,
1759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  r2, m3, d4, 0, b4);
1760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RS_R0RD(HChar *(*irgen)(UChar r1, IRTemp op2addr),
1764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar r1, UChar b2, UShort d2)
1765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
1767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
1768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
1770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, op2addr);
1773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, UDXB), mnm, r1, d2, 0, b2);
1776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RS_RRRD(HChar *(*irgen)(UChar r1, UChar r3, IRTemp op2addr),
1780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar r1, UChar r3, UChar b2, UShort d2)
1781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
1783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
1784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
1786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, r3, op2addr);
1789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, GPR, GPR, UDXB), mnm, r1, r3, d2, 0, b2);
1792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RS_RURD(HChar *(*irgen)(UChar r1, UChar r3, IRTemp op2addr),
1796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar r1, UChar r3, UChar b2, UShort d2)
1797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
1799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
1800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
1802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, r3, op2addr);
1805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, GPR, UINT, UDXB), mnm, r1, r3, d2, 0, b2);
1808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RS_AARD(HChar *(*irgen)(UChar, UChar, IRTemp),
1812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar r1, UChar r3, UChar b2, UShort d2)
1813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
1815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
1816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
1818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, r3, op2addr);
1821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, AR, AR, UDXB), mnm, r1, r3, d2, 0, b2);
1824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RSI_RRP(HChar *(*irgen)(UChar r1, UChar r3, UShort i2),
1828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar r1, UChar r3, UShort i2)
1829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm = irgen(r1, r3, i2);
1831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, GPR, GPR, PCREL), mnm, r1, r3, (Int)(Short)i2);
1834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RSY_RRRD(HChar *(*irgen)(UChar r1, UChar r3, IRTemp op2addr),
1838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar r3, UChar b2, UShort dl2, UChar dh2)
1839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
1841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
1842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d2 = newTemp(Ity_I64);
1843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
1845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkexpr(d2), b2 != 0 ? get_gpr_dw0(b2) :
1846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, r3, op2addr);
1849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, GPR, GPR, SDXB), mnm, r1, r3, dh2, dl2, 0, b2);
1852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RSY_AARD(HChar *(*irgen)(UChar, UChar, IRTemp),
1856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar r3, UChar b2, UShort dl2, UChar dh2)
1857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
1859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
1860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d2 = newTemp(Ity_I64);
1861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
1863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkexpr(d2), b2 != 0 ? get_gpr_dw0(b2) :
1864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, r3, op2addr);
1867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, AR, AR, SDXB), mnm, r1, r3, dh2, dl2, 0, b2);
1870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RSY_RURD(HChar *(*irgen)(UChar r1, UChar r3, IRTemp op2addr),
1874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar r3, UChar b2, UShort dl2, UChar dh2)
1875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
1877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
1878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d2 = newTemp(Ity_I64);
1879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
1881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkexpr(d2), b2 != 0 ? get_gpr_dw0(b2) :
1882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, r3, op2addr);
1885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, GPR, UINT, SDXB), mnm, r1, r3, dh2, dl2, 0, b2);
1888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RSY_RDRM(HChar *(*irgen)(UChar r1, IRTemp op2addr),
1892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar m3, UChar b2, UShort dl2, UChar dh2,
1893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     Int xmnm_kind)
1894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
1896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d2 = newTemp(Ity_I64);
1897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ32, s390_call_calculate_cond(m3), mkU32(0)));
1899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
1901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkexpr(d2), b2 != 0 ? get_gpr_dw0(b2) :
1902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irgen(r1, op2addr);
1905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(dis_res->whatNext == Dis_Continue);
1907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(XMNM, GPR, SDXB), xmnm_kind, m3, r1, dh2, dl2, 0, b2);
1910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RX(HChar *(*irgen)(UChar r1, UChar x2, UChar b2, UShort d2,
1914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               IRTemp op2addr),
1915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               UChar r1, UChar x2, UChar b2, UShort d2)
1916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
1918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkU64(d2),
1920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
1921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irgen(r1, x2, b2, d2, op2addr);
1924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RX_RRRD(HChar *(*irgen)(UChar r1, IRTemp op2addr),
1928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar r1, UChar x2, UChar b2, UShort d2)
1929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
1931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
1932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkU64(d2),
1934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
1935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, op2addr);
1938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, UDXB), mnm, r1, d2, x2, b2);
1941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RX_FRRD(HChar *(*irgen)(UChar r1, IRTemp op2addr),
1945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar r1, UChar x2, UChar b2, UShort d2)
1946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
1948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
1949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkU64(d2),
1951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
1952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, op2addr);
1955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, FPR, UDXB), mnm, r1, d2, x2, b2);
1958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RXE_FRRD(HChar *(*irgen)(UChar r1, IRTemp op2addr),
1962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar x2, UChar b2, UShort d2)
1963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
1965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
1966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkU64(d2),
1968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
1969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, op2addr);
1972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, FPR, UDXB), mnm, r1, d2, x2, b2);
1975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RXF_FRRDF(HChar *(*irgen)(UChar, IRTemp, UChar),
1979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      UChar r3, UChar x2, UChar b2, UShort d2, UChar r1)
1980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
1982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
1983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkU64(d2),
1985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
1986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
1987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r3, op2addr, r1);
1989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC4(MNM, FPR, FPR, UDXB), mnm, r1, r3, d2, x2, b2);
1992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
1995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RXY_RRRD(HChar *(*irgen)(UChar r1, IRTemp op2addr),
1996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
1997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
1998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
1999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d2 = newTemp(Ity_I64);
2001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
2003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkexpr(d2),
2004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
2005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, op2addr);
2008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, SDXB), mnm, r1, dh2, dl2, x2, b2);
2011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RXY_FRRD(HChar *(*irgen)(UChar r1, IRTemp op2addr),
2015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
2016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
2018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d2 = newTemp(Ity_I64);
2020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
2022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkexpr(d2),
2023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
2024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(r1, op2addr);
2027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, FPR, SDXB), mnm, r1, dh2, dl2, x2, b2);
2030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_RXY_URRD(HChar *(*irgen)(void),
2034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
2035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
2037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d2 = newTemp(Ity_I64);
2039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
2041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkexpr(d2),
2042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
2043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen();
2046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, UINT, SDXB), mnm, r1, dh2, dl2, x2, b2);
2049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_S_RD(HChar *(*irgen)(IRTemp op2addr),
2053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 UChar b2, UShort d2)
2054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
2056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
2059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(op2addr);
2062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC2(MNM, UDXB), mnm, d2, 0, b2);
2065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_SI_URD(HChar *(*irgen)(UChar i2, IRTemp op1addr),
2069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                   UChar i2, UChar b1, UShort d1)
2070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
2072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1addr = newTemp(Ity_I64);
2073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1addr, binop(Iop_Add64, mkU64(d1), b1 != 0 ? get_gpr_dw0(b1) :
2075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(i2, op1addr);
2078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, UDXB, UINT), mnm, d1, 0, b1, i2);
2081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_SIY_URD(HChar *(*irgen)(UChar i2, IRTemp op1addr),
2085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar i2, UChar b1, UShort dl1, UChar dh1)
2086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
2088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1addr = newTemp(Ity_I64);
2089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d1 = newTemp(Ity_I64);
2090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d1, mkU64(((ULong)(Long)(Char)dh1 << 12) | ((ULong)dl1)));
2092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1addr, binop(Iop_Add64, mkexpr(d1), b1 != 0 ? get_gpr_dw0(b1) :
2093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(i2, op1addr);
2096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, SDXB, UINT), mnm, dh1, dl1, 0, b1, i2);
2099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_SIY_IRD(HChar *(*irgen)(UChar i2, IRTemp op1addr),
2103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar i2, UChar b1, UShort dl1, UChar dh1)
2104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
2106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1addr = newTemp(Ity_I64);
2107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp d1 = newTemp(Ity_I64);
2108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(d1, mkU64(((ULong)(Long)(Char)dh1 << 12) | ((ULong)dl1)));
2110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1addr, binop(Iop_Add64, mkexpr(d1), b1 != 0 ? get_gpr_dw0(b1) :
2111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(i2, op1addr);
2114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, SDXB, INT), mnm, dh1, dl1, 0, b1, (Int)(Char)i2);
2117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_SS_L0RDRD(HChar *(*irgen)(UChar, IRTemp, IRTemp),
2121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      UChar l, UChar b1, UShort d1, UChar b2, UShort d2)
2122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
2124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1addr = newTemp(Ity_I64);
2125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2addr = newTemp(Ity_I64);
2126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1addr, binop(Iop_Add64, mkU64(d1), b1 != 0 ? get_gpr_dw0(b1) :
2128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
2130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(l, op1addr, op2addr);
2133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, UDLB, UDXB), mnm, d1, l, b1, d2, 0, b2);
2136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_SIL_RDI(HChar *(*irgen)(UShort i2, IRTemp op1addr),
2140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar b1, UShort d1, UShort i2)
2141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
2143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1addr = newTemp(Ity_I64);
2144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1addr, binop(Iop_Add64, mkU64(d1), b1 != 0 ? get_gpr_dw0(b1) :
2146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(i2, op1addr);
2149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, UDXB, INT), mnm, d1, 0, b1, (Int)(Short)i2);
2152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
2155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_format_SIL_RDU(HChar *(*irgen)(UShort i2, IRTemp op1addr),
2156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    UChar b1, UShort d1, UShort i2)
2157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   HChar *mnm;
2159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1addr = newTemp(Ity_I64);
2160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1addr, binop(Iop_Add64, mkU64(d1), b1 != 0 ? get_gpr_dw0(b1) :
2162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU64(0)));
2163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mnm = irgen(i2, op1addr);
2165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, UDXB, UINT), mnm, d1, 0, b1, i2);
2168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
2173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Build IR for opcodes                                 ---*/
2174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
2175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AR(UChar r1, UChar r2)
2178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
2185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, op2);
2187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ar";
2190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AGR(UChar r1, UChar r2)
2194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
2201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, op2);
2203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "agr";
2206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AGFR(UChar r1, UChar r2)
2210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
2217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, op2);
2219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "agfr";
2222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ARK(UChar r3, UChar r1, UChar r2)
2226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
2229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
2232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
2233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
2234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op2, op3);
2235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ark";
2238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AGRK(UChar r3, UChar r1, UChar r2)
2242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
2245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
2248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
2249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op2), mkexpr(op3)));
2250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op2, op3);
2251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "agrk";
2254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_A(UChar r1, IRTemp op2addr)
2258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
2265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, op2);
2267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "a";
2270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AY(UChar r1, IRTemp op2addr)
2274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
2281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, op2);
2283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ay";
2286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AG(UChar r1, IRTemp op2addr)
2290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
2297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, op2);
2299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ag";
2302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AGF(UChar r1, IRTemp op2addr)
2306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
2313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, op2);
2315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "agf";
2318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AFI(UChar r1, UInt i2)
2322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
2325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)i2;
2329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkU32((UInt)op2)));
2330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, mktemp(Ity_I32,
2331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32((UInt)op2)));
2332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "afi";
2335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AGFI(UChar r1, UInt i2)
2339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
2342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Long)(Int)i2;
2346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkU64((ULong)op2)));
2347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, mktemp(Ity_I64,
2348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64((ULong)op2)));
2349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "agfi";
2352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AHIK(UChar r1, UChar r3, UShort i2)
2356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
2358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
2359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)(Short)i2;
2362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
2363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkU32((UInt)op2), mkexpr(op3)));
2364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, mktemp(Ity_I32, mkU32((UInt)
2365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       op2)), op3);
2366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ahik";
2369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AGHIK(UChar r1, UChar r3, UShort i2)
2373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
2375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
2376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Long)(Short)i2;
2379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
2380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkU64((ULong)op2), mkexpr(op3)));
2381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, mktemp(Ity_I64, mkU64((ULong)
2382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       op2)), op3);
2383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "aghik";
2386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ASI(UChar i2, IRTemp op1addr)
2390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
2393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I32, mkexpr(op1addr)));
2396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)(Char)i2;
2397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkU32((UInt)op2)));
2398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
2399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, mktemp(Ity_I32,
2400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32((UInt)op2)));
2401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "asi";
2403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AGSI(UChar i2, IRTemp op1addr)
2407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
2410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I64, mkexpr(op1addr)));
2413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Long)(Char)i2;
2414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkU64((ULong)op2)));
2415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
2416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, mktemp(Ity_I64,
2417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64((ULong)op2)));
2418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "agsi";
2420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AH(UChar r1, IRTemp op2addr)
2424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
2431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, op2);
2433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ah";
2436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AHY(UChar r1, IRTemp op2addr)
2440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
2447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, op2);
2449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ahy";
2452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AHI(UChar r1, UShort i2)
2456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
2459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)(Short)i2;
2463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkU32((UInt)op2)));
2464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, mktemp(Ity_I32,
2465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32((UInt)op2)));
2466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ahi";
2469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AGHI(UChar r1, UShort i2)
2473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
2476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Long)(Short)i2;
2480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkU64((ULong)op2)));
2481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, mktemp(Ity_I64,
2482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64((ULong)op2)));
2483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "aghi";
2486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AHHHR(UChar r3, UChar r1, UChar r2)
2490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
2493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r2));
2496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w0(r3));
2497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
2498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op2, op3);
2499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
2500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ahhhr";
2502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AHHLR(UChar r3, UChar r1, UChar r2)
2506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
2509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r2));
2512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
2513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
2514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op2, op3);
2515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
2516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ahhlr";
2518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AIH(UChar r1, UInt i2)
2522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
2525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
2528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)i2;
2529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkU32((UInt)op2)));
2530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, mktemp(Ity_I32,
2531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32((UInt)op2)));
2532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
2533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "aih";
2535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALR(UChar r1, UChar r2)
2539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
2546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, op2);
2548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alr";
2551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALGR(UChar r1, UChar r2)
2555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
2562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, op2);
2564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "algr";
2567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALGFR(UChar r1, UChar r2)
2571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Uto64, get_gpr_w1(r2)));
2578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, op2);
2580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "algfr";
2583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALRK(UChar r3, UChar r1, UChar r2)
2587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
2590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
2593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
2594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
2595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op2, op3);
2596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alrk";
2599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALGRK(UChar r3, UChar r1, UChar r2)
2603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
2606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
2609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
2610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op2), mkexpr(op3)));
2611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op2, op3);
2612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "algrk";
2615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AL(UChar r1, IRTemp op2addr)
2619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
2626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, op2);
2628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "al";
2631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALY(UChar r1, IRTemp op2addr)
2635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
2642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, op2);
2644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "aly";
2647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALG(UChar r1, IRTemp op2addr)
2651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
2658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, op2);
2660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alg";
2663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALGF(UChar r1, IRTemp op2addr)
2667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Uto64, load(Ity_I32, mkexpr(op2addr))));
2674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, op2);
2676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "algf";
2679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALFI(UChar r1, UInt i2)
2683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
2686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
2690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkU32(op2)));
2691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, mktemp(Ity_I32,
2692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(op2)));
2693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alfi";
2696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALGFI(UChar r1, UInt i2)
2700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong op2;
2703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (ULong)i2;
2707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkU64(op2)));
2708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, mktemp(Ity_I64,
2709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64(op2)));
2710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "algfi";
2713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALHHHR(UChar r3, UChar r1, UChar r2)
2717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
2720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r2));
2723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w0(r3));
2724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
2725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op2, op3);
2726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
2727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alhhhr";
2729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALHHLR(UChar r3, UChar r1, UChar r2)
2733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
2736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r2));
2739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
2740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
2741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op2, op3);
2742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
2743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alhhlr";
2745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALCR(UChar r1, UChar r2)
2749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp carry_in = newTemp(Ity_I32);
2754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
2757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(carry_in, binop(Iop_Shr32, s390_call_calculate_cc(), mkU8(1)));
2758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)),
2759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(carry_in)));
2760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_ADDC_32, op1, op2, carry_in);
2761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alcr";
2764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALCGR(UChar r1, UChar r2)
2768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp carry_in = newTemp(Ity_I64);
2773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
2776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(carry_in, unop(Iop_32Uto64, binop(Iop_Shr32, s390_call_calculate_cc(),
2777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(1))));
2778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)),
2779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(carry_in)));
2780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_ADDC_64, op1, op2, carry_in);
2781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alcgr";
2784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALC(UChar r1, IRTemp op2addr)
2788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp carry_in = newTemp(Ity_I32);
2793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
2796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(carry_in, binop(Iop_Shr32, s390_call_calculate_cc(), mkU8(1)));
2797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)),
2798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(carry_in)));
2799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_ADDC_32, op1, op2, carry_in);
2800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alc";
2803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALCG(UChar r1, IRTemp op2addr)
2807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp carry_in = newTemp(Ity_I64);
2812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
2815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(carry_in, unop(Iop_32Uto64, binop(Iop_Shr32, s390_call_calculate_cc(),
2816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(1))));
2817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)),
2818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(carry_in)));
2819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_ADDC_64, op1, op2, carry_in);
2820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alcg";
2823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALSI(UChar i2, IRTemp op1addr)
2827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
2830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I32, mkexpr(op1addr)));
2833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (UInt)(Int)(Char)i2;
2834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkU32(op2)));
2835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, mktemp(Ity_I32,
2836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(op2)));
2837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
2838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alsi";
2840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALGSI(UChar i2, IRTemp op1addr)
2844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong op2;
2847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I64, mkexpr(op1addr)));
2850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (ULong)(Long)(Char)i2;
2851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op1), mkU64(op2)));
2852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, mktemp(Ity_I64,
2853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64(op2)));
2854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
2855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "algsi";
2857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALHSIK(UChar r1, UChar r3, UShort i2)
2861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
2863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
2864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (UInt)(Int)(Short)i2;
2867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
2868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkU32(op2), mkexpr(op3)));
2869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, mktemp(Ity_I32, mkU32(op2)),
2870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       op3);
2871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alhsik";
2874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALGHSIK(UChar r1, UChar r3, UShort i2)
2878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong op2;
2880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
2881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (ULong)(Long)(Short)i2;
2884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
2885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkU64(op2), mkexpr(op3)));
2886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, mktemp(Ity_I64, mkU64(op2)),
2887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       op3);
2888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alghsik";
2891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALSIH(UChar r1, UInt i2)
2895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
2898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
2901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
2902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkU32(op2)));
2903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, mktemp(Ity_I32,
2904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(op2)));
2905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
2906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alsih";
2908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ALSIHN(UChar r1, UInt i2)
2912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
2915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
2918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
2919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op1), mkU32(op2)));
2920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
2921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "alsihn";
2923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NR(UChar r1, UChar r2)
2927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
2934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And32, mkexpr(op1), mkexpr(op2)));
2935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nr";
2939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NGR(UChar r1, UChar r2)
2943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
2945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
2949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
2950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And64, mkexpr(op1), mkexpr(op2)));
2951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ngr";
2955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NRK(UChar r3, UChar r1, UChar r2)
2959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
2962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
2965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
2966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And32, mkexpr(op2), mkexpr(op3)));
2967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
2969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nrk";
2971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NGRK(UChar r3, UChar r1, UChar r2)
2975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
2977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
2978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
2979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
2981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
2982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And64, mkexpr(op2), mkexpr(op3)));
2983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
2985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ngrk";
2987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
2988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
2990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_N(UChar r1, IRTemp op2addr)
2991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
2992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
2993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
2994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
2995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
2997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
2998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And32, mkexpr(op1), mkexpr(op2)));
2999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
3001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "n";
3003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NY(UChar r1, IRTemp op2addr)
3007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
3014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And32, mkexpr(op1), mkexpr(op2)));
3015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
3017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ny";
3019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NG(UChar r1, IRTemp op2addr)
3023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
3027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
3030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And64, mkexpr(op1), mkexpr(op2)));
3031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
3033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ng";
3035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NI(UChar i2, IRTemp op1addr)
3039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I8);
3041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar op2;
3042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I8);
3043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I8, mkexpr(op1addr)));
3045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And8, mkexpr(op1), mkU8(op2)));
3047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
3049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ni";
3051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NIY(UChar i2, IRTemp op1addr)
3055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I8);
3057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar op2;
3058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I8);
3059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I8, mkexpr(op1addr)));
3061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And8, mkexpr(op1), mkU8(op2)));
3063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
3065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "niy";
3067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NIHF(UChar r1, UInt i2)
3071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
3074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
3077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And32, mkexpr(op1), mkU32(op2)));
3079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
3081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nihf";
3083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NIHH(UChar r1, UShort i2)
3087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
3089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
3090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I16);
3091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_hw0(r1));
3093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And16, mkexpr(op1), mkU16(op2)));
3095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw0(r1, mkexpr(result));
3097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nihh";
3099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NIHL(UChar r1, UShort i2)
3103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
3105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
3106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I16);
3107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_hw1(r1));
3109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And16, mkexpr(op1), mkU16(op2)));
3111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw1(r1, mkexpr(result));
3113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nihl";
3115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NILF(UChar r1, UInt i2)
3119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
3122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
3123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And32, mkexpr(op1), mkU32(op2)));
3127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
3129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nilf";
3131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NILH(UChar r1, UShort i2)
3135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
3137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
3138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I16);
3139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_hw2(r1));
3141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And16, mkexpr(op1), mkU16(op2)));
3143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw2(r1, mkexpr(result));
3145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nilh";
3147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NILL(UChar r1, UShort i2)
3151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
3153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
3154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I16);
3155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_hw3(r1));
3157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
3158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And16, mkexpr(op1), mkU16(op2)));
3159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw3(r1, mkexpr(result));
3161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nill";
3163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BASR(UChar r1, UChar r2)
3167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp target = newTemp(Ity_I64);
3169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r2 == 0) {
3171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 2ULL));
3172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (r1 != r2) {
3174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 2ULL));
3175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         call_function(get_gpr_dw0(r2));
3176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(target, get_gpr_dw0(r2));
3178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 2ULL));
3179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         call_function(mkexpr(target));
3180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "basr";
3184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BAS(UChar r1, IRTemp op2addr)
3188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp target = newTemp(Ity_I64);
3190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 4ULL));
3192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(target, mkexpr(op2addr));
3193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call_function(mkexpr(target));
3194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bas";
3196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BCR(UChar r1, UChar r2)
3200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
3202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r2 == 0 && (r1 >= 14)) {    /* serialization */
3204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      stmt(IRStmt_MBE(Imbe_Fence));
3205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r2 == 0) || (r1 == 0)) {
3208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (r1 == 15) {
3210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return_from_function(get_gpr_dw0(r2));
3211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(cond, s390_call_calculate_cond(r1));
3213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    get_gpr_dw0(r2));
3215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
3218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC2(XMNM, GPR), S390_XMNM_BCR, r1, r2);
3219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bcr";
3221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BC(UChar r1, UChar x2, UChar b2, UShort d2, IRTemp op2addr)
3225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
3227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r1 == 0) {
3229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (r1 == 15) {
3231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op2addr));
3232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(cond, s390_call_calculate_cond(r1));
3234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(op2addr));
3236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
3239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC2(XMNM, UDXB), S390_XMNM_BC, r1, d2, x2, b2);
3240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bc";
3242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BCTR(UChar r1, UChar r2)
3246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Sub32, get_gpr_w1(r1), mkU32(1)));
3248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r2 != 0) {
3249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if_condition_goto_computed(binop(Iop_CmpNE32, get_gpr_w1(r1), mkU32(0)),
3250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 get_gpr_dw0(r2));
3251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bctr";
3254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BCTGR(UChar r1, UChar r2)
3258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Sub64, get_gpr_dw0(r1), mkU64(1)));
3260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r2 != 0) {
3261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if_condition_goto_computed(binop(Iop_CmpNE64, get_gpr_dw0(r1), mkU64(0)),
3262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 get_gpr_dw0(r2));
3263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bctgr";
3266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BCT(UChar r1, IRTemp op2addr)
3270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Sub32, get_gpr_w1(r1), mkU32(1)));
3272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if_condition_goto_computed(binop(Iop_CmpNE32, get_gpr_w1(r1), mkU32(0)),
3273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                              mkexpr(op2addr));
3274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bct";
3276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BCTG(UChar r1, IRTemp op2addr)
3280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Sub64, get_gpr_dw0(r1), mkU64(1)));
3282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if_condition_goto_computed(binop(Iop_CmpNE64, get_gpr_dw0(r1), mkU64(0)),
3283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                              mkexpr(op2addr));
3284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bctg";
3286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BXH(UChar r1, UChar r3, IRTemp op2addr)
3290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I32);
3292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_w1(r3 | 1));
3294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Add32, get_gpr_w1(r1), get_gpr_w1(r3)));
3295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if_condition_goto_computed(binop(Iop_CmpLT32S, mkexpr(value),
3296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    get_gpr_w1(r1)), mkexpr(op2addr));
3297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bxh";
3299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BXHG(UChar r1, UChar r3, IRTemp op2addr)
3303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I64);
3305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_dw0(r3 | 1));
3307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Add64, get_gpr_dw0(r1), get_gpr_dw0(r3)));
3308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if_condition_goto_computed(binop(Iop_CmpLT64S, mkexpr(value),
3309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    get_gpr_dw0(r1)), mkexpr(op2addr));
3310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bxhg";
3312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BXLE(UChar r1, UChar r3, IRTemp op2addr)
3316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I32);
3318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_w1(r3 | 1));
3320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Add32, get_gpr_w1(r1), get_gpr_w1(r3)));
3321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if_condition_goto_computed(binop(Iop_CmpLE32S, get_gpr_w1(r1),
3322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(value)), mkexpr(op2addr));
3323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bxle";
3325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BXLEG(UChar r1, UChar r3, IRTemp op2addr)
3329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I64);
3331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_dw0(r3 | 1));
3333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Add64, get_gpr_dw0(r1), get_gpr_dw0(r3)));
3334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if_condition_goto_computed(binop(Iop_CmpLE64S, get_gpr_dw0(r1),
3335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(value)), mkexpr(op2addr));
3336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bxleg";
3338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRAS(UChar r1, UShort i2)
3342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 4ULL));
3344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call_function_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "bras";
3347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRASL(UChar r1, UInt i2)
3351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 6ULL));
3353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call_function_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1));
3354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brasl";
3356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRC(UChar r1, UShort i2)
3360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
3362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r1 == 0) {
3364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (r1 == 15) {
3366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(
3367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(cond, s390_call_calculate_cond(r1));
3370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
3376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC2(XMNM, PCREL), S390_XMNM_BRC, r1, (Int)(Short)i2);
3377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brc";
3379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRCL(UChar r1, UInt i2)
3383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
3385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r1 == 0) {
3387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (r1 == 15) {
3389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1));
3390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(cond, s390_call_calculate_cond(r1));
3392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1));
3394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
3397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC2(XMNM, PCREL), S390_XMNM_BRCL, r1, i2);
3398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brcl";
3400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRCT(UChar r1, UShort i2)
3404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Sub32, get_gpr_w1(r1), mkU32(1)));
3406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if_condition_goto(binop(Iop_CmpNE32, get_gpr_w1(r1), mkU32(0)),
3407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brct";
3410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRCTG(UChar r1, UShort i2)
3414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Sub64, get_gpr_dw0(r1), mkU64(1)));
3416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if_condition_goto(binop(Iop_CmpNE64, get_gpr_dw0(r1), mkU64(0)),
3417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brctg";
3420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRXH(UChar r1, UChar r3, UShort i2)
3424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I32);
3426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_w1(r3 | 1));
3428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Add32, get_gpr_w1(r1), get_gpr_w1(r3)));
3429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if_condition_goto(binop(Iop_CmpLT32S, mkexpr(value), get_gpr_w1(r1)),
3430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brxh";
3433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRXHG(UChar r1, UChar r3, UShort i2)
3437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I64);
3439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_dw0(r3 | 1));
3441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Add64, get_gpr_dw0(r1), get_gpr_dw0(r3)));
3442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if_condition_goto(binop(Iop_CmpLT64S, mkexpr(value), get_gpr_dw0(r1)),
3443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brxhg";
3446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRXLE(UChar r1, UChar r3, UShort i2)
3450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I32);
3452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_w1(r3 | 1));
3454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Add32, get_gpr_w1(r1), get_gpr_w1(r3)));
3455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if_condition_goto(binop(Iop_CmpLE32S, get_gpr_w1(r1), mkexpr(value)),
3456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brxle";
3459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_BRXLG(UChar r1, UChar r3, UShort i2)
3463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I64);
3465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_dw0(r3 | 1));
3467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Add64, get_gpr_dw0(r1), get_gpr_dw0(r3)));
3468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if_condition_goto(binop(Iop_CmpLE64S, get_gpr_dw0(r1), mkexpr(value)),
3469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "brxlg";
3472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CR(UChar r1, UChar r2)
3476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
3482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cr";
3485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGR(UChar r1, UChar r2)
3489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
3495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgr";
3498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGFR(UChar r1, UChar r2)
3502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
3508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgfr";
3511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_C(UChar r1, IRTemp op2addr)
3515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
3521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "c";
3524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CY(UChar r1, IRTemp op2addr)
3528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
3534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cy";
3537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CG(UChar r1, IRTemp op2addr)
3541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
3547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cg";
3550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGF(UChar r1, IRTemp op2addr)
3554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
3560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgf";
3563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CFI(UChar r1, UInt i2)
3567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
3570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)i2;
3573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I32,
3574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32((UInt)op2)));
3575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cfi";
3577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGFI(UChar r1, UInt i2)
3581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
3584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Long)(Int)i2;
3587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I64,
3588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64((ULong)op2)));
3589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgfi";
3591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CRL(UChar r1, UInt i2)
3595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
3601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          i2 << 1))));
3602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "crl";
3605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGRL(UChar r1, UInt i2)
3609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
3615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          i2 << 1))));
3616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgrl";
3619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGFRL(UChar r1, UInt i2)
3623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkU64(guest_IA_curr_instr +
3629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ((ULong)(Long)(Int)i2 << 1)))));
3630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgfrl";
3633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CRB(UChar r1, UChar r2, UChar m3, IRTemp op4addr)
3637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
3641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
3643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
3645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op4addr));
3646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_w1(r1));
3648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op2, get_gpr_w1(r2));
3649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE,
3650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              op1, op2));
3651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond),
3652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          mkU32(0)), mkexpr(op4addr));
3653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "crb";
3657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGRB(UChar r1, UChar r2, UChar m3, IRTemp op4addr)
3661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
3665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
3667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
3669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op4addr));
3670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_dw0(r1));
3672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op2, get_gpr_dw0(r2));
3673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE,
3674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              op1, op2));
3675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond),
3676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          mkU32(0)), mkexpr(op4addr));
3677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgrb";
3681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CRJ(UChar r1, UChar r2, UShort i4, UChar m3)
3685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
3689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
3691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
3693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(
3694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
3695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_w1(r1));
3697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op2, get_gpr_w1(r2));
3698663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE,
3699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              op1, op2));
3700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
3702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "crj";
3707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGRJ(UChar r1, UChar r2, UShort i4, UChar m3)
3711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
3715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
3717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
3719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(
3720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
3721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_dw0(r1));
3723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op2, get_gpr_dw0(r2));
3724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE,
3725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              op1, op2));
3726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
3728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgrj";
3733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CIB(UChar r1, UChar m3, UChar i2, IRTemp op4addr)
3737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
3740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
3741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
3743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
3745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op4addr));
3746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_w1(r1));
3748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         op2 = (Int)(Char)i2;
3749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE, op1,
3750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mktemp(Ity_I32, mkU32((UInt)op2))));
3751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(op4addr));
3753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cib";
3757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGIB(UChar r1, UChar m3, UChar i2, IRTemp op4addr)
3761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
3764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
3765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
3767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
3769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op4addr));
3770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_dw0(r1));
3772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         op2 = (Long)(Char)i2;
3773663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE, op1,
3774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mktemp(Ity_I64, mkU64((ULong)op2))));
3775663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3776663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(op4addr));
3777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgib";
3781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CIJ(UChar r1, UChar m3, UShort i4, UChar i2)
3785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
3788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
3789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
3791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
3793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
3794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_w1(r1));
3796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         op2 = (Int)(Char)i2;
3797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE, op1,
3798663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mktemp(Ity_I32, mkU32((UInt)op2))));
3799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
3801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cij";
3806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGIJ(UChar r1, UChar m3, UShort i4, UChar i2)
3810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
3813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
3814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
3816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
3817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
3818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
3819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
3820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_dw0(r1));
3821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         op2 = (Long)(Char)i2;
3822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE, op1,
3823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mktemp(Ity_I64, mkU64((ULong)op2))));
3824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
3826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
3828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
3829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgij";
3831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CH(UChar r1, IRTemp op2addr)
3835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
3841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ch";
3844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CHY(UChar r1, IRTemp op2addr)
3848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
3854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "chy";
3857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGH(UChar r1, IRTemp op2addr)
3861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto64, load(Ity_I16, mkexpr(op2addr))));
3867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgh";
3870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CHI(UChar r1, UShort i2)
3874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
3877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)(Short)i2;
3880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I32,
3881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32((UInt)op2)));
3882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "chi";
3884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGHI(UChar r1, UShort i2)
3888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
3891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Long)(Short)i2;
3894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I64,
3895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64((ULong)op2)));
3896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cghi";
3898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CHHSI(UShort i2, IRTemp op1addr)
3902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
3904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Short op2;
3905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I16, mkexpr(op1addr)));
3907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Short)i2;
3908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I16,
3909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU16((UShort)op2)));
3910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "chhsi";
3912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CHSI(UShort i2, IRTemp op1addr)
3916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
3919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I32, mkexpr(op1addr)));
3921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)(Short)i2;
3922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I32,
3923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32((UInt)op2)));
3924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "chsi";
3926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGHSI(UShort i2, IRTemp op1addr)
3930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op2;
3933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I64, mkexpr(op1addr)));
3935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Long)(Short)i2;
3936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I64,
3937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64((ULong)op2)));
3938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cghsi";
3940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CHRL(UChar r1, UInt i2)
3944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
3949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkU64(guest_IA_curr_instr +
3950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ((ULong)(Long)(Int)i2 << 1)))));
3951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "chrl";
3954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGHRL(UChar r1, UInt i2)
3958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
3960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
3961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
3963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto64, load(Ity_I16, mkU64(guest_IA_curr_instr +
3964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ((ULong)(Long)(Int)i2 << 1)))));
3965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cghrl";
3968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CHHR(UChar r1, UChar r2)
3972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
3977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r2));
3978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "chhr";
3981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CHLR(UChar r1, UChar r2)
3985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
3987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
3988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
3990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
3991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "chlr";
3994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
3995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
3997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CHF(UChar r1, IRTemp op2addr)
3998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
3999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
4003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
4004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
4005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "chf";
4007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CIH(UChar r1, UInt i2)
4011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
4014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
4016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)i2;
4017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I32,
4018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32((UInt)op2)));
4019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cih";
4021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLR(UChar r1, UChar r2)
4025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
4031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clr";
4034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGR(UChar r1, UChar r2)
4038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
4044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgr";
4047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGFR(UChar r1, UChar r2)
4051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Uto64, get_gpr_w1(r2)));
4057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgfr";
4060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CL(UChar r1, IRTemp op2addr)
4064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
4070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cl";
4073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLY(UChar r1, IRTemp op2addr)
4077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
4083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cly";
4086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLG(UChar r1, IRTemp op2addr)
4090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
4096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clg";
4099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGF(UChar r1, IRTemp op2addr)
4103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Uto64, load(Ity_I32, mkexpr(op2addr))));
4109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgf";
4112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLFI(UChar r1, UInt i2)
4116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
4119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
4122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I32,
4123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(op2)));
4124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clfi";
4126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGFI(UChar r1, UInt i2)
4130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong op2;
4133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (ULong)i2;
4136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I64,
4137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64(op2)));
4138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgfi";
4140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLI(UChar i2, IRTemp op1addr)
4144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I8);
4146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar op2;
4147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I8, mkexpr(op1addr)));
4149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
4150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I8,
4151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU8(op2)));
4152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cli";
4154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLIY(UChar i2, IRTemp op1addr)
4158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I8);
4160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar op2;
4161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I8, mkexpr(op1addr)));
4163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
4164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I8,
4165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU8(op2)));
4166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cliy";
4168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLFHSI(UShort i2, IRTemp op1addr)
4172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
4175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I32, mkexpr(op1addr)));
4177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (UInt)i2;
4178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I32,
4179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(op2)));
4180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clfhsi";
4182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGHSI(UShort i2, IRTemp op1addr)
4186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong op2;
4189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I64, mkexpr(op1addr)));
4191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (ULong)i2;
4192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I64,
4193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64(op2)));
4194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clghsi";
4196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLHHSI(UShort i2, IRTemp op1addr)
4200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
4202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
4203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I16, mkexpr(op1addr)));
4205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
4206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I16,
4207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU16(op2)));
4208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clhhsi";
4210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLRL(UChar r1, UInt i2)
4214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
4220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          i2 << 1))));
4221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clrl";
4224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGRL(UChar r1, UInt i2)
4228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
4234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          i2 << 1))));
4235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgrl";
4238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGFRL(UChar r1, UInt i2)
4242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Uto64, load(Ity_I32, mkU64(guest_IA_curr_instr +
4248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ((ULong)(Long)(Int)i2 << 1)))));
4249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgfrl";
4252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLHRL(UChar r1, UInt i2)
4256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Uto32, load(Ity_I16, mkU64(guest_IA_curr_instr +
4262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ((ULong)(Long)(Int)i2 << 1)))));
4263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clhrl";
4266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGHRL(UChar r1, UInt i2)
4270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Uto64, load(Ity_I16, mkU64(guest_IA_curr_instr +
4276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ((ULong)(Long)(Int)i2 << 1)))));
4277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clghrl";
4280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLRB(UChar r1, UChar r2, UChar m3, IRTemp op4addr)
4284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op4addr));
4293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_w1(r1));
4295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op2, get_gpr_w1(r2));
4296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE,
4297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              op1, op2));
4298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(op4addr));
4300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clrb";
4304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGRB(UChar r1, UChar r2, UChar m3, IRTemp op4addr)
4308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op4addr));
4317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_dw0(r1));
4319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op2, get_gpr_dw0(r2));
4320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE,
4321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              op1, op2));
4322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(op4addr));
4324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgrb";
4328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLRJ(UChar r1, UChar r2, UShort i4, UChar m3)
4332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_w1(r1));
4343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op2, get_gpr_w1(r2));
4344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE,
4345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              op1, op2));
4346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clrj";
4353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGRJ(UChar r1, UChar r2, UShort i4, UChar m3)
4357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_dw0(r1));
4368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op2, get_gpr_dw0(r2));
4369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE,
4370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              op1, op2));
4371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgrj";
4378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLIB(UChar r1, UChar m3, UChar i2, IRTemp op4addr)
4382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
4385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op4addr));
4391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_w1(r1));
4393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         op2 = (UInt)i2;
4394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE, op1,
4395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mktemp(Ity_I32, mkU32(op2))));
4396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(op4addr));
4398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clib";
4402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGIB(UChar r1, UChar m3, UChar i2, IRTemp op4addr)
4406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong op2;
4409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto(mkexpr(op4addr));
4415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_dw0(r1));
4417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         op2 = (ULong)i2;
4418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE, op1,
4419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mktemp(Ity_I64, mkU64(op2))));
4420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if_condition_goto_computed(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                    mkexpr(op4addr));
4422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgib";
4426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLIJ(UChar r1, UChar m3, UShort i4, UChar i2)
4430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
4433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_w1(r1));
4441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         op2 = (UInt)i2;
4442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE, op1,
4443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mktemp(Ity_I32, mkU32(op2))));
4444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clij";
4451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLGIJ(UChar r1, UChar m3, UShort i4, UChar i2)
4455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong op2;
4458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond = newTemp(Ity_I32);
4459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (m3 == 0) {
4461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (m3 == 14) {
4463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         always_goto_and_chase(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
4465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(op1, get_gpr_dw0(r1));
4466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         op2 = (ULong)i2;
4467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE, op1,
4468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mktemp(Ity_I64, mkU64(op2))));
4469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
4473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clgij";
4476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLM(UChar r1, UChar r3, IRTemp op2addr)
4480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b0 = newTemp(Ity_I32);
4484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b1 = newTemp(Ity_I32);
4485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b2 = newTemp(Ity_I32);
4486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b3 = newTemp(Ity_I32);
4487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c0 = newTemp(Ity_I32);
4488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c1 = newTemp(Ity_I32);
4489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c2 = newTemp(Ity_I32);
4490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c3 = newTemp(Ity_I32);
4491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
4492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
4494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 8) != 0) {
4495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b0, unop(Iop_8Uto32, get_gpr_b4(r1)));
4496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c0, unop(Iop_8Uto32, load(Ity_I8, mkexpr(op2addr))));
4497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b0, mkU32(0));
4500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c0, mkU32(0));
4501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 4) != 0) {
4503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b1, unop(Iop_8Uto32, get_gpr_b5(r1)));
4504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c1, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
4506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b1, mkU32(0));
4509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c1, mkU32(0));
4510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 2) != 0) {
4512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b2, unop(Iop_8Uto32, get_gpr_b6(r1)));
4513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c2, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
4515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b2, mkU32(0));
4518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c2, mkU32(0));
4519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 1) != 0) {
4521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b3, unop(Iop_8Uto32, get_gpr_b7(r1)));
4522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c3, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
4524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b3, mkU32(0));
4527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c3, mkU32(0));
4528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
4530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(b0), mkU8(24)), binop(Iop_Shl32, mkexpr(b1), mkU8(16))),
4531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Shl32, mkexpr(b2), mkU8(8))), mkexpr(b3)));
4532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
4533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(c0), mkU8(24)), binop(Iop_Shl32, mkexpr(c1), mkU8(16))),
4534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Shl32, mkexpr(c2), mkU8(8))), mkexpr(c3)));
4535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clm";
4538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLMY(UChar r1, UChar r3, IRTemp op2addr)
4542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b0 = newTemp(Ity_I32);
4546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b1 = newTemp(Ity_I32);
4547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b2 = newTemp(Ity_I32);
4548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b3 = newTemp(Ity_I32);
4549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c0 = newTemp(Ity_I32);
4550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c1 = newTemp(Ity_I32);
4551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c2 = newTemp(Ity_I32);
4552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c3 = newTemp(Ity_I32);
4553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
4554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
4556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 8) != 0) {
4557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b0, unop(Iop_8Uto32, get_gpr_b4(r1)));
4558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c0, unop(Iop_8Uto32, load(Ity_I8, mkexpr(op2addr))));
4559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b0, mkU32(0));
4562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c0, mkU32(0));
4563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 4) != 0) {
4565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b1, unop(Iop_8Uto32, get_gpr_b5(r1)));
4566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c1, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
4568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b1, mkU32(0));
4571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c1, mkU32(0));
4572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 2) != 0) {
4574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b2, unop(Iop_8Uto32, get_gpr_b6(r1)));
4575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c2, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
4577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b2, mkU32(0));
4580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c2, mkU32(0));
4581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 1) != 0) {
4583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b3, unop(Iop_8Uto32, get_gpr_b7(r1)));
4584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c3, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
4586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b3, mkU32(0));
4589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c3, mkU32(0));
4590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
4592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(b0), mkU8(24)), binop(Iop_Shl32, mkexpr(b1), mkU8(16))),
4593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Shl32, mkexpr(b2), mkU8(8))), mkexpr(b3)));
4594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
4595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(c0), mkU8(24)), binop(Iop_Shl32, mkexpr(c1), mkU8(16))),
4596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Shl32, mkexpr(c2), mkU8(8))), mkexpr(c3)));
4597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clmy";
4600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLMH(UChar r1, UChar r3, IRTemp op2addr)
4604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b0 = newTemp(Ity_I32);
4608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b1 = newTemp(Ity_I32);
4609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b2 = newTemp(Ity_I32);
4610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b3 = newTemp(Ity_I32);
4611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c0 = newTemp(Ity_I32);
4612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c1 = newTemp(Ity_I32);
4613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c2 = newTemp(Ity_I32);
4614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp c3 = newTemp(Ity_I32);
4615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
4616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
4618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 8) != 0) {
4619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b0, unop(Iop_8Uto32, get_gpr_b0(r1)));
4620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c0, unop(Iop_8Uto32, load(Ity_I8, mkexpr(op2addr))));
4621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b0, mkU32(0));
4624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c0, mkU32(0));
4625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 4) != 0) {
4627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b1, unop(Iop_8Uto32, get_gpr_b1(r1)));
4628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c1, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
4630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b1, mkU32(0));
4633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c1, mkU32(0));
4634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 2) != 0) {
4636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b2, unop(Iop_8Uto32, get_gpr_b2(r1)));
4637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c2, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
4639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b2, mkU32(0));
4642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c2, mkU32(0));
4643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((r3 & 1) != 0) {
4645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b3, unop(Iop_8Uto32, get_gpr_b3(r1)));
4646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c3, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(n)))));
4648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(b3, mkU32(0));
4651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(c3, mkU32(0));
4652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
4654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(b0), mkU8(24)), binop(Iop_Shl32, mkexpr(b1), mkU8(16))),
4655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Shl32, mkexpr(b2), mkU8(8))), mkexpr(b3)));
4656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
4657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(c0), mkU8(24)), binop(Iop_Shl32, mkexpr(c1), mkU8(16))),
4658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Shl32, mkexpr(c2), mkU8(8))), mkexpr(c3)));
4659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clmh";
4662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLHHR(UChar r1, UChar r2)
4666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
4671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r2));
4672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clhhr";
4675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLHLR(UChar r1, UChar r2)
4679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
4684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
4685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clhlr";
4688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLHF(UChar r1, IRTemp op2addr)
4692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
4697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
4698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clhf";
4701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLIH(UChar r1, UInt i2)
4705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
4708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
4710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
4711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I32,
4712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(op2)));
4713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clih";
4715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CPYA(UChar r1, UChar r2)
4719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_ar_w0(r1, get_ar_w0(r2));
4721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
4722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, AR, AR), "cpya", r1, r2);
4723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cpya";
4725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XR(UChar r1, UChar r2)
4729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
4733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r1 == r2) {
4735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(result, mkU32(0));
4736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(op1, get_gpr_w1(r1));
4738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(op2, get_gpr_w1(r2));
4739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(result, binop(Iop_Xor32, mkexpr(op1), mkexpr(op2)));
4740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
4743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xr";
4745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XGR(UChar r1, UChar r2)
4749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
4753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (r1 == r2) {
4755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(result, mkU64(0));
4756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
4757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(op1, get_gpr_dw0(r1));
4758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(op2, get_gpr_dw0(r2));
4759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(result, binop(Iop_Xor64, mkexpr(op1), mkexpr(op2)));
4760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
4763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xgr";
4765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XRK(UChar r3, UChar r1, UChar r2)
4769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
4772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
4773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
4775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
4776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor32, mkexpr(op2), mkexpr(op3)));
4777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
4779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xrk";
4781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XGRK(UChar r3, UChar r1, UChar r2)
4785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
4788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
4789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
4791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
4792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor64, mkexpr(op2), mkexpr(op3)));
4793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
4795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xgrk";
4797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_X(UChar r1, IRTemp op2addr)
4801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
4805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
4808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor32, mkexpr(op1), mkexpr(op2)));
4809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
4811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "x";
4813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XY(UChar r1, IRTemp op2addr)
4817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
4820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
4821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
4824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor32, mkexpr(op1), mkexpr(op2)));
4825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
4827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xy";
4829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XG(UChar r1, IRTemp op2addr)
4833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
4835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
4836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
4837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
4839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
4840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor64, mkexpr(op1), mkexpr(op2)));
4841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
4843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xg";
4845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XI(UChar i2, IRTemp op1addr)
4849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I8);
4851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar op2;
4852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I8);
4853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I8, mkexpr(op1addr)));
4855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
4856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor8, mkexpr(op1), mkU8(op2)));
4857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
4859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xi";
4861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XIY(UChar i2, IRTemp op1addr)
4865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I8);
4867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar op2;
4868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I8);
4869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I8, mkexpr(op1addr)));
4871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
4872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor8, mkexpr(op1), mkU8(op2)));
4873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
4875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xiy";
4877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XIHF(UChar r1, UInt i2)
4881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
4884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
4885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
4887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
4888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor32, mkexpr(op1), mkU32(op2)));
4889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
4891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xihf";
4893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XILF(UChar r1, UInt i2)
4897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
4899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
4900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
4901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
4903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
4904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor32, mkexpr(op1), mkU32(op2)));
4905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
4907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xilf";
4909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_EAR(UChar r1, UChar r2)
4913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, get_ar_w0(r2));
4915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
4916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, GPR, AR), "ear", r1, r2);
4917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ear";
4919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_IC(UChar r1, IRTemp op2addr)
4923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b7(r1, load(Ity_I8, mkexpr(op2addr)));
4925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ic";
4927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ICY(UChar r1, IRTemp op2addr)
4931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b7(r1, load(Ity_I8, mkexpr(op2addr)));
4933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "icy";
4935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ICM(UChar r1, UChar r3, IRTemp op2addr)
4939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
4941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
4942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt mask;
4943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
4945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = (UInt)r3;
4946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 8) != 0) {
4947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b4(r1, load(Ity_I8, mkexpr(op2addr)));
4948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 4) != 0) {
4951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b5(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
4952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 2) != 0) {
4956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b6(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
4957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 1) != 0) {
4961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b7(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
4962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, get_gpr_w1(r1));
4966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_INSERT_CHAR_MASK_32, result, mktemp(Ity_I32,
4967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(mask)));
4968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "icm";
4970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
4971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
4973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ICMY(UChar r1, UChar r3, IRTemp op2addr)
4974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
4975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
4976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
4977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt mask;
4978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
4980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = (UInt)r3;
4981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 8) != 0) {
4982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b4(r1, load(Ity_I8, mkexpr(op2addr)));
4983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 4) != 0) {
4986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b5(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
4987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 2) != 0) {
4991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b6(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
4992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
4995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 1) != 0) {
4996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b7(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
4997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
4999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, get_gpr_w1(r1));
5001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_INSERT_CHAR_MASK_32, result, mktemp(Ity_I32,
5002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(mask)));
5003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "icmy";
5005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ICMH(UChar r1, UChar r3, IRTemp op2addr)
5009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
5011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt mask;
5013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
5015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = (UInt)r3;
5016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 8) != 0) {
5017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b0(r1, load(Ity_I8, mkexpr(op2addr)));
5018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 4) != 0) {
5021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b1(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
5022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 2) != 0) {
5026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b2(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
5027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 1) != 0) {
5031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_b3(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
5032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
5034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
5035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, get_gpr_w0(r1));
5036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_INSERT_CHAR_MASK_32, result, mktemp(Ity_I32,
5037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(mask)));
5038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "icmh";
5040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_IIHF(UChar r1, UInt i2)
5044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkU32(i2));
5046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "iihf";
5048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_IIHH(UChar r1, UShort i2)
5052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw0(r1, mkU16(i2));
5054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "iihh";
5056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_IIHL(UChar r1, UShort i2)
5060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw1(r1, mkU16(i2));
5062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "iihl";
5064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_IILF(UChar r1, UInt i2)
5068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkU32(i2));
5070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "iilf";
5072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_IILH(UChar r1, UShort i2)
5076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw2(r1, mkU16(i2));
5078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "iilh";
5080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_IILL(UChar r1, UShort i2)
5084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw3(r1, mkU16(i2));
5086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "iill";
5088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LR(UChar r1, UChar r2)
5092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, get_gpr_w1(r2));
5094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lr";
5096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGR(UChar r1, UChar r2)
5100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, get_gpr_dw0(r2));
5102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgr";
5104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGFR(UChar r1, UChar r2)
5108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_32Sto64, get_gpr_w1(r2)));
5110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgfr";
5112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_L(UChar r1, IRTemp op2addr)
5116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, load(Ity_I32, mkexpr(op2addr)));
5118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "l";
5120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LY(UChar r1, IRTemp op2addr)
5124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, load(Ity_I32, mkexpr(op2addr)));
5126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ly";
5128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LG(UChar r1, IRTemp op2addr)
5132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, load(Ity_I64, mkexpr(op2addr)));
5134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lg";
5136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGF(UChar r1, IRTemp op2addr)
5140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
5142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgf";
5144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGFI(UChar r1, UInt i2)
5148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64((ULong)(Long)(Int)i2));
5150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgfi";
5152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LRL(UChar r1, UInt i2)
5156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, load(Ity_I32, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
5158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              i2 << 1))));
5159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lrl";
5161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGRL(UChar r1, UInt i2)
5165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, load(Ity_I64, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
5167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               i2 << 1))));
5168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgrl";
5170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGFRL(UChar r1, UInt i2)
5174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_32Sto64, load(Ity_I32, mkU64(guest_IA_curr_instr +
5176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               ((ULong)(Long)(Int)i2 << 1)))));
5177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgfrl";
5179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LA(UChar r1, IRTemp op2addr)
5183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2addr));
5185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "la";
5187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAY(UChar r1, IRTemp op2addr)
5191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2addr));
5193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lay";
5195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAE(UChar r1, IRTemp op2addr)
5199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2addr));
5201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lae";
5203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAEY(UChar r1, IRTemp op2addr)
5207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2addr));
5209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "laey";
5211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LARL(UChar r1, UInt i2)
5215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1)));
5217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "larl";
5219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAA(UChar r1, UChar r3, IRTemp op2addr)
5223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
5226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
5229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
5230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
5231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op2, op3);
5232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), mkexpr(result));
5233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(op2));
5234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "laa";
5236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAAG(UChar r1, UChar r3, IRTemp op2addr)
5240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
5243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
5244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
5246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
5247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op2), mkexpr(op3)));
5248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op2, op3);
5249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), mkexpr(result));
5250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2));
5251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "laag";
5253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAAL(UChar r1, UChar r3, IRTemp op2addr)
5257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
5260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
5263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
5264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
5265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op2, op3);
5266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), mkexpr(result));
5267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(op2));
5268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "laal";
5270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAALG(UChar r1, UChar r3, IRTemp op2addr)
5274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
5277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
5278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
5280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
5281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add64, mkexpr(op2), mkexpr(op3)));
5282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op2, op3);
5283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), mkexpr(result));
5284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2));
5285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "laalg";
5287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAN(UChar r1, UChar r3, IRTemp op2addr)
5291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
5294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
5297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
5298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And32, mkexpr(op2), mkexpr(op3)));
5299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), mkexpr(result));
5301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(op2));
5302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lan";
5304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LANG(UChar r1, UChar r3, IRTemp op2addr)
5308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
5311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
5312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
5314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
5315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And64, mkexpr(op2), mkexpr(op3)));
5316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), mkexpr(result));
5318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2));
5319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lang";
5321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAX(UChar r1, UChar r3, IRTemp op2addr)
5325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
5328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
5331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
5332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor32, mkexpr(op2), mkexpr(op3)));
5333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), mkexpr(result));
5335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(op2));
5336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lax";
5338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAXG(UChar r1, UChar r3, IRTemp op2addr)
5342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
5345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
5346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
5348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
5349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Xor64, mkexpr(op2), mkexpr(op3)));
5350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), mkexpr(result));
5352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2));
5353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "laxg";
5355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAO(UChar r1, UChar r3, IRTemp op2addr)
5359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
5362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
5365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
5366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or32, mkexpr(op2), mkexpr(op3)));
5367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), mkexpr(result));
5369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(op2));
5370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lao";
5372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAOG(UChar r1, UChar r3, IRTemp op2addr)
5376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
5379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
5380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
5382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
5383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or64, mkexpr(op2), mkexpr(op3)));
5384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), mkexpr(result));
5386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2));
5387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "laog";
5389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LTR(UChar r1, UChar r2)
5393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
5397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(op2));
5398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ltr";
5401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LTGR(UChar r1, UChar r2)
5405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
5409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2));
5410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ltgr";
5413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LTGFR(UChar r1, UChar r2)
5417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
5421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2));
5422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ltgfr";
5425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LT(UChar r1, IRTemp op2addr)
5429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
5433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(op2));
5434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lt";
5437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LTG(UChar r1, IRTemp op2addr)
5441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
5445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2));
5446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ltg";
5449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LTGF(UChar r1, IRTemp op2addr)
5453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
5457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(op2));
5458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ltgf";
5461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LBR(UChar r1, UChar r2)
5465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_8Sto32, get_gpr_b7(r2)));
5467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lbr";
5469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGBR(UChar r1, UChar r2)
5473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_8Sto64, get_gpr_b7(r2)));
5475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgbr";
5477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LB(UChar r1, IRTemp op2addr)
5481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_8Sto32, load(Ity_I8, mkexpr(op2addr))));
5483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lb";
5485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGB(UChar r1, IRTemp op2addr)
5489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_8Sto64, load(Ity_I8, mkexpr(op2addr))));
5491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgb";
5493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LBH(UChar r1, IRTemp op2addr)
5497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, unop(Iop_8Sto32, load(Ity_I8, mkexpr(op2addr))));
5499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lbh";
5501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LCR(UChar r1, UChar r2)
5505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op1;
5507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op1 = 0;
5511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
5512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkU32((UInt)op1), mkexpr(op2)));
5513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
5514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, mktemp(Ity_I32, mkU32((UInt)
5515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       op1)), op2);
5516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lcr";
5518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LCGR(UChar r1, UChar r2)
5522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op1;
5524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
5526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op1 = 0ULL;
5528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
5529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkU64((ULong)op1), mkexpr(op2)));
5530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
5531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, mktemp(Ity_I64, mkU64((ULong)
5532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       op1)), op2);
5533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lcgr";
5535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LCGFR(UChar r1, UChar r2)
5539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long op1;
5541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
5543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op1 = 0ULL;
5545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
5546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkU64((ULong)op1), mkexpr(op2)));
5547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
5548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, mktemp(Ity_I64, mkU64((ULong)
5549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       op1)), op2);
5550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lcgfr";
5552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LHR(UChar r1, UChar r2)
5556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_16Sto32, get_gpr_hw3(r2)));
5558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lhr";
5560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGHR(UChar r1, UChar r2)
5564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_16Sto64, get_gpr_hw3(r2)));
5566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lghr";
5568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LH(UChar r1, IRTemp op2addr)
5572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
5574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lh";
5576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LHY(UChar r1, IRTemp op2addr)
5580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
5582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lhy";
5584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGH(UChar r1, IRTemp op2addr)
5588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_16Sto64, load(Ity_I16, mkexpr(op2addr))));
5590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgh";
5592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LHI(UChar r1, UShort i2)
5596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkU32((UInt)(Int)(Short)i2));
5598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lhi";
5600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGHI(UChar r1, UShort i2)
5604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64((ULong)(Long)(Short)i2));
5606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lghi";
5608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LHRL(UChar r1, UInt i2)
5612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_16Sto32, load(Ity_I16, mkU64(guest_IA_curr_instr +
5614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              ((ULong)(Long)(Int)i2 << 1)))));
5615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lhrl";
5617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGHRL(UChar r1, UInt i2)
5621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_16Sto64, load(Ity_I16, mkU64(guest_IA_curr_instr +
5623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               ((ULong)(Long)(Int)i2 << 1)))));
5624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lghrl";
5626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LHH(UChar r1, IRTemp op2addr)
5630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
5632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lhh";
5634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LFH(UChar r1, IRTemp op2addr)
5638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, load(Ity_I32, mkexpr(op2addr)));
5640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lfh";
5642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGFR(UChar r1, UChar r2)
5646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_32Uto64, get_gpr_w1(r2)));
5648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llgfr";
5650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGF(UChar r1, IRTemp op2addr)
5654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_32Uto64, load(Ity_I32, mkexpr(op2addr))));
5656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llgf";
5658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGFRL(UChar r1, UInt i2)
5662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_32Uto64, load(Ity_I32, mkU64(guest_IA_curr_instr +
5664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               ((ULong)(Long)(Int)i2 << 1)))));
5665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llgfrl";
5667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLCR(UChar r1, UChar r2)
5671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_8Uto32, get_gpr_b7(r2)));
5673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llcr";
5675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGCR(UChar r1, UChar r2)
5679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_8Uto64, get_gpr_b7(r2)));
5681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llgcr";
5683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLC(UChar r1, IRTemp op2addr)
5687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_8Uto32, load(Ity_I8, mkexpr(op2addr))));
5689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llc";
5691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGC(UChar r1, IRTemp op2addr)
5695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_8Uto64, load(Ity_I8, mkexpr(op2addr))));
5697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llgc";
5699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLCH(UChar r1, IRTemp op2addr)
5703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, unop(Iop_8Uto32, load(Ity_I8, mkexpr(op2addr))));
5705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llch";
5707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLHR(UChar r1, UChar r2)
5711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_16Uto32, get_gpr_hw3(r2)));
5713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llhr";
5715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGHR(UChar r1, UChar r2)
5719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_16Uto64, get_gpr_hw3(r2)));
5721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llghr";
5723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLH(UChar r1, IRTemp op2addr)
5727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_16Uto32, load(Ity_I16, mkexpr(op2addr))));
5729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llh";
5731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGH(UChar r1, IRTemp op2addr)
5735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_16Uto64, load(Ity_I16, mkexpr(op2addr))));
5737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llgh";
5739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLHRL(UChar r1, UInt i2)
5743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_16Uto32, load(Ity_I16, mkU64(guest_IA_curr_instr +
5745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              ((ULong)(Long)(Int)i2 << 1)))));
5746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llhrl";
5748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGHRL(UChar r1, UInt i2)
5752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_16Uto64, load(Ity_I16, mkU64(guest_IA_curr_instr +
5754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               ((ULong)(Long)(Int)i2 << 1)))));
5755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llghrl";
5757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLHH(UChar r1, IRTemp op2addr)
5761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, unop(Iop_16Uto32, load(Ity_I16, mkexpr(op2addr))));
5763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llhh";
5765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLIHF(UChar r1, UInt i2)
5769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(((ULong)i2) << 32));
5771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llihf";
5773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLIHH(UChar r1, UShort i2)
5777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(((ULong)i2) << 48));
5779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llihh";
5781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLIHL(UChar r1, UShort i2)
5785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(((ULong)i2) << 32));
5787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llihl";
5789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLILF(UChar r1, UInt i2)
5793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(i2));
5795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llilf";
5797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLILH(UChar r1, UShort i2)
5801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(((ULong)i2) << 16));
5803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llilh";
5805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLILL(UChar r1, UShort i2)
5809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkU64(i2));
5811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llill";
5813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGTR(UChar r1, UChar r2)
5817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_32Uto64, binop(Iop_And32, get_gpr_w1(r2),
5819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkU32(2147483647))));
5820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llgtr";
5822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LLGT(UChar r1, IRTemp op2addr)
5826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_32Uto64, binop(Iop_And32, load(Ity_I32,
5828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkexpr(op2addr)), mkU32(2147483647))));
5829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "llgt";
5831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LNR(UChar r1, UChar r2)
5835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
5840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, mkite(binop(Iop_CmpLE32S, mkexpr(op2), mkU32(0)), mkexpr(op2),
5841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Sub32, mkU32(0), mkexpr(op2))));
5842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
5843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_BITWISE, result);
5844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lnr";
5846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LNGR(UChar r1, UChar r2)
5850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
5853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
5855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, mkite(binop(Iop_CmpLE64S, mkexpr(op2), mkU64(0)), mkexpr(op2),
5856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Sub64, mkU64(0), mkexpr(op2))));
5857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
5858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_BITWISE, result);
5859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lngr";
5861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LNGFR(UChar r1, UChar r2 __attribute__((unused)))
5865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
5868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, get_gpr_w1(r1)));
5870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, mkite(binop(Iop_CmpLE64S, mkexpr(op2), mkU64(0)), mkexpr(op2),
5871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Sub64, mkU64(0), mkexpr(op2))));
5872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
5873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_BITWISE, result);
5874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lngfr";
5876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LOCR(UChar m3, UChar r1, UChar r2)
5880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ32, s390_call_calculate_cond(m3), mkU32(0)));
5882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, get_gpr_w1(r2));
5883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "locr";
5885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LOCGR(UChar m3, UChar r1, UChar r2)
5889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ32, s390_call_calculate_cond(m3), mkU32(0)));
5891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, get_gpr_dw0(r2));
5892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "locgr";
5894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LOC(UChar r1, IRTemp op2addr)
5898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* condition is checked in format handler */
5900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, load(Ity_I32, mkexpr(op2addr)));
5901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "loc";
5903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LOCG(UChar r1, IRTemp op2addr)
5907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* condition is checked in format handler */
5909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, load(Ity_I64, mkexpr(op2addr)));
5910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "locg";
5912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LPQ(UChar r1, IRTemp op2addr)
5916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, load(Ity_I64, mkexpr(op2addr)));
5918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1 + 1, load(Ity_I64, binop(Iop_Add64, mkexpr(op2addr), mkU64(8))
5919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               ));
5920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lpq";
5922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LPR(UChar r1, UChar r2)
5926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
5928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
5929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
5931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, mkite(binop(Iop_CmpLT32S, mkexpr(op2), mkU32(0)),
5932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Sub32, mkU32(0), mkexpr(op2)), mkexpr(op2)));
5933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
5934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_POSITIVE_32, op2);
5935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lpr";
5937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LPGR(UChar r1, UChar r2)
5941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
5944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
5946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, mkite(binop(Iop_CmpLT64S, mkexpr(op2), mkU64(0)),
5947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Sub64, mkU64(0), mkexpr(op2)), mkexpr(op2)));
5948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
5949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_POSITIVE_64, op2);
5950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lpgr";
5952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LPGFR(UChar r1, UChar r2)
5956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
5958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
5959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
5961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, mkite(binop(Iop_CmpLT64S, mkexpr(op2), mkU64(0)),
5962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Sub64, mkU64(0), mkexpr(op2)), mkexpr(op2)));
5963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
5964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_POSITIVE_64, op2);
5965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lpgfr";
5967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LRVR(UChar r1, UChar r2)
5971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b0 = newTemp(Ity_I8);
5973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b1 = newTemp(Ity_I8);
5974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b2 = newTemp(Ity_I8);
5975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b3 = newTemp(Ity_I8);
5976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b3, get_gpr_b7(r2));
5978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b2, get_gpr_b6(r2));
5979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b1, get_gpr_b5(r2));
5980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b0, get_gpr_b4(r2));
5981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b4(r1, mkexpr(b3));
5982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b5(r1, mkexpr(b2));
5983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b6(r1, mkexpr(b1));
5984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b7(r1, mkexpr(b0));
5985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lrvr";
5987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
5988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
5990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LRVGR(UChar r1, UChar r2)
5991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
5992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b0 = newTemp(Ity_I8);
5993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b1 = newTemp(Ity_I8);
5994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b2 = newTemp(Ity_I8);
5995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b3 = newTemp(Ity_I8);
5996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b4 = newTemp(Ity_I8);
5997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b5 = newTemp(Ity_I8);
5998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b6 = newTemp(Ity_I8);
5999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b7 = newTemp(Ity_I8);
6000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b7, get_gpr_b7(r2));
6002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b6, get_gpr_b6(r2));
6003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b5, get_gpr_b5(r2));
6004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b4, get_gpr_b4(r2));
6005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b3, get_gpr_b3(r2));
6006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b2, get_gpr_b2(r2));
6007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b1, get_gpr_b1(r2));
6008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b0, get_gpr_b0(r2));
6009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b0(r1, mkexpr(b7));
6010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b1(r1, mkexpr(b6));
6011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b2(r1, mkexpr(b5));
6012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b3(r1, mkexpr(b4));
6013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b4(r1, mkexpr(b3));
6014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b5(r1, mkexpr(b2));
6015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b6(r1, mkexpr(b1));
6016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b7(r1, mkexpr(b0));
6017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lrvgr";
6019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LRVH(UChar r1, IRTemp op2addr)
6023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I16);
6025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I16, mkexpr(op2addr)));
6027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b6(r1, unop(Iop_16to8, mkexpr(op2)));
6028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b7(r1, unop(Iop_16HIto8, mkexpr(op2)));
6029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lrvh";
6031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LRV(UChar r1, IRTemp op2addr)
6035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b4(r1, unop(Iop_32to8, binop(Iop_And32, mkexpr(op2), mkU32(255))));
6040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b5(r1, unop(Iop_32to8, binop(Iop_And32, binop(Iop_Shr32, mkexpr(op2),
6041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(8)), mkU32(255))));
6042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b6(r1, unop(Iop_32to8, binop(Iop_And32, binop(Iop_Shr32, mkexpr(op2),
6043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(16)), mkU32(255))));
6044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b7(r1, unop(Iop_32to8, binop(Iop_And32, binop(Iop_Shr32, mkexpr(op2),
6045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(24)), mkU32(255))));
6046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lrv";
6048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LRVG(UChar r1, IRTemp op2addr)
6052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
6056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b0(r1, unop(Iop_64to8, binop(Iop_And64, mkexpr(op2), mkU64(255))));
6057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b1(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
6058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(8)), mkU64(255))));
6059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b2(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
6060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(16)), mkU64(255))));
6061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b3(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
6062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(24)), mkU64(255))));
6063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b4(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
6064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(32)), mkU64(255))));
6065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b5(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
6066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(40)), mkU64(255))));
6067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b6(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
6068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(48)), mkU64(255))));
6069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b7(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
6070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkU8(56)), mkU64(255))));
6071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lrvg";
6073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVHHI(UShort i2, IRTemp op1addr)
6077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkU16(i2));
6079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mvhhi";
6081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVHI(UShort i2, IRTemp op1addr)
6085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkU32((UInt)(Int)(Short)i2));
6087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mvhi";
6089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVGHI(UShort i2, IRTemp op1addr)
6093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkU64((ULong)(Long)(Short)i2));
6095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mvghi";
6097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVI(UChar i2, IRTemp op1addr)
6101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkU8(i2));
6103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mvi";
6105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVIY(UChar i2, IRTemp op1addr)
6109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkU8(i2));
6111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mviy";
6113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MR(UChar r1, UChar r2)
6117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1 + 1));
6123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
6124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mr";
6129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_M(UChar r1, IRTemp op2addr)
6133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1 + 1));
6139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "m";
6145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MFY(UChar r1, IRTemp op2addr)
6149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1 + 1));
6155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mfy";
6161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MH(UChar r1, IRTemp op2addr)
6165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I16);
6168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I16, mkexpr(op2addr)));
6172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), unop(Iop_16Sto32, mkexpr(op2))
6173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ));
6174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mh";
6177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MHY(UChar r1, IRTemp op2addr)
6181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I16);
6184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I16, mkexpr(op2addr)));
6188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), unop(Iop_16Sto32, mkexpr(op2))
6189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ));
6190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mhy";
6193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MHI(UChar r1, UShort i2)
6197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Short op2;
6200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Short)i2;
6204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), unop(Iop_16Sto32,
6205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU16((UShort)op2))));
6206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mhi";
6209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MGHI(UChar r1, UShort i2)
6213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Short op2;
6216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
6217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
6219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Short)i2;
6220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS64, mkexpr(op1), unop(Iop_16Sto64,
6221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU16((UShort)op2))));
6222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mghi";
6225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MLR(UChar r1, UChar r2)
6229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1 + 1));
6235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
6236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullU32, mkexpr(op1), mkexpr(op2)));
6237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mlr";
6241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MLGR(UChar r1, UChar r2)
6245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
6249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1 + 1));
6251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
6252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullU64, mkexpr(op1), mkexpr(op2)));
6253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128HIto64, mkexpr(result)));
6254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1 + 1, unop(Iop_128to64, mkexpr(result)));
6255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mlgr";
6257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ML(UChar r1, IRTemp op2addr)
6261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1 + 1));
6267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullU32, mkexpr(op1), mkexpr(op2)));
6269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ml";
6273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MLG(UChar r1, IRTemp op2addr)
6277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
6281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1 + 1));
6283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
6284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullU64, mkexpr(op1), mkexpr(op2)));
6285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128HIto64, mkexpr(result)));
6286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1 + 1, unop(Iop_128to64, mkexpr(result)));
6287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mlg";
6289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSR(UChar r1, UChar r2)
6293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
6300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msr";
6304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSGR(UChar r1, UChar r2)
6308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
6312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
6314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
6315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS64, mkexpr(op1), mkexpr(op2)));
6316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msgr";
6319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSGFR(UChar r1, UChar r2)
6323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
6327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
6329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
6330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS64, mkexpr(op1), unop(Iop_32Sto64, mkexpr(op2))
6331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ));
6332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msgfr";
6335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MS(UChar r1, IRTemp op2addr)
6339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ms";
6350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSY(UChar r1, IRTemp op2addr)
6354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msy";
6365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSG(UChar r1, IRTemp op2addr)
6369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
6373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
6375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
6376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS64, mkexpr(op1), mkexpr(op2)));
6377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msg";
6380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSGF(UChar r1, IRTemp op2addr)
6384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
6388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
6390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS64, mkexpr(op1), unop(Iop_32Sto64, mkexpr(op2))
6392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ));
6393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msgf";
6396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSFI(UChar r1, UInt i2)
6400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
6403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)i2;
6407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS32, mkexpr(op1), mkU32((UInt)op2)));
6408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msfi";
6411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSGFI(UChar r1, UInt i2)
6415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Int op2;
6418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
6419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
6421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (Int)i2;
6422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_MullS64, mkexpr(op1), unop(Iop_32Sto64, mkU32((UInt)
6423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          op2))));
6424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msgfi";
6427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OR(UChar r1, UChar r2)
6431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
6435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
6438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or32, mkexpr(op1), mkexpr(op2)));
6439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
6441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "or";
6443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OGR(UChar r1, UChar r2)
6447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
6453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
6454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or64, mkexpr(op1), mkexpr(op2)));
6455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
6457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ogr";
6459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ORK(UChar r3, UChar r1, UChar r2)
6463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
6466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
6467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
6469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
6470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or32, mkexpr(op2), mkexpr(op3)));
6471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
6473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ork";
6475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OGRK(UChar r3, UChar r1, UChar r2)
6479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
6482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
6485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
6486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or64, mkexpr(op2), mkexpr(op3)));
6487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
6489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ogrk";
6491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_O(UChar r1, IRTemp op2addr)
6495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
6499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or32, mkexpr(op1), mkexpr(op2)));
6503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
6505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "o";
6507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OY(UChar r1, IRTemp op2addr)
6511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
6514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
6515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
6518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or32, mkexpr(op1), mkexpr(op2)));
6519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
6521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oy";
6523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OG(UChar r1, IRTemp op2addr)
6527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
6529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
6533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
6534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or64, mkexpr(op1), mkexpr(op2)));
6535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
6537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "og";
6539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OI(UChar i2, IRTemp op1addr)
6543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I8);
6545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar op2;
6546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I8);
6547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I8, mkexpr(op1addr)));
6549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
6550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or8, mkexpr(op1), mkU8(op2)));
6551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
6553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oi";
6555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OIY(UChar i2, IRTemp op1addr)
6559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I8);
6561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar op2;
6562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I8);
6563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, load(Ity_I8, mkexpr(op1addr)));
6565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
6566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or8, mkexpr(op1), mkU8(op2)));
6567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op1addr), mkexpr(result));
6569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oiy";
6571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OIHF(UChar r1, UInt i2)
6575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
6578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
6579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w0(r1));
6581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
6582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or32, mkexpr(op1), mkU32(op2)));
6583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
6585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oihf";
6587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OIHH(UChar r1, UShort i2)
6591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
6593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
6594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I16);
6595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_hw0(r1));
6597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
6598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or16, mkexpr(op1), mkU16(op2)));
6599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw0(r1, mkexpr(result));
6601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oihh";
6603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OIHL(UChar r1, UShort i2)
6607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
6609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
6610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I16);
6611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_hw1(r1));
6613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
6614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or16, mkexpr(op1), mkU16(op2)));
6615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw1(r1, mkexpr(result));
6617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oihl";
6619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OILF(UChar r1, UInt i2)
6623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
6625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
6626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
6627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
6629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
6630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or32, mkexpr(op1), mkU32(op2)));
6631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
6633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oilf";
6635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OILH(UChar r1, UShort i2)
6639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
6641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
6642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I16);
6643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_hw2(r1));
6645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
6646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or16, mkexpr(op1), mkU16(op2)));
6647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw2(r1, mkexpr(result));
6649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oilh";
6651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OILL(UChar r1, UShort i2)
6655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I16);
6657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort op2;
6658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I16);
6659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_hw3(r1));
6661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
6662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or16, mkexpr(op1), mkU16(op2)));
6663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_hw3(r1, mkexpr(result));
6665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oill";
6667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_PFD(void)
6671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "pfd";
6674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_PFDRL(void)
6678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "pfdrl";
6681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_RLL(UChar r1, UChar r3, IRTemp op2addr)
6685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp amount = newTemp(Ity_I64);
6687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I32);
6688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(amount, binop(Iop_And64, mkexpr(op2addr), mkU64(31)));
6690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_w1(r3));
6691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Or32, binop(Iop_Shl32, mkexpr(op), unop(Iop_64to8,
6692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkexpr(amount))), binop(Iop_Shr32, mkexpr(op), unop(Iop_64to8,
6693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              binop(Iop_Sub64, mkU64(32), mkexpr(amount))))));
6694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "rll";
6696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_RLLG(UChar r1, UChar r3, IRTemp op2addr)
6700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp amount = newTemp(Ity_I64);
6702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I64);
6703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(amount, binop(Iop_And64, mkexpr(op2addr), mkU64(63)));
6705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_dw0(r3));
6706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Or64, binop(Iop_Shl64, mkexpr(op), unop(Iop_64to8,
6707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkexpr(amount))), binop(Iop_Shr64, mkexpr(op), unop(Iop_64to8,
6708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               binop(Iop_Sub64, mkU64(64), mkexpr(amount))))));
6709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "rllg";
6711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_RNSBG(UChar r1, UChar r2, UChar i3, UChar i4, UChar i5)
6715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar from;
6717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar to;
6718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar rot;
6719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar t_bit;
6720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong mask;
6721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong maskc;
6722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   from = i3 & 63;
6726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   to = i4 & 63;
6727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   rot = i5 & 63;
6728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   t_bit = i3 & 128;
6729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, rot == 0 ? get_gpr_dw0(r2) : binop(Iop_Or64, binop(Iop_Shl64,
6730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          get_gpr_dw0(r2), mkU8(rot)), binop(Iop_Shr64, get_gpr_dw0(r2),
6731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(64 - rot))));
6732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (from <= to) {
6733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = ~0ULL;
6734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = (mask >> from) & (mask << (63 - to));
6735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = ~mask;
6736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
6737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = ~0ULL;
6738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = (maskc >> (to + 1)) & (maskc << (64 - from));
6739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = ~maskc;
6740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
6741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And64, binop(Iop_And64, get_gpr_dw0(r1), mkexpr(op2)
6742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ), mkU64(mask)));
6743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (t_bit == 0) {
6744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_dw0(r1, binop(Iop_Or64, binop(Iop_And64, get_gpr_dw0(r1),
6745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  mkU64(maskc)), mkexpr(result)));
6746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
6747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "rnsbg";
6750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_RXSBG(UChar r1, UChar r2, UChar i3, UChar i4, UChar i5)
6754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar from;
6756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar to;
6757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar rot;
6758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar t_bit;
6759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong mask;
6760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong maskc;
6761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   from = i3 & 63;
6765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   to = i4 & 63;
6766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   rot = i5 & 63;
6767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   t_bit = i3 & 128;
6768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, rot == 0 ? get_gpr_dw0(r2) : binop(Iop_Or64, binop(Iop_Shl64,
6769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          get_gpr_dw0(r2), mkU8(rot)), binop(Iop_Shr64, get_gpr_dw0(r2),
6770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(64 - rot))));
6771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (from <= to) {
6772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = ~0ULL;
6773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = (mask >> from) & (mask << (63 - to));
6774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = ~mask;
6775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
6776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = ~0ULL;
6777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = (maskc >> (to + 1)) & (maskc << (64 - from));
6778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = ~maskc;
6779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
6780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And64, binop(Iop_Xor64, get_gpr_dw0(r1), mkexpr(op2)
6781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ), mkU64(mask)));
6782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (t_bit == 0) {
6783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_dw0(r1, binop(Iop_Or64, binop(Iop_And64, get_gpr_dw0(r1),
6784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  mkU64(maskc)), mkexpr(result)));
6785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
6786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "rxsbg";
6789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ROSBG(UChar r1, UChar r2, UChar i3, UChar i4, UChar i5)
6793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar from;
6795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar to;
6796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar rot;
6797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar t_bit;
6798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong mask;
6799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong maskc;
6800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   from = i3 & 63;
6804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   to = i4 & 63;
6805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   rot = i5 & 63;
6806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   t_bit = i3 & 128;
6807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, rot == 0 ? get_gpr_dw0(r2) : binop(Iop_Or64, binop(Iop_Shl64,
6808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          get_gpr_dw0(r2), mkU8(rot)), binop(Iop_Shr64, get_gpr_dw0(r2),
6809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(64 - rot))));
6810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (from <= to) {
6811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = ~0ULL;
6812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = (mask >> from) & (mask << (63 - to));
6813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = ~mask;
6814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
6815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = ~0ULL;
6816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = (maskc >> (to + 1)) & (maskc << (64 - from));
6817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = ~maskc;
6818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
6819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_And64, binop(Iop_Or64, get_gpr_dw0(r1), mkexpr(op2)
6820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ), mkU64(mask)));
6821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (t_bit == 0) {
6822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_dw0(r1, binop(Iop_Or64, binop(Iop_And64, get_gpr_dw0(r1),
6823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  mkU64(maskc)), mkexpr(result)));
6824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
6825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "rosbg";
6828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_RISBG(UChar r1, UChar r2, UChar i3, UChar i4, UChar i5)
6832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar from;
6834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar to;
6835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar rot;
6836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar z_bit;
6837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong mask;
6838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong maskc;
6839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
6840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   from = i3 & 63;
6843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   to = i4 & 63;
6844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   rot = i5 & 63;
6845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   z_bit = i4 & 128;
6846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, rot == 0 ? get_gpr_dw0(r2) : binop(Iop_Or64, binop(Iop_Shl64,
6847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          get_gpr_dw0(r2), mkU8(rot)), binop(Iop_Shr64, get_gpr_dw0(r2),
6848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(64 - rot))));
6849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (from <= to) {
6850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = ~0ULL;
6851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = (mask >> from) & (mask << (63 - to));
6852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = ~mask;
6853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
6854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = ~0ULL;
6855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      maskc = (maskc >> (to + 1)) & (maskc << (64 - from));
6856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask = ~maskc;
6857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
6858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (z_bit == 0) {
6859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_dw0(r1, binop(Iop_Or64, binop(Iop_And64, get_gpr_dw0(r1),
6860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  mkU64(maskc)), binop(Iop_And64, mkexpr(op2), mkU64(mask))));
6861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
6862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_dw0(r1, binop(Iop_And64, mkexpr(op2), mkU64(mask)));
6863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
6864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, get_gpr_dw0(r1));
6865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
6866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "risbg";
6868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SAR(UChar r1, UChar r2)
6872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_ar_w0(r1, get_gpr_w1(r2));
6874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
6875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, AR, GPR), "sar", r1, r2);
6876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sar";
6878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLDA(UChar r1, IRTemp op2addr)
6882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp p1 = newTemp(Ity_I64);
6884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp p2 = newTemp(Ity_I64);
6885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I64);
6886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ULong sign_mask;
6888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp shift_amount = newTemp(Ity_I64);
6889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(p1, unop(Iop_32Uto64, get_gpr_w1(r1)));
6891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(p2, unop(Iop_32Uto64, get_gpr_w1(r1 + 1)));
6892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, binop(Iop_Or64, binop(Iop_Shl64, mkexpr(p1), mkU8(32)), mkexpr(p2)
6893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ));
6894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   sign_mask = 1ULL << 63;
6895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(shift_amount, binop(Iop_And64, mkexpr(op2addr), mkU64(63)));
6896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or64, binop(Iop_And64, binop(Iop_Shl64, mkexpr(op),
6897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          unop(Iop_64to8, mkexpr(shift_amount))), mkU64(~sign_mask)),
6898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          binop(Iop_And64, mkexpr(op), mkU64(sign_mask))));
6899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_SHIFT_LEFT_64, op, shift_amount);
6902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slda";
6904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLDL(UChar r1, IRTemp op2addr)
6908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp p1 = newTemp(Ity_I64);
6910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp p2 = newTemp(Ity_I64);
6911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(p1, unop(Iop_32Uto64, get_gpr_w1(r1)));
6914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(p2, unop(Iop_32Uto64, get_gpr_w1(r1 + 1)));
6915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Shl64, binop(Iop_Or64, binop(Iop_Shl64, mkexpr(p1),
6916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(32)), mkexpr(p2)), unop(Iop_64to8, binop(Iop_And64,
6917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2addr), mkU64(63)))));
6918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sldl";
6922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLA(UChar r1, IRTemp op2addr)
6926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp uop = newTemp(Ity_I32);
6928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
6929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt sign_mask;
6930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp shift_amount = newTemp(Ity_I64);
6931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I32);
6932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_w1(r1));
6934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(uop, get_gpr_w1(r1));
6935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   sign_mask = 2147483648U;
6936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(shift_amount, binop(Iop_And64, mkexpr(op2addr), mkU64(63)));
6937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or32, binop(Iop_And32, binop(Iop_Shl32, mkexpr(uop),
6938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          unop(Iop_64to8, mkexpr(shift_amount))), mkU32(~sign_mask)),
6939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_And32, mkexpr(uop), mkU32(sign_mask))));
6940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
6941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_SHIFT_LEFT_32, op, shift_amount);
6942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sla";
6944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLAK(UChar r1, UChar r3, IRTemp op2addr)
6948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp uop = newTemp(Ity_I32);
6950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
6951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt sign_mask;
6952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp shift_amount = newTemp(Ity_I64);
6953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I32);
6954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_w1(r3));
6956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(uop, get_gpr_w1(r3));
6957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   sign_mask = 2147483648U;
6958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(shift_amount, binop(Iop_And64, mkexpr(op2addr), mkU64(63)));
6959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or32, binop(Iop_And32, binop(Iop_Shl32, mkexpr(uop),
6960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          unop(Iop_64to8, mkexpr(shift_amount))), mkU32(~sign_mask)),
6961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_And32, mkexpr(uop), mkU32(sign_mask))));
6962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
6963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_SHIFT_LEFT_32, op, shift_amount);
6964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slak";
6966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLAG(UChar r1, UChar r3, IRTemp op2addr)
6970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp uop = newTemp(Ity_I64);
6972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
6973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong sign_mask;
6974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp shift_amount = newTemp(Ity_I64);
6975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I64);
6976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_dw0(r3));
6978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(uop, get_gpr_dw0(r3));
6979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   sign_mask = 9223372036854775808ULL;
6980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(shift_amount, binop(Iop_And64, mkexpr(op2addr), mkU64(63)));
6981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Or64, binop(Iop_And64, binop(Iop_Shl64, mkexpr(uop),
6982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          unop(Iop_64to8, mkexpr(shift_amount))), mkU64(~sign_mask)),
6983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_And64, mkexpr(uop), mkU64(sign_mask))));
6984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
6985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_SHIFT_LEFT_64, op, shift_amount);
6986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slag";
6988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
6991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLL(UChar r1, IRTemp op2addr)
6992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
6993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Shl32, get_gpr_w1(r1), unop(Iop_64to8,
6994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              binop(Iop_And64, mkexpr(op2addr), mkU64(63)))));
6995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sll";
6997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
6998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLLK(UChar r1, UChar r3, IRTemp op2addr)
7001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Shl32, get_gpr_w1(r3), unop(Iop_64to8,
7003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              binop(Iop_And64, mkexpr(op2addr), mkU64(63)))));
7004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sllk";
7006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLLG(UChar r1, UChar r3, IRTemp op2addr)
7010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Shl64, get_gpr_dw0(r3), unop(Iop_64to8,
7012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               binop(Iop_And64, mkexpr(op2addr), mkU64(63)))));
7013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sllg";
7015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRDA(UChar r1, IRTemp op2addr)
7019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp p1 = newTemp(Ity_I64);
7021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp p2 = newTemp(Ity_I64);
7022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(p1, unop(Iop_32Uto64, get_gpr_w1(r1)));
7025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(p2, unop(Iop_32Uto64, get_gpr_w1(r1 + 1)));
7026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sar64, binop(Iop_Or64, binop(Iop_Shl64, mkexpr(p1),
7027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(32)), mkexpr(p2)), unop(Iop_64to8, binop(Iop_And64,
7028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2addr), mkU64(63)))));
7029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
7030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
7031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, result);
7032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srda";
7034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRDL(UChar r1, IRTemp op2addr)
7038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp p1 = newTemp(Ity_I64);
7040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp p2 = newTemp(Ity_I64);
7041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(p1, unop(Iop_32Uto64, get_gpr_w1(r1)));
7044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(p2, unop(Iop_32Uto64, get_gpr_w1(r1 + 1)));
7045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Shr64, binop(Iop_Or64, binop(Iop_Shl64, mkexpr(p1),
7046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkU8(32)), mkexpr(p2)), unop(Iop_64to8, binop(Iop_And64,
7047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2addr), mkU64(63)))));
7048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
7049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
7050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srdl";
7052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRA(UChar r1, IRTemp op2addr)
7056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I32);
7059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_w1(r1));
7061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sar32, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
7062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2addr), mkU64(63)))));
7063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, result);
7065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sra";
7067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRAK(UChar r1, UChar r3, IRTemp op2addr)
7071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I32);
7074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_w1(r3));
7076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sar32, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
7077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2addr), mkU64(63)))));
7078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, result);
7080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srak";
7082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRAG(UChar r1, UChar r3, IRTemp op2addr)
7086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I64);
7089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_dw0(r3));
7091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sar64, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
7092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2addr), mkU64(63)))));
7093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
7094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, result);
7095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srag";
7097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRL(UChar r1, IRTemp op2addr)
7101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I32);
7103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_w1(r1));
7105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Shr32, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
7106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkexpr(op2addr), mkU64(63)))));
7107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srl";
7109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRLK(UChar r1, UChar r3, IRTemp op2addr)
7113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I32);
7115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_w1(r3));
7117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, binop(Iop_Shr32, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
7118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkexpr(op2addr), mkU64(63)))));
7119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srlk";
7121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRLG(UChar r1, UChar r3, IRTemp op2addr)
7125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I64);
7127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_gpr_dw0(r3));
7129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Shr64, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
7130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkexpr(op2addr), mkU64(63)))));
7131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srlg";
7133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ST(UChar r1, IRTemp op2addr)
7137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_w1(r1));
7139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "st";
7141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STY(UChar r1, IRTemp op2addr)
7145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_w1(r1));
7147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sty";
7149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STG(UChar r1, IRTemp op2addr)
7153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_dw0(r1));
7155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stg";
7157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STRL(UChar r1, UInt i2)
7161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1)),
7163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         get_gpr_w1(r1));
7164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "strl";
7166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STGRL(UChar r1, UInt i2)
7170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1)),
7172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         get_gpr_dw0(r1));
7173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stgrl";
7175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STC(UChar r1, IRTemp op2addr)
7179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_b7(r1));
7181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stc";
7183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STCY(UChar r1, IRTemp op2addr)
7187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_b7(r1));
7189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stcy";
7191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STCH(UChar r1, IRTemp op2addr)
7195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_b3(r1));
7197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stch";
7199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STCM(UChar r1, UChar r3, IRTemp op2addr)
7203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar mask;
7205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
7206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = (UChar)r3;
7208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
7209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 8) != 0) {
7210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(op2addr), get_gpr_b4(r1));
7211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
7212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 4) != 0) {
7214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b5(r1));
7215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
7216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 2) != 0) {
7218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b6(r1));
7219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
7220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 1) != 0) {
7222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b7(r1));
7223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stcm";
7226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STCMY(UChar r1, UChar r3, IRTemp op2addr)
7230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar mask;
7232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
7233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = (UChar)r3;
7235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
7236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 8) != 0) {
7237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(op2addr), get_gpr_b4(r1));
7238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
7239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 4) != 0) {
7241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b5(r1));
7242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
7243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 2) != 0) {
7245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b6(r1));
7246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
7247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 1) != 0) {
7249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b7(r1));
7250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stcmy";
7253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STCMH(UChar r1, UChar r3, IRTemp op2addr)
7257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar mask;
7259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar n;
7260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = (UChar)r3;
7262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n = 0;
7263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 8) != 0) {
7264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(op2addr), get_gpr_b0(r1));
7265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
7266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 4) != 0) {
7268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b1(r1));
7269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
7270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 2) != 0) {
7272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b2(r1));
7273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n = n + 1;
7274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((mask & 1) != 0) {
7276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b3(r1));
7277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stcmh";
7280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STH(UChar r1, IRTemp op2addr)
7284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_hw3(r1));
7286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sth";
7288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STHY(UChar r1, IRTemp op2addr)
7292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_hw3(r1));
7294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sthy";
7296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STHRL(UChar r1, UInt i2)
7300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1)),
7302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         get_gpr_hw3(r1));
7303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sthrl";
7305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STHH(UChar r1, IRTemp op2addr)
7309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_hw1(r1));
7311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sthh";
7313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STFH(UChar r1, IRTemp op2addr)
7317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_w0(r1));
7319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stfh";
7321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STOC(UChar r1, IRTemp op2addr)
7325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* condition is checked in format handler */
7327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_w1(r1));
7328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stoc";
7330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STOCG(UChar r1, IRTemp op2addr)
7334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* condition is checked in format handler */
7336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_dw0(r1));
7337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stocg";
7339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STPQ(UChar r1, IRTemp op2addr)
7343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_dw0(r1));
7345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(8)), get_gpr_dw0(r1 + 1));
7346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stpq";
7348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STRVH(UChar r1, IRTemp op2addr)
7352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_b7(r1));
7354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(1)), get_gpr_b6(r1));
7355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "strvh";
7357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STRV(UChar r1, IRTemp op2addr)
7361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_b7(r1));
7363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(1)), get_gpr_b6(r1));
7364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(2)), get_gpr_b5(r1));
7365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(3)), get_gpr_b4(r1));
7366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "strv";
7368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STRVG(UChar r1, IRTemp op2addr)
7372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_gpr_b7(r1));
7374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(1)), get_gpr_b6(r1));
7375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(2)), get_gpr_b5(r1));
7376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(3)), get_gpr_b4(r1));
7377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(4)), get_gpr_b3(r1));
7378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(5)), get_gpr_b2(r1));
7379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(6)), get_gpr_b1(r1));
7380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(op2addr), mkU64(7)), get_gpr_b0(r1));
7381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "strvg";
7383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SR(UChar r1, UChar r2)
7387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
7389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
7390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
7393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
7394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
7395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op1, op2);
7396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sr";
7399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SGR(UChar r1, UChar r2)
7403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
7405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
7406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
7409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
7410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
7411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, op1, op2);
7412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
7413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sgr";
7415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SGFR(UChar r1, UChar r2)
7419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
7421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
7422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
7425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
7426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
7427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, op1, op2);
7428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
7429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sgfr";
7431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRK(UChar r3, UChar r1, UChar r2)
7435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
7437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
7438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
7441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
7442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
7443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op2, op3);
7444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srk";
7447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SGRK(UChar r3, UChar r1, UChar r2)
7451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
7453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
7454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
7457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
7458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op2), mkexpr(op3)));
7459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, op2, op3);
7460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
7461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sgrk";
7463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_S(UChar r1, IRTemp op2addr)
7467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
7469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
7470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
7473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
7474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
7475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op1, op2);
7476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "s";
7479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SY(UChar r1, IRTemp op2addr)
7483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
7485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
7486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
7489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
7490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
7491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op1, op2);
7492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sy";
7495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SG(UChar r1, IRTemp op2addr)
7499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
7501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
7502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
7505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
7506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
7507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, op1, op2);
7508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
7509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sg";
7511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SGF(UChar r1, IRTemp op2addr)
7515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
7517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
7518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
7521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
7522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
7523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, op1, op2);
7524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
7525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sgf";
7527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SH(UChar r1, IRTemp op2addr)
7531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
7533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
7534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
7537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
7538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
7539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op1, op2);
7540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sh";
7543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SHY(UChar r1, IRTemp op2addr)
7547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
7549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
7550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
7553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
7554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
7555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op1, op2);
7556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "shy";
7559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SHHHR(UChar r3 __attribute__((unused)), UChar r1, UChar r2)
7563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
7565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
7566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r1));
7569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w0(r2));
7570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
7571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op2, op3);
7572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
7573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "shhhr";
7575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SHHLR(UChar r3 __attribute__((unused)), UChar r1, UChar r2)
7579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
7581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
7582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r1));
7585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r2));
7586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
7587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op2, op3);
7588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
7589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "shhlr";
7591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLR(UChar r1, UChar r2)
7595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
7597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
7598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
7601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
7602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
7603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op1, op2);
7604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slr";
7607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLGR(UChar r1, UChar r2)
7611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
7613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
7614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
7617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
7618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
7619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op1, op2);
7620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
7621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slgr";
7623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLGFR(UChar r1, UChar r2)
7627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
7629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
7630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
7633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Uto64, get_gpr_w1(r2)));
7634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
7635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op1, op2);
7636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
7637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slgfr";
7639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLRK(UChar r3, UChar r1, UChar r2)
7643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
7645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
7646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
7649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
7650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
7651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op2, op3);
7652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slrk";
7655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLGRK(UChar r3, UChar r1, UChar r2)
7659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
7661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
7662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
7665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
7666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op2), mkexpr(op3)));
7667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op2, op3);
7668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
7669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slgrk";
7671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SL(UChar r1, IRTemp op2addr)
7675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
7677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
7678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
7681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
7682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
7683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op1, op2);
7684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sl";
7687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLY(UChar r1, IRTemp op2addr)
7691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
7693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
7694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
7697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
7698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
7699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op1, op2);
7700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sly";
7703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLG(UChar r1, IRTemp op2addr)
7707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
7709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
7710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
7713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
7714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
7715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op1, op2);
7716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
7717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slg";
7719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLGF(UChar r1, IRTemp op2addr)
7723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
7725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
7726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
7729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Uto64, load(Ity_I32, mkexpr(op2addr))));
7730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
7731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op1, op2);
7732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
7733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slgf";
7735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLFI(UChar r1, UInt i2)
7739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
7741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt op2;
7742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
7745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = i2;
7746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkU32(op2)));
7747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op1, mktemp(Ity_I32,
7748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU32(op2)));
7749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slfi";
7752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLGFI(UChar r1, UInt i2)
7756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
7758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ULong op2;
7759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
7762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   op2 = (ULong)i2;
7763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkU64(op2)));
7764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op1, mktemp(Ity_I64,
7765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64(op2)));
7766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
7767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slgfi";
7769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLHHHR(UChar r3 __attribute__((unused)), UChar r1, UChar r2)
7773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
7775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
7776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r1));
7779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w0(r2));
7780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
7781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op2, op3);
7782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
7783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slhhhr";
7785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLHHLR(UChar r3 __attribute__((unused)), UChar r1, UChar r2)
7789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
7791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
7792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w0(r1));
7795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r2));
7796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
7797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op2, op3);
7798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w0(r1, mkexpr(result));
7799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slhhlr";
7801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLBR(UChar r1, UChar r2)
7805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
7807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
7808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp borrow_in = newTemp(Ity_I32);
7810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
7812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
7813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(borrow_in, binop(Iop_Sub32, mkU32(1), binop(Iop_Shr32,
7814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          s390_call_calculate_cc(), mkU8(1))));
7815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)),
7816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(borrow_in)));
7817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_SUBB_32, op1, op2, borrow_in);
7818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slbr";
7821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLBGR(UChar r1, UChar r2)
7825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
7827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
7828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp borrow_in = newTemp(Ity_I64);
7830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
7832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
7833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(borrow_in, unop(Iop_32Uto64, binop(Iop_Sub32, mkU32(1),
7834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Shr32, s390_call_calculate_cc(), mkU8(1)))));
7835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)),
7836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(borrow_in)));
7837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_SUBB_64, op1, op2, borrow_in);
7838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
7839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slbgr";
7841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLB(UChar r1, IRTemp op2addr)
7845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
7847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
7848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
7849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp borrow_in = newTemp(Ity_I32);
7850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
7852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
7853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(borrow_in, binop(Iop_Sub32, mkU32(1), binop(Iop_Shr32,
7854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          s390_call_calculate_cc(), mkU8(1))));
7855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)),
7856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(borrow_in)));
7857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_SUBB_32, op1, op2, borrow_in);
7858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
7859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slb";
7861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SLBG(UChar r1, IRTemp op2addr)
7865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
7867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
7868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
7869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp borrow_in = newTemp(Ity_I64);
7870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
7872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
7873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(borrow_in, unop(Iop_32Uto64, binop(Iop_Sub32, mkU32(1),
7874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Shr32, s390_call_calculate_cc(), mkU8(1)))));
7875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)),
7876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(borrow_in)));
7877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_SUBB_64, op1, op2, borrow_in);
7878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
7879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "slbg";
7881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SVC(UChar i)
7885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp sysno = newTemp(Ity_I64);
7887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (i != 0) {
7889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(sysno, mkU64(i));
7890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
7891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(sysno, unop(Iop_32Uto64, get_gpr_w1(1)));
7892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
7893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   system_call(mkexpr(sysno));
7894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "svc";
7896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TM(UChar i2, IRTemp op1addr)
7900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar mask;
7902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I8);
7903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = i2;
7905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, load(Ity_I8, mkexpr(op1addr)));
7906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_8, value, mktemp(Ity_I8,
7907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU8(mask)));
7908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tm";
7910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TMY(UChar i2, IRTemp op1addr)
7914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar mask;
7916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I8);
7917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = i2;
7919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, load(Ity_I8, mkexpr(op1addr)));
7920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_8, value, mktemp(Ity_I8,
7921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU8(mask)));
7922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tmy";
7924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TMHH(UChar r1, UShort i2)
7928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort mask;
7930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I16);
7931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = i2;
7933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_hw0(r1));
7934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_16, value, mktemp(Ity_I16,
7935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU16(mask)));
7936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tmhh";
7938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TMHL(UChar r1, UShort i2)
7942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort mask;
7944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I16);
7945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = i2;
7947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_hw1(r1));
7948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_16, value, mktemp(Ity_I16,
7949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU16(mask)));
7950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tmhl";
7952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TMLH(UChar r1, UShort i2)
7956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort mask;
7958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I16);
7959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = i2;
7961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_hw2(r1));
7962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_16, value, mktemp(Ity_I16,
7963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU16(mask)));
7964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tmlh";
7966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TMLL(UChar r1, UShort i2)
7970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UShort mask;
7972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I16);
7973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = i2;
7975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_gpr_hw3(r1));
7976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_16, value, mktemp(Ity_I16,
7977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU16(mask)));
7978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tmll";
7980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_EFPC(UChar r1)
7984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, get_fpc_w0());
7986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "efpc";
7988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LER(UChar r1, UChar r2)
7992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
7993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, get_fpr_w0(r2));
7994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ler";
7996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
7997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
7999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LDR(UChar r1, UChar r2)
8000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, get_fpr_dw0(r2));
8002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ldr";
8004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LXR(UChar r1, UChar r2)
8008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, get_fpr_dw0(r2));
8010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1 + 2, get_fpr_dw0(r2 + 2));
8011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lxr";
8013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LE(UChar r1, IRTemp op2addr)
8017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, load(Ity_F32, mkexpr(op2addr)));
8019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "le";
8021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LD(UChar r1, IRTemp op2addr)
8025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, load(Ity_F64, mkexpr(op2addr)));
8027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ld";
8029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LEY(UChar r1, IRTemp op2addr)
8033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, load(Ity_F32, mkexpr(op2addr)));
8035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ley";
8037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LDY(UChar r1, IRTemp op2addr)
8041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, load(Ity_F64, mkexpr(op2addr)));
8043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ldy";
8045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LFPC(IRTemp op2addr)
8049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpc_w0(load(Ity_I32, mkexpr(op2addr)));
8051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lfpc";
8053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LZER(UChar r1)
8057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkF32i(0x0));
8059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lzer";
8061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LZDR(UChar r1)
8065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkF64i(0x0));
8067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lzdr";
8069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LZXR(UChar r1)
8073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkF64i(0x0));
8075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1 + 2, mkF64i(0x0));
8076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lzxr";
8078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRNM(IRTemp op2addr)
8082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt mask;
8084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   mask = 3;
8086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpc_w0(binop(Iop_Or32, binop(Iop_And32, get_fpc_w0(), mkU32(~mask)),
8087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              binop(Iop_And32, unop(Iop_64to32, mkexpr(op2addr)), mkU32(mask)))
8088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              );
8089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srnm";
8091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SFPC(UChar r1)
8095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpc_w0(get_gpr_w1(r1));
8097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sfpc";
8099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STE(UChar r1, IRTemp op2addr)
8103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_fpr_w0(r1));
8105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ste";
8107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STD(UChar r1, IRTemp op2addr)
8111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_fpr_dw0(r1));
8113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "std";
8115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STEY(UChar r1, IRTemp op2addr)
8119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_fpr_w0(r1));
8121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stey";
8123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STDY(UChar r1, IRTemp op2addr)
8127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_fpr_dw0(r1));
8129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stdy";
8131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STFPC(IRTemp op2addr)
8135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), get_fpc_w0());
8137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stfpc";
8139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AEBR(UChar r1, UChar r2)
8143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
8145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
8146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
8147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
8149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_w0(r2));
8150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_AddF32, mkU32(Irrm_NEAREST), mkexpr(op1),
8151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
8153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
8154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "aebr";
8156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ADBR(UChar r1, UChar r2)
8160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F64);
8162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F64);
8163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
8164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_dw0(r1));
8166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_dw0(r2));
8167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_AddF64, mkU32(Irrm_NEAREST), mkexpr(op1),
8168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
8170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
8171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "adbr";
8173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AEB(UChar r1, IRTemp op2addr)
8177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
8179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
8180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
8181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
8183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_F32, mkexpr(op2addr)));
8184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_AddF32, mkU32(Irrm_NEAREST), mkexpr(op1),
8185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
8187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
8188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "aeb";
8190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_ADB(UChar r1, IRTemp op2addr)
8194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F64);
8196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F64);
8197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
8198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_dw0(r1));
8200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_F64, mkexpr(op2addr)));
8201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_AddF64, mkU32(Irrm_NEAREST), mkexpr(op1),
8202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
8204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
8205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "adb";
8207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CEFBR(UChar r1, UChar r2)
8211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
8215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, binop(Iop_I32StoF32, mkU32(Irrm_NEAREST), mkexpr(op2)));
8216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cefbr";
8218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CDFBR(UChar r1, UChar r2)
8222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
8224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
8226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, unop(Iop_I32StoF64, mkexpr(op2)));
8227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cdfbr";
8229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CEGBR(UChar r1, UChar r2)
8233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
8235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
8237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, binop(Iop_I64StoF32, mkU32(Irrm_NEAREST), mkexpr(op2)));
8238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cegbr";
8240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CDGBR(UChar r1, UChar r2)
8244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
8246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
8248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, binop(Iop_I64StoF64, mkU32(Irrm_NEAREST), mkexpr(op2)));
8249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cdgbr";
8251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CFEBR(UChar r3, UChar r1, UChar r2)
8255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F32);
8257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_w0(r2));
8260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_F32toI32S, mkU32(encode_rounding_mode(r3)),
8261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op)));
8262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
8263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_32_TO_INT_32, op);
8264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cfebr";
8266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CFDBR(UChar r3, UChar r1, UChar r2)
8270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F64);
8272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
8273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_dw0(r2));
8275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_F64toI32S, mkU32(encode_rounding_mode(r3)),
8276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op)));
8277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
8278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_64_TO_INT_32, op);
8279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cfdbr";
8281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGEBR(UChar r3, UChar r1, UChar r2)
8285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F32);
8287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
8288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_w0(r2));
8290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_F32toI64S, mkU32(encode_rounding_mode(r3)),
8291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op)));
8292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
8293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_32_TO_INT_64, op);
8294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgebr";
8296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGDBR(UChar r3, UChar r1, UChar r2)
8300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F64);
8302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
8303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_dw0(r2));
8305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_F64toI64S, mkU32(encode_rounding_mode(r3)),
8306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op)));
8307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
8308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_64_TO_INT_64, op);
8309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgdbr";
8311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DEBR(UChar r1, UChar r2)
8315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
8317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
8318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
8319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
8321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_w0(r2));
8322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_DivF32, mkU32(Irrm_NEAREST), mkexpr(op1),
8323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
8325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "debr";
8327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DDBR(UChar r1, UChar r2)
8331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F64);
8333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F64);
8334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
8335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_dw0(r1));
8337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_dw0(r2));
8338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_DivF64, mkU32(Irrm_NEAREST), mkexpr(op1),
8339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
8341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ddbr";
8343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DEB(UChar r1, IRTemp op2addr)
8347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
8349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
8350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
8351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
8353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_F32, mkexpr(op2addr)));
8354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_DivF32, mkU32(Irrm_NEAREST), mkexpr(op1),
8355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
8357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "deb";
8359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DDB(UChar r1, IRTemp op2addr)
8363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F64);
8365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F64);
8366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
8367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_dw0(r1));
8369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_F64, mkexpr(op2addr)));
8370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_DivF64, mkU32(Irrm_NEAREST), mkexpr(op1),
8371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
8373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ddb";
8375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LTEBR(UChar r1, UChar r2)
8379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
8381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, get_fpr_w0(r2));
8383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
8384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
8385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ltebr";
8387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LTDBR(UChar r1, UChar r2)
8391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
8393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, get_fpr_dw0(r2));
8395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
8396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
8397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ltdbr";
8399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LCEBR(UChar r1, UChar r2)
8403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
8405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_NegF32, get_fpr_w0(r2)));
8407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
8408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
8409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lcebr";
8411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LCDBR(UChar r1, UChar r2)
8415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
8417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_NegF64, get_fpr_dw0(r2)));
8419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
8420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
8421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lcdbr";
8423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LDEBR(UChar r1, UChar r2)
8427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F32);
8429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_w0(r2));
8431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, unop(Iop_F32toF64, mkexpr(op)));
8432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ldebr";
8434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LDEB(UChar r1, IRTemp op2addr)
8438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F32);
8440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, load(Ity_F32, mkexpr(op2addr)));
8442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, unop(Iop_F32toF64, mkexpr(op)));
8443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ldeb";
8445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LEDBR(UChar r1, UChar r2)
8449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F64);
8451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_dw0(r2));
8453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, binop(Iop_F64toF32, mkU32(Irrm_NEAREST), mkexpr(op)));
8454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ledbr";
8456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MEEBR(UChar r1, UChar r2)
8460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
8462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
8463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
8464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
8466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_w0(r2));
8467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_MulF32, mkU32(Irrm_NEAREST), mkexpr(op1),
8468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
8470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "meebr";
8472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MDBR(UChar r1, UChar r2)
8476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F64);
8478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F64);
8479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
8480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_dw0(r1));
8482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_dw0(r2));
8483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_MulF64, mkU32(Irrm_NEAREST), mkexpr(op1),
8484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
8486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mdbr";
8488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MEEB(UChar r1, IRTemp op2addr)
8492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
8494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
8495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
8496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
8498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_F32, mkexpr(op2addr)));
8499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_MulF32, mkU32(Irrm_NEAREST), mkexpr(op1),
8500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
8502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "meeb";
8504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MDB(UChar r1, IRTemp op2addr)
8508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F64);
8510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F64);
8511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
8512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_dw0(r1));
8514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_F64, mkexpr(op2addr)));
8515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_MulF64, mkU32(Irrm_NEAREST), mkexpr(op1),
8516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
8518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mdb";
8520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SEBR(UChar r1, UChar r2)
8524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
8526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
8527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
8528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
8530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_w0(r2));
8531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_SubF32, mkU32(Irrm_NEAREST), mkexpr(op1),
8532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
8534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
8535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sebr";
8537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SDBR(UChar r1, UChar r2)
8541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F64);
8543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F64);
8544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
8545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_dw0(r1));
8547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_dw0(r2));
8548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_SubF64, mkU32(Irrm_NEAREST), mkexpr(op1),
8549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
8551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
8552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sdbr";
8554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SEB(UChar r1, IRTemp op2addr)
8558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
8560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
8561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
8562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
8564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_F32, mkexpr(op2addr)));
8565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_SubF32, mkU32(Irrm_NEAREST), mkexpr(op1),
8566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
8568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
8569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "seb";
8571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SDB(UChar r1, IRTemp op2addr)
8575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F64);
8577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F64);
8578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
8579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_dw0(r1));
8581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_F64, mkexpr(op2addr)));
8582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_SubF64, mkU32(Irrm_NEAREST), mkexpr(op1),
8583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkexpr(op2)));
8584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
8585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
8586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sdb";
8588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLC(UChar length, IRTemp start1, IRTemp start2)
8593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len = newTemp(Ity_I64);
8595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len, mkU64(length));
8597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_CLC_EX(len, start1, start2);
8598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clc";
8600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLCL(UChar r1, UChar r2)
8604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr1 = newTemp(Ity_I64);
8606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr2 = newTemp(Ity_I64);
8607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr1_load = newTemp(Ity_I64);
8608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr2_load = newTemp(Ity_I64);
8609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp len1 = newTemp(Ity_I32);
8610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp len2 = newTemp(Ity_I32);
8611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp r1p1 = newTemp(Ity_I32);   /* contents of r1 + 1 */
8612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp r2p1 = newTemp(Ity_I32);   /* contents of r2 + 1 */
8613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp single1 = newTemp(Ity_I8);
8614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp single2 = newTemp(Ity_I8);
8615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp pad = newTemp(Ity_I8);
8616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr1, get_gpr_dw0(r1));
8618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(r1p1, get_gpr_w1(r1 + 1));
8619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len1, binop(Iop_And32, mkexpr(r1p1), mkU32(0x00ffffff)));
8620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr2, get_gpr_dw0(r2));
8621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(r2p1, get_gpr_w1(r2 + 1));
8622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len2, binop(Iop_And32, mkexpr(r2p1), mkU32(0x00ffffff)));
8623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(pad, get_gpr_b4(r2 + 1));
8624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* len1 == 0 and len2 == 0? Exit */
8626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(0);
8627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ32, binop(Iop_Or32, mkexpr(len1),
8628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                         mkexpr(len2)), mkU32(0)));
8629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Because mkite evaluates both the then-clause and the else-clause
8631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      we cannot load directly from addr1 here. If len1 is 0, then adddr1
8632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      may be NULL and loading from there would segfault. So we provide a
8633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      valid dummy address in that case. Loading from there does no harm and
8634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      the value will be discarded at runtime. */
8635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr1_load,
8636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ32, mkexpr(len1), mkU32(0)),
8637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkU64(guest_IA_curr_instr), mkexpr(addr1)));
8638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(single1,
8639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ32, mkexpr(len1), mkU32(0)),
8640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkexpr(pad), load(Ity_I8, mkexpr(addr1_load))));
8641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr2_load,
8643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ32, mkexpr(len2), mkU32(0)),
8644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkU64(guest_IA_curr_instr), mkexpr(addr2)));
8645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(single2,
8646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ32, mkexpr(len2), mkU32(0)),
8647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkexpr(pad), load(Ity_I8, mkexpr(addr2_load))));
8648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, single1, single2, False);
8650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Fields differ ? */
8651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpNE8, mkexpr(single1), mkexpr(single2)));
8652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Update len1 and addr1, unless len1 == 0. */
8654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1,
8655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ32, mkexpr(len1), mkU32(0)),
8656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkexpr(addr1),
8657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     binop(Iop_Add64, mkexpr(addr1), mkU64(1))));
8658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* When updating len1 we must not modify bits (r1+1)[0:39] */
8660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1,
8661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkite(binop(Iop_CmpEQ32, mkexpr(len1), mkU32(0)),
8662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    binop(Iop_And32, mkexpr(r1p1), mkU32(0xFF000000u)),
8663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    binop(Iop_Sub32, mkexpr(r1p1), mkU32(1))));
8664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Update len2 and addr2, unless len2 == 0. */
8666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2,
8667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ32, mkexpr(len2), mkU32(0)),
8668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkexpr(addr2),
8669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     binop(Iop_Add64, mkexpr(addr2), mkU64(1))));
8670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* When updating len2 we must not modify bits (r2+1)[0:39] */
8672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r2 + 1,
8673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkite(binop(Iop_CmpEQ32, mkexpr(len2), mkU32(0)),
8674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    binop(Iop_And32, mkexpr(r2p1), mkU32(0xFF000000u)),
8675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    binop(Iop_Sub32, mkexpr(r2p1), mkU32(1))));
8676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
8678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clcl";
8680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLCLE(UChar r1, UChar r3, IRTemp pad2)
8684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr1, addr3, addr1_load, addr3_load, len1, len3, single1, single3;
8686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   addr1 = newTemp(Ity_I64);
8688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   addr3 = newTemp(Ity_I64);
8689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   addr1_load = newTemp(Ity_I64);
8690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   addr3_load = newTemp(Ity_I64);
8691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   len1 = newTemp(Ity_I64);
8692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   len3 = newTemp(Ity_I64);
8693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   single1 = newTemp(Ity_I8);
8694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   single3 = newTemp(Ity_I8);
8695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr1, get_gpr_dw0(r1));
8697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len1, get_gpr_dw0(r1 + 1));
8698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr3, get_gpr_dw0(r3));
8699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len3, get_gpr_dw0(r3 + 1));
8700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* len1 == 0 and len3 == 0? Exit */
8702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(0);
8703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64,binop(Iop_Or64, mkexpr(len1),
8704663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        mkexpr(len3)), mkU64(0)));
8705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* A mux requires both ways to be possible. This is a way to prevent clcle
8707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      from reading from addr1 if it should read from the pad. Since the pad
8708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      has no address, just read from the instruction, we discard that anyway */
8709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr1_load,
8710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ64, mkexpr(len1), mkU64(0)),
8711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkU64(guest_IA_curr_instr), mkexpr(addr1)));
8712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* same for addr3 */
8714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr3_load,
8715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0)),
8716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkU64(guest_IA_curr_instr), mkexpr(addr3)));
8717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(single1,
8719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ64, mkexpr(len1), mkU64(0)),
8720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                unop(Iop_64to8, mkexpr(pad2)),
8721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                load(Ity_I8, mkexpr(addr1_load))));
8722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(single3,
8724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0)),
8725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                unop(Iop_64to8, mkexpr(pad2)),
8726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                load(Ity_I8, mkexpr(addr3_load))));
8727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, single1, single3, False);
8729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Both fields differ ? */
8730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpNE8, mkexpr(single1), mkexpr(single3)));
8731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* If a length in 0 we must not change this length and the address */
8733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1,
8734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ64, mkexpr(len1), mkU64(0)),
8735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkexpr(addr1),
8736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     binop(Iop_Add64, mkexpr(addr1), mkU64(1))));
8737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1 + 1,
8739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ64, mkexpr(len1), mkU64(0)),
8740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkU64(0), binop(Iop_Sub64, mkexpr(len1), mkU64(1))));
8741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r3,
8743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0)),
8744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkexpr(addr3),
8745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     binop(Iop_Add64, mkexpr(addr3), mkU64(1))));
8746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r3 + 1,
8748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0)),
8749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkU64(0), binop(Iop_Sub64, mkexpr(len3), mkU64(1))));
8750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
8752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clcle";
8754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8756663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
8758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XC_EX(IRTemp length, IRTemp start1, IRTemp start2)
8759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_xonc(Iop_Xor8, length, start1, start2);
8761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
8762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8764663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
8765663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_NC_EX(IRTemp length, IRTemp start1, IRTemp start2)
8766663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
8767663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_xonc(Iop_And8, length, start1, start2);
8768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
8769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
8772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_OC_EX(IRTemp length, IRTemp start1, IRTemp start2)
8773663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
8774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_xonc(Iop_Or8, length, start1, start2);
8775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
8779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLC_EX(IRTemp length, IRTemp start1, IRTemp start2)
8780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp current1 = newTemp(Ity_I8);
8782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp current2 = newTemp(Ity_I8);
8783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp counter = newTemp(Ity_I64);
8784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(counter, get_counter_dw0());
8786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(mkU64(0));
8787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(current1, load(Ity_I8, binop(Iop_Add64, mkexpr(start1),
8789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       mkexpr(counter))));
8790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(current2, load(Ity_I8, binop(Iop_Add64, mkexpr(start2),
8791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       mkexpr(counter))));
8792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, current1, current2,
8793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      False);
8794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Both fields differ ? */
8796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpNE8, mkexpr(current1), mkexpr(current2)));
8797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Check for end of field */
8799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
8800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(binop(Iop_CmpNE64, mkexpr(counter), mkexpr(length)));
8801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(mkU64(0));
8802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
8805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVC_EX(IRTemp length, IRTemp start1, IRTemp start2)
8806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp counter = newTemp(Ity_I64);
8808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(counter, get_counter_dw0());
8810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64, mkexpr(start1), mkexpr(counter)),
8812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         load(Ity_I8, binop(Iop_Add64, mkexpr(start2), mkexpr(counter))));
8813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Check for end of field */
8815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
8816663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(binop(Iop_CmpNE64, mkexpr(counter), mkexpr(length)));
8817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(mkU64(0));
8818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8820663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
8821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_TR_EX(IRTemp length, IRTemp start1, IRTemp start2)
8822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
8823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op = newTemp(Ity_I8);
8824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1 = newTemp(Ity_I8);
8825663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp result = newTemp(Ity_I64);
8826663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp counter = newTemp(Ity_I64);
8827663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8828663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(counter, get_counter_dw0());
8829663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op, load(Ity_I8, binop(Iop_Add64, mkexpr(start1), mkexpr(counter))));
8831663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8832663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(result, binop(Iop_Add64, unop(Iop_8Uto64, mkexpr(op)), mkexpr(start2)));
8833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8834663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1, load(Ity_I8, mkexpr(result)));
8835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   store(binop(Iop_Add64, mkexpr(start1), mkexpr(counter)), mkexpr(op1));
8836663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8837663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
8838663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(binop(Iop_CmpNE64, mkexpr(counter), mkexpr(length)));
8839663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_counter_dw0(mkU64(0));
8840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
8841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
8844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_EX_SS(UChar r, IRTemp addr2,
8845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 void (*irgen)(IRTemp length, IRTemp start1, IRTemp start2),
8846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 int lensize)
8847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct SS {
8849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned int op :  8;
8850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned int l  :  8;
8851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned int b1 :  4;
8852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned int d1 : 12;
8853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned int b2 :  4;
8854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned int d2 : 12;
8855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   };
8856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   union {
8857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct SS dec;
8858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned long bytes;
8859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } ss;
8860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond;
8861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRDirty *d;
8862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp torun;
8863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp start1 = newTemp(Ity_I64);
8865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp start2 = newTemp(Ity_I64);
8866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp len = newTemp(lensize == 64 ? Ity_I64 : Ity_I32);
8867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   cond = newTemp(Ity_I1);
8868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   torun = newTemp(Ity_I64);
8869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(torun, load(Ity_I64, mkexpr(addr2)));
8871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Start with a check that the saved code is still correct */
8872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cond, binop(Iop_CmpNE64, mkexpr(torun), mkU64(last_execute_target)));
8873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* If not, save the new value */
8874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d = unsafeIRDirty_0_N (0, "s390x_dirtyhelper_EX", &s390x_dirtyhelper_EX,
8875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                          mkIRExprVec_1(mkexpr(torun)));
8876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->guard = mkexpr(cond);
8877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Dirty(d));
8878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* and restart */
8880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_TISTART),
8881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                   mkU64(guest_IA_curr_instr)));
8882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_TILEN), mkU64(4)));
8883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   restart_if(mkexpr(cond));
8884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ss.bytes = last_execute_target;
8886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(start1, binop(Iop_Add64, mkU64(ss.dec.d1),
8887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ss.dec.b1 != 0 ? get_gpr_dw0(ss.dec.b1) : mkU64(0)));
8888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(start2, binop(Iop_Add64, mkU64(ss.dec.d2),
8889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          ss.dec.b2 != 0 ? get_gpr_dw0(ss.dec.b2) : mkU64(0)));
8890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len, unop(lensize == 64 ? Iop_8Uto64 : Iop_8Uto32, binop(Iop_Or8,
8891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          r != 0 ? get_gpr_b7(r): mkU8(0), mkU8(ss.dec.l))));
8892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irgen(len, start1, start2);
8893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   last_execute_target = 0;
8895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
8896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
8898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_EX(UChar r1, IRTemp addr2)
8899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
8900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch(last_execute_target & 0xff00000000000000ULL) {
8901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0:
8902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   {
8903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* no code information yet */
8904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRDirty *d;
8905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* so safe the code... */
8907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      d = unsafeIRDirty_0_N (0, "s390x_dirtyhelper_EX", &s390x_dirtyhelper_EX,
8908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             mkIRExprVec_1(load(Ity_I64, mkexpr(addr2))));
8909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      stmt(IRStmt_Dirty(d));
8910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* and restart */
8911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_TISTART),
8912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      mkU64(guest_IA_curr_instr)));
8913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_TILEN), mkU64(4)));
8914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      restart_if(IRExpr_Const(IRConst_U1(True)));
8915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* we know that this will be invalidated */
8917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      put_IA(mkaddr_expr(guest_IA_next_instr));
8918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      dis_res->whatNext = Dis_StopHere;
8919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dis_res->jk_StopHere = Ijk_TInval;
8920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
8921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
8922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd200000000000000ULL:
8924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* special case MVC */
8925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_irgen_EX_SS(r1, addr2, s390_irgen_MVC_EX, 64);
8926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return "mvc via ex";
8927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd500000000000000ULL:
8929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* special case CLC */
8930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_irgen_EX_SS(r1, addr2, s390_irgen_CLC_EX, 64);
8931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return "clc via ex";
8932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd700000000000000ULL:
8934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* special case XC */
8935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_irgen_EX_SS(r1, addr2, s390_irgen_XC_EX, 32);
8936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return "xc via ex";
8937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xd600000000000000ULL:
8939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* special case OC */
8940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_irgen_EX_SS(r1, addr2, s390_irgen_OC_EX, 32);
8941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return "oc via ex";
8942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xd400000000000000ULL:
8944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* special case NC */
8945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_irgen_EX_SS(r1, addr2, s390_irgen_NC_EX, 32);
8946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return "nc via ex";
8947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xdc00000000000000ULL:
8949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* special case TR */
8950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_irgen_EX_SS(r1, addr2, s390_irgen_TR_EX, 64);
8951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return "tr via ex";
8952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   default:
8954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   {
8955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* everything else will get a self checking prefix that also checks the
8956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         register content */
8957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRDirty *d;
8958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      UChar *bytes;
8959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp cond;
8960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp orperand;
8961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp torun;
8962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      cond = newTemp(Ity_I1);
8964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      orperand = newTemp(Ity_I64);
8965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      torun = newTemp(Ity_I64);
8966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (r1 == 0)
8968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(orperand, mkU64(0));
8969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      else
8970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         assign(orperand, unop(Iop_8Uto64,get_gpr_b7(r1)));
8971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* This code is going to be translated */
8972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(torun, binop(Iop_Or64, load(Ity_I64, mkexpr(addr2)),
8973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             binop(Iop_Shl64, mkexpr(orperand), mkU8(48))));
8974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* Start with a check that saved code is still correct */
8976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(cond, binop(Iop_CmpNE64, mkexpr(torun),
8977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             mkU64(last_execute_target)));
8978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* If not, save the new value */
8979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      d = unsafeIRDirty_0_N (0, "s390x_dirtyhelper_EX", &s390x_dirtyhelper_EX,
8980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             mkIRExprVec_1(mkexpr(torun)));
8981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      d->guard = mkexpr(cond);
8982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      stmt(IRStmt_Dirty(d));
8983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* and restart */
8985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_TISTART), mkU64(guest_IA_curr_instr)));
8986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_TILEN), mkU64(4)));
8987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      restart_if(mkexpr(cond));
8988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* Now comes the actual translation */
8990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      bytes = (UChar *) &last_execute_target;
8991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_decode_and_irgen(bytes, ((((bytes[0] >> 6) + 1) >> 1) + 1) << 1,
8992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            dis_res);
8993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
8994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         vex_printf("    which was executed by\n");
8995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* dont make useless translations in the next execute */
8996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      last_execute_target = 0;
8997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
8998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
8999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ex";
9000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_EXRL(UChar r1, UInt offset)
9004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
9006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* we might save one round trip because we know the target */
9007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (!last_execute_target)
9008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      last_execute_target = *(ULong *)(HWord)
9009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             (guest_IA_curr_instr + offset * 2UL);
9010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkU64(guest_IA_curr_instr + offset * 2UL));
9011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_EX(r1, addr);
9012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "exrl";
9013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_IPM(UChar r1)
9017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // As long as we dont support SPM, lets just assume 0 as program mask
9019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_b4(r1, unop(Iop_32to8, binop(Iop_Or32, mkU32(0 /* program mask */),
9020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       binop(Iop_Shl32, s390_call_calculate_cc(), mkU8(4)))));
9021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ipm";
9023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SRST(UChar r1, UChar r2)
9028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp address = newTemp(Ity_I64);
9030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp next = newTemp(Ity_I64);
9031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp delim = newTemp(Ity_I8);
9032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp counter = newTemp(Ity_I64);
9033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp byte = newTemp(Ity_I8);
9034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(address, get_gpr_dw0(r2));
9036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(next, get_gpr_dw0(r1));
9037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(counter, get_counter_dw0());
9039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(mkU64(0));
9040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // start = next?  CC=2 and out r1 and r2 unchanged
9042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(2);
9043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2, binop(Iop_Sub64, mkexpr(address), mkexpr(counter)));
9044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, mkexpr(address), mkexpr(next)));
9045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(byte, load(Ity_I8, mkexpr(address)));
9047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(delim, get_gpr_b7(0));
9048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // byte = delim? CC=1, R1=address
9050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(1);
9051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1,  mkexpr(address));
9052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ8, mkexpr(delim), mkexpr(byte)));
9053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // else: all equal, no end yet, loop
9055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
9056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(next));
9057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2, binop(Iop_Add64, mkexpr(address), mkU64(1)));
9058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
9060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "srst";
9062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CLST(UChar r1, UChar r2)
9066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp address1 = newTemp(Ity_I64);
9068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp address2 = newTemp(Ity_I64);
9069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp end = newTemp(Ity_I8);
9070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp counter = newTemp(Ity_I64);
9071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp byte1 = newTemp(Ity_I8);
9072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp byte2 = newTemp(Ity_I8);
9073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(address1, get_gpr_dw0(r1));
9075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(address2, get_gpr_dw0(r2));
9076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(end, get_gpr_b7(0));
9077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(counter, get_counter_dw0());
9078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(mkU64(0));
9079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(byte1, load(Ity_I8, mkexpr(address1)));
9080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(byte2, load(Ity_I8, mkexpr(address2)));
9081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // end in both? all equal, reset r1 and r2 to start values
9083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(0);
9084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Sub64, mkexpr(address1), mkexpr(counter)));
9085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2, binop(Iop_Sub64, mkexpr(address2), mkexpr(counter)));
9086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ8, mkU8(0),
9087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      binop(Iop_Or8,
9088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            binop(Iop_Xor8, mkexpr(byte1), mkexpr(end)),
9089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            binop(Iop_Xor8, mkexpr(byte2), mkexpr(end)))));
9090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(address1));
9092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2, mkexpr(address2));
9093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // End found in string1
9095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(1);
9096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ8, mkexpr(end), mkexpr(byte1)));
9097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // End found in string2
9099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(2);
9100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ8, mkexpr(end), mkexpr(byte2)));
9101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // string1 < string2
9103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(1);
9104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT32U, unop(Iop_8Uto32, mkexpr(byte1)),
9105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      unop(Iop_8Uto32, mkexpr(byte2))));
9106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // string2 < string1
9108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(2);
9109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT32U, unop(Iop_8Uto32, mkexpr(byte2)),
9110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      unop(Iop_8Uto32, mkexpr(byte1))));
9111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // else: all equal, no end yet, loop
9113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
9114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Add64, get_gpr_dw0(r1), mkU64(1)));
9115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2, binop(Iop_Add64, get_gpr_dw0(r2), mkU64(1)));
9116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
9118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "clst";
9120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
9123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_load_multiple_32bit(UChar r1, UChar r3, IRTemp op2addr)
9124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar reg;
9126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
9127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkexpr(op2addr));
9129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   reg = r1;
9130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do {
9131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp old = addr;
9132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg %= 16;
9134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_w1(reg, load(Ity_I32, mkexpr(addr)));
9135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr = newTemp(Ity_I64);
9136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
9137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg++;
9138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } while (reg != (r3 + 1));
9139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LM(UChar r1, UChar r3, IRTemp op2addr)
9143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_load_multiple_32bit(r1, r3, op2addr);
9145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lm";
9147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LMY(UChar r1, UChar r3, IRTemp op2addr)
9151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_load_multiple_32bit(r1, r3, op2addr);
9153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lmy";
9155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LMH(UChar r1, UChar r3, IRTemp op2addr)
9159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar reg;
9161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
9162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkexpr(op2addr));
9164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   reg = r1;
9165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do {
9166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp old = addr;
9167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg %= 16;
9169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_w0(reg, load(Ity_I32, mkexpr(addr)));
9170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr = newTemp(Ity_I64);
9171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
9172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg++;
9173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } while (reg != (r3 + 1));
9174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lmh";
9176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LMG(UChar r1, UChar r3, IRTemp op2addr)
9180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar reg;
9182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
9183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkexpr(op2addr));
9185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   reg = r1;
9186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do {
9187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp old = addr;
9188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg %= 16;
9190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_gpr_dw0(reg, load(Ity_I64, mkexpr(addr)));
9191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr = newTemp(Ity_I64);
9192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(8)));
9193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg++;
9194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } while (reg != (r3 + 1));
9195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lmg";
9197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
9200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_store_multiple_32bit(UChar r1, UChar r3, IRTemp op2addr)
9201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar reg;
9203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
9204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkexpr(op2addr));
9206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   reg = r1;
9207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do {
9208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp old = addr;
9209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg %= 16;
9211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(addr), get_gpr_w1(reg));
9212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr = newTemp(Ity_I64);
9213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
9214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg++;
9215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } while( reg != (r3 + 1));
9216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STM(UChar r1, UChar r3, IRTemp op2addr)
9220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_store_multiple_32bit(r1, r3, op2addr);
9222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stm";
9224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STMY(UChar r1, UChar r3, IRTemp op2addr)
9228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_store_multiple_32bit(r1, r3, op2addr);
9230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stmy";
9232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STMH(UChar r1, UChar r3, IRTemp op2addr)
9236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar reg;
9238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
9239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkexpr(op2addr));
9241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   reg = r1;
9242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do {
9243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp old = addr;
9244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg %= 16;
9246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(addr), get_gpr_w0(reg));
9247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr = newTemp(Ity_I64);
9248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
9249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg++;
9250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } while( reg != (r3 + 1));
9251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stmh";
9253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STMG(UChar r1, UChar r3, IRTemp op2addr)
9257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar reg;
9259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
9260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkexpr(op2addr));
9262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   reg = r1;
9263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do {
9264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp old = addr;
9265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg %= 16;
9267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(addr), get_gpr_dw0(reg));
9268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr = newTemp(Ity_I64);
9269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(8)));
9270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg++;
9271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } while( reg != (r3 + 1));
9272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stmg";
9274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
9277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_xonc(IROp op, IRTemp length, IRTemp start1, IRTemp start2)
9278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp old1 = newTemp(Ity_I8);
9280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp old2 = newTemp(Ity_I8);
9281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp new1 = newTemp(Ity_I8);
9282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp counter = newTemp(Ity_I32);
9283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr1 = newTemp(Ity_I64);
9284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(counter, get_counter_w0());
9286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr1, binop(Iop_Add64, mkexpr(start1),
9288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       unop(Iop_32Uto64, mkexpr(counter))));
9289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(old1, load(Ity_I8, mkexpr(addr1)));
9291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(old2, load(Ity_I8, binop(Iop_Add64, mkexpr(start2),
9292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   unop(Iop_32Uto64,mkexpr(counter)))));
9293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(new1, binop(op, mkexpr(old1), mkexpr(old2)));
9294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Special case: xc is used to zero memory */
9296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (op == Iop_Xor8) {
9297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(addr1),
9298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            mkite(binop(Iop_CmpEQ64, mkexpr(start1), mkexpr(start2)),
9299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                  mkU8(0), mkexpr(new1)));
9300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else
9301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(addr1), mkexpr(new1));
9302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_w1(binop(Iop_Or32, unop(Iop_8Uto32, mkexpr(new1)),
9303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        get_counter_w1()));
9304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Check for end of field */
9306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_w0(binop(Iop_Add32, mkexpr(counter), mkU32(1)));
9307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(binop(Iop_CmpNE32, mkexpr(counter), mkexpr(length)));
9308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_BITWISE, mktemp(Ity_I32, get_counter_w1()),
9309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      False);
9310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(mkU64(0));
9311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XC(UChar length, IRTemp start1, IRTemp start2)
9315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len = newTemp(Ity_I32);
9317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len, mkU32(length));
9319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_xonc(Iop_Xor8, len, start1, start2);
9320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "xc";
9322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
9325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_XC_sameloc(UChar length, UChar b, UShort d)
9326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp counter = newTemp(Ity_I32);
9328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp start = newTemp(Ity_I64);
9329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr  = newTemp(Ity_I64);
9330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(start,
9332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          binop(Iop_Add64, mkU64(d), b != 0 ? get_gpr_dw0(b) : mkU64(0)));
9333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (length < 8) {
9335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      UInt i;
9336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      for (i = 0; i <= length; ++i) {
9338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         store(binop(Iop_Add64, mkexpr(start), mkU64(i)), mkU8(0));
9339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
9340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
9341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     assign(counter, get_counter_w0());
9342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     assign(addr, binop(Iop_Add64, mkexpr(start),
9344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        unop(Iop_32Uto64, mkexpr(counter))));
9345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     store(mkexpr(addr), mkU8(0));
9347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* Check for end of field */
9349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     put_counter_w0(binop(Iop_Add32, mkexpr(counter), mkU32(1)));
9350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     iterate_if(binop(Iop_CmpNE32, mkexpr(counter), mkU32(length)));
9351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     /* Reset counter */
9353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     put_counter_dw0(mkU64(0));
9354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
9355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_BITWISE, mktemp(Ity_I32, mkU32(0)), False);
9357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
9359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_disasm(ENC3(MNM, UDLB, UDXB), "xc", d, length, b, d, 0, b);
9360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_NC(UChar length, IRTemp start1, IRTemp start2)
9364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len = newTemp(Ity_I32);
9366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len, mkU32(length));
9368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_xonc(Iop_And8, len, start1, start2);
9369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "nc";
9371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_OC(UChar length, IRTemp start1, IRTemp start2)
9375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len = newTemp(Ity_I32);
9377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len, mkU32(length));
9379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_xonc(Iop_Or8, len, start1, start2);
9380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "oc";
9382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVC(UChar length, IRTemp start1, IRTemp start2)
9387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len = newTemp(Ity_I64);
9389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len, mkU64(length));
9391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_MVC_EX(len, start1, start2);
9392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mvc";
9394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVCL(UChar r1, UChar r2)
9398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr1 = newTemp(Ity_I64);
9400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr2 = newTemp(Ity_I64);
9401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr2_load = newTemp(Ity_I64);
9402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp r1p1 = newTemp(Ity_I32);   /* contents of r1 + 1 */
9403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp r2p1 = newTemp(Ity_I32);   /* contents of r2 + 1 */
9404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp len1 = newTemp(Ity_I32);
9405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp len2 = newTemp(Ity_I32);
9406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp pad = newTemp(Ity_I8);
9407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp single = newTemp(Ity_I8);
9408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr1, get_gpr_dw0(r1));
9410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(r1p1, get_gpr_w1(r1 + 1));
9411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len1, binop(Iop_And32, mkexpr(r1p1), mkU32(0x00ffffff)));
9412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr2, get_gpr_dw0(r2));
9413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(r2p1, get_gpr_w1(r2 + 1));
9414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len2, binop(Iop_And32, mkexpr(r2p1), mkU32(0x00ffffff)));
9415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(pad, get_gpr_b4(r2 + 1));
9416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* len1 == 0 ? */
9418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, len1, len2, False);
9419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ32, mkexpr(len1), mkU32(0)));
9420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Check for destructive overlap:
9422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr1 > addr2 && addr2 + len1 > addr1 && (addr2 + len2) > addr1 */
9423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(3);
9424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond1 = newTemp(Ity_I32);
9425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cond1, unop(Iop_1Uto32,
9426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      binop(Iop_CmpLT64U, mkexpr(addr2), mkexpr(addr1))));
9427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond2 = newTemp(Ity_I32);
9428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cond2, unop(Iop_1Uto32,
9429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      binop(Iop_CmpLT64U, mkexpr(addr1),
9430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            binop(Iop_Add64, mkexpr(addr2),
9431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  unop(Iop_32Uto64, mkexpr(len1))))));
9432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cond3 = newTemp(Ity_I32);
9433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cond3, unop(Iop_1Uto32,
9434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      binop(Iop_CmpLT64U,
9435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            mkexpr(addr1),
9436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            binop(Iop_Add64, mkexpr(addr2),
9437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  unop(Iop_32Uto64, mkexpr(len2))))));
9438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ32,
9440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      binop(Iop_And32,
9441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            binop(Iop_And32, mkexpr(cond1), mkexpr(cond2)),
9442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            mkexpr(cond3)),
9443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      mkU32(1)));
9444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* See s390_irgen_CLCL for explanation why we cannot load directly
9446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      and need two steps. */
9447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr2_load,
9448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ32, mkexpr(len2), mkU32(0)),
9449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkU64(guest_IA_curr_instr), mkexpr(addr2)));
9450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(single,
9451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ32, mkexpr(len2), mkU32(0)),
9452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkexpr(pad), load(Ity_I8, mkexpr(addr2_load))));
9453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(addr1), mkexpr(single));
9455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Update addr1 and len1 */
9457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(addr1), mkU64(1)));
9458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, binop(Iop_Sub32, mkexpr(r1p1), mkU32(1)));
9459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Update addr2 and len2 */
9461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2,
9462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ32, mkexpr(len2), mkU32(0)),
9463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkexpr(addr2),
9464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     binop(Iop_Add64, mkexpr(addr2), mkU64(1))));
9465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* When updating len2 we must not modify bits (r2+1)[0:39] */
9467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r2 + 1,
9468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              mkite(binop(Iop_CmpEQ32, mkexpr(len2), mkU32(0)),
9469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    binop(Iop_And32, mkexpr(r2p1), mkU32(0xFF000000u)),
9470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    binop(Iop_Sub32, mkexpr(r2p1), mkU32(1))));
9471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, len1, len2, False);
9473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(binop(Iop_CmpNE32, mkexpr(len1), mkU32(1)));
9474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mvcl";
9476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVCLE(UChar r1, UChar r3, IRTemp pad2)
9481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr1, addr3, addr3_load, len1, len3, single;
9483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   addr1 = newTemp(Ity_I64);
9485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   addr3 = newTemp(Ity_I64);
9486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   addr3_load = newTemp(Ity_I64);
9487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   len1 = newTemp(Ity_I64);
9488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   len3 = newTemp(Ity_I64);
9489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   single = newTemp(Ity_I8);
9490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr1, get_gpr_dw0(r1));
9492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len1, get_gpr_dw0(r1 + 1));
9493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr3, get_gpr_dw0(r3));
9494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len3, get_gpr_dw0(r3 + 1));
9495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // len1 == 0 ?
9497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, len1, len3, False);
9498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64,mkexpr(len1), mkU64(0)));
9499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* This is a hack to prevent mvcle from reading from addr3 if it
9501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      should read from the pad. Since the pad has no address, just
9502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      read from the instruction, we discard that anyway */
9503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr3_load,
9504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0)),
9505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                mkU64(guest_IA_curr_instr), mkexpr(addr3)));
9506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(single,
9508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          mkite(binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0)),
9509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                unop(Iop_64to8, mkexpr(pad2)),
9510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                load(Ity_I8, mkexpr(addr3_load))));
9511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(addr1), mkexpr(single));
9512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(addr1), mkU64(1)));
9514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1 + 1, binop(Iop_Sub64, mkexpr(len1), mkU64(1)));
9516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r3,
9518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0)),
9519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkexpr(addr3),
9520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     binop(Iop_Add64, mkexpr(addr3), mkU64(1))));
9521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r3 + 1,
9523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0)),
9524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     mkU64(0), binop(Iop_Sub64, mkexpr(len3), mkU64(1))));
9525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, len1, len3, False);
9527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(binop(Iop_CmpNE64, mkexpr(len1), mkU64(1)));
9528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mvcle";
9530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MVST(UChar r1, UChar r2)
9534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr1 = newTemp(Ity_I64);
9536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr2 = newTemp(Ity_I64);
9537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp end = newTemp(Ity_I8);
9538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp byte = newTemp(Ity_I8);
9539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp counter = newTemp(Ity_I64);
9540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr1, get_gpr_dw0(r1));
9542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr2, get_gpr_dw0(r2));
9543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(counter, get_counter_dw0());
9544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(end, get_gpr_b7(0));
9545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(byte, load(Ity_I8, binop(Iop_Add64, mkexpr(addr2),mkexpr(counter))));
9546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(binop(Iop_Add64,mkexpr(addr1),mkexpr(counter)), mkexpr(byte));
9547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // We use unlimited as cpu-determined number
9549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
9550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(binop(Iop_CmpNE8, mkexpr(end), mkexpr(byte)));
9551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // and always set cc=1 at the end + update r1
9553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(1);
9554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(addr1), mkexpr(counter)));
9555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_counter_dw0(mkU64(0));
9556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mvst";
9558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
9561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_divide_64to32(IROp op, UChar r1, IRTemp op2)
9562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
9564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
9565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, binop(Iop_32HLto64,
9567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     get_gpr_w1(r1),         // high 32 bits
9568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     get_gpr_w1(r1 + 1)));   // low  32 bits
9569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(op, mkexpr(op1), mkexpr(op2)));
9570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));   // remainder
9571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result))); // quotient
9572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
9575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_divide_128to64(IROp op, UChar r1, IRTemp op2)
9576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I128);
9578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
9579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, binop(Iop_64HLto128,
9581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     get_gpr_dw0(r1),         // high 64 bits
9582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     get_gpr_dw0(r1 + 1)));   // low  64 bits
9583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(op, mkexpr(op1), mkexpr(op2)));
9584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128HIto64, mkexpr(result)));   // remainder
9585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1 + 1, unop(Iop_128to64, mkexpr(result))); // quotient
9586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
9589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_divide_64to64(IROp op, UChar r1, IRTemp op2)
9590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
9592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I128);
9593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1 + 1));
9595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(op, mkexpr(op1), mkexpr(op2)));
9596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_128HIto64, mkexpr(result)));   // remainder
9597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1 + 1, unop(Iop_128to64, mkexpr(result))); // quotient
9598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DR(UChar r1, UChar r2)
9602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
9604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
9606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_64to32(Iop_DivModS64to32, r1, op2);
9608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dr";
9610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_D(UChar r1, IRTemp op2addr)
9614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
9616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
9618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_64to32(Iop_DivModS64to32, r1, op2);
9620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "d";
9622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DLR(UChar r1, UChar r2)
9626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
9628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
9630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_64to32(Iop_DivModU64to32, r1, op2);
9632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dr";
9634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DL(UChar r1, IRTemp op2addr)
9638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
9640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I32, mkexpr(op2addr)));
9642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_64to32(Iop_DivModU64to32, r1, op2);
9644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dl";
9646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DLG(UChar r1, IRTemp op2addr)
9650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
9652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
9654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_128to64(Iop_DivModU128to64, r1, op2);
9656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dlg";
9658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DLGR(UChar r1, UChar r2)
9662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
9664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
9666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_128to64(Iop_DivModU128to64, r1, op2);
9668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dlgr";
9670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DSGR(UChar r1, UChar r2)
9674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
9676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
9678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_64to64(Iop_DivModS64to64, r1, op2);
9680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dsgr";
9682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DSG(UChar r1, IRTemp op2addr)
9686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
9688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_I64, mkexpr(op2addr)));
9690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_64to64(Iop_DivModS64to64, r1, op2);
9692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dsg";
9694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DSGFR(UChar r1, UChar r2)
9698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
9700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
9702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_64to64(Iop_DivModS64to64, r1, op2);
9704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dsgfr";
9706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DSGF(UChar r1, IRTemp op2addr)
9710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
9712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
9714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_divide_64to64(Iop_DivModS64to64, r1, op2);
9716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dsgf";
9718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
9721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_load_ar_multiple(UChar r1, UChar r3, IRTemp op2addr)
9722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar reg;
9724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
9725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkexpr(op2addr));
9727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   reg = r1;
9728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do {
9729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp old = addr;
9730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg %= 16;
9732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      put_ar_w0(reg, load(Ity_I32, mkexpr(addr)));
9733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr = newTemp(Ity_I64);
9734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
9735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg++;
9736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } while (reg != (r3 + 1));
9737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAM(UChar r1, UChar r3, IRTemp op2addr)
9741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_load_ar_multiple(r1, r3, op2addr);
9743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lam";
9745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LAMY(UChar r1, UChar r3, IRTemp op2addr)
9749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_load_ar_multiple(r1, r3, op2addr);
9751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lamy";
9753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
9756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_store_ar_multiple(UChar r1, UChar r3, IRTemp op2addr)
9757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar reg;
9759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
9760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, mkexpr(op2addr));
9762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   reg = r1;
9763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   do {
9764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      IRTemp old = addr;
9765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg %= 16;
9767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      store(mkexpr(addr), get_ar_w0(reg));
9768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      addr = newTemp(Ity_I64);
9769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
9770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      reg++;
9771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } while (reg != (r3 + 1));
9772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STAM(UChar r1, UChar r3, IRTemp op2addr)
9776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_store_ar_multiple(r1, r3, op2addr);
9778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stam";
9780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STAMY(UChar r1, UChar r3, IRTemp op2addr)
9784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_store_ar_multiple(r1, r3, op2addr);
9786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stamy";
9788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Implementation for 32-bit compare-and-swap */
9792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
9793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_cas_32(UChar r1, UChar r3, IRTemp op2addr)
9794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRCAS *cas;
9796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I32);
9797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp old_mem = newTemp(Ity_I32);
9798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I32);
9799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
9800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp nequal = newTemp(Ity_I1);
9801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_w1(r1));
9803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_w1(r3));
9804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* The first and second operands are compared. If they are equal,
9806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      the third operand is stored at the second- operand location. */
9807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   cas = mkIRCAS(IRTemp_INVALID, old_mem,
9808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 Iend_BE, mkexpr(op2addr),
9809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 NULL, mkexpr(op1), /* expected value */
9810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 NULL, mkexpr(op3)  /* new value */);
9811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_CAS(cas));
9812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Set CC. Operands compared equal -> 0, else 1. */
9814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(old_mem)));
9815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_BITWISE, result, False);
9816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* If operands were equal (cc == 0) just store the old value op1 in r1.
9818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Otherwise, store the old_value from memory in r1 and yield. */
9819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(nequal, binop(Iop_CmpNE32, s390_call_calculate_cc(), mkU32(0)));
9820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkite(mkexpr(nequal), mkexpr(old_mem), mkexpr(op1)));
9821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   yield_if(mkexpr(nequal));
9822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CS(UChar r1, UChar r3, IRTemp op2addr)
9826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_cas_32(r1, r3, op2addr);
9828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cs";
9830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CSY(UChar r1, UChar r3, IRTemp op2addr)
9834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_irgen_cas_32(r1, r3, op2addr);
9836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "csy";
9838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CSG(UChar r1, UChar r3, IRTemp op2addr)
9842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRCAS *cas;
9844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_I64);
9845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp old_mem = newTemp(Ity_I64);
9846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op3 = newTemp(Ity_I64);
9847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
9848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp nequal = newTemp(Ity_I1);
9849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_gpr_dw0(r1));
9851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op3, get_gpr_dw0(r3));
9852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* The first and second operands are compared. If they are equal,
9854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      the third operand is stored at the second- operand location. */
9855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   cas = mkIRCAS(IRTemp_INVALID, old_mem,
9856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 Iend_BE, mkexpr(op2addr),
9857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 NULL, mkexpr(op1), /* expected value */
9858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 NULL, mkexpr(op3)  /* new value */);
9859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_CAS(cas));
9860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Set CC. Operands compared equal -> 0, else 1. */
9862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(old_mem)));
9863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_BITWISE, result, False);
9864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* If operands were equal (cc == 0) just store the old value op1 in r1.
9866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Otherwise, store the old_value from memory in r1 and yield. */
9867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(nequal, binop(Iop_CmpNE32, s390_call_calculate_cc(), mkU32(0)));
9868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkite(mkexpr(nequal), mkexpr(old_mem), mkexpr(op1)));
9869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   yield_if(mkexpr(nequal));
9870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "csg";
9872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
9873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Implementation for 32-bit compare-double-and-swap */
9875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
9876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_cdas_32(UChar r1, UChar r3, IRTemp op2addr)
9877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
9878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRCAS *cas;
9879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1_high = newTemp(Ity_I32);
9880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1_low  = newTemp(Ity_I32);
9881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp old_mem_high = newTemp(Ity_I32);
9882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp old_mem_low  = newTemp(Ity_I32);
9883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op3_high = newTemp(Ity_I32);
9884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op3_low  = newTemp(Ity_I32);
9885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp result = newTemp(Ity_I32);
9886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp nequal = newTemp(Ity_I1);
9887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1_high, get_gpr_w1(r1));
9889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1_low,  get_gpr_w1(r1+1));
9890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op3_high, get_gpr_w1(r3));
9891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op3_low,  get_gpr_w1(r3+1));
9892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* The first and second operands are compared. If they are equal,
9894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      the third operand is stored at the second-operand location. */
9895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   cas = mkIRCAS(old_mem_high, old_mem_low,
9896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 Iend_BE, mkexpr(op2addr),
9897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 mkexpr(op1_high), mkexpr(op1_low), /* expected value */
9898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 mkexpr(op3_high), mkexpr(op3_low)  /* new value */);
9899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_CAS(cas));
9900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Set CC. Operands compared equal -> 0, else 1. */
9902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(result, unop(Iop_1Uto32,
9903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          binop(Iop_CmpNE32,
9904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                binop(Iop_Or32,
9905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      binop(Iop_Xor32, mkexpr(op1_high), mkexpr(old_mem_high)),
9906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      binop(Iop_Xor32, mkexpr(op1_low), mkexpr(old_mem_low))),
9907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                mkU32(0))));
9908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_thunk_put1(S390_CC_OP_BITWISE, result, False);
9910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* If operands were equal (cc == 0) just store the old value op1 in r1.
9912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Otherwise, store the old_value from memory in r1 and yield. */
9913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(nequal, binop(Iop_CmpNE32, s390_call_calculate_cc(), mkU32(0)));
9914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_w1(r1,   mkite(mkexpr(nequal), mkexpr(old_mem_high), mkexpr(op1_high)));
9915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_w1(r1+1, mkite(mkexpr(nequal), mkexpr(old_mem_low),  mkexpr(op1_low)));
9916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   yield_if(mkexpr(nequal));
9917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
9918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic HChar *
9920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CDS(UChar r1, UChar r3, IRTemp op2addr)
9921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
9922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_cdas_32(r1, r3, op2addr);
9923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cds";
9925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
9926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic HChar *
9928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CDSY(UChar r1, UChar r3, IRTemp op2addr)
9929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
9930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_cdas_32(r1, r3, op2addr);
9931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cdsy";
9933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
9934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic HChar *
9936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CDSG(UChar r1, UChar r3, IRTemp op2addr)
9937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
9938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRCAS *cas;
9939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1_high = newTemp(Ity_I64);
9940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1_low  = newTemp(Ity_I64);
9941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp old_mem_high = newTemp(Ity_I64);
9942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp old_mem_low  = newTemp(Ity_I64);
9943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op3_high = newTemp(Ity_I64);
9944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op3_low  = newTemp(Ity_I64);
9945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp result = newTemp(Ity_I64);
9946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp nequal = newTemp(Ity_I1);
9947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1_high, get_gpr_dw0(r1));
9949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1_low,  get_gpr_dw0(r1+1));
9950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op3_high, get_gpr_dw0(r3));
9951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op3_low,  get_gpr_dw0(r3+1));
9952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* The first and second operands are compared. If they are equal,
9954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      the third operand is stored at the second-operand location. */
9955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   cas = mkIRCAS(old_mem_high, old_mem_low,
9956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 Iend_BE, mkexpr(op2addr),
9957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 mkexpr(op1_high), mkexpr(op1_low), /* expected value */
9958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 mkexpr(op3_high), mkexpr(op3_low)  /* new value */);
9959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_CAS(cas));
9960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Set CC. Operands compared equal -> 0, else 1. */
9962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(result, unop(Iop_1Uto64,
9963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          binop(Iop_CmpNE64,
9964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                binop(Iop_Or64,
9965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      binop(Iop_Xor64, mkexpr(op1_high), mkexpr(old_mem_high)),
9966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      binop(Iop_Xor64, mkexpr(op1_low), mkexpr(old_mem_low))),
9967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                mkU64(0))));
9968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_thunk_put1(S390_CC_OP_BITWISE, result, False);
9970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* If operands were equal (cc == 0) just store the old value op1 in r1.
9972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Otherwise, store the old_value from memory in r1 and yield. */
9973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(nequal, binop(Iop_CmpNE32, s390_call_calculate_cc(), mkU32(0)));
9974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1,   mkite(mkexpr(nequal), mkexpr(old_mem_high), mkexpr(op1_high)));
9975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1+1, mkite(mkexpr(nequal), mkexpr(old_mem_low),  mkexpr(op1_low)));
9976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   yield_if(mkexpr(nequal));
9977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cdsg";
9979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
9980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Binary floating point */
9983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
9985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_AXBR(UChar r1, UChar r2)
9986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
9987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F128);
9988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F128);
9989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
9990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_pair(r1));
9992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_pair(r2));
9993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_AddF128, mkU32(Irrm_NEAREST), mkexpr(op1),
9994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        mkexpr(op2)));
9995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
9996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
9998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "axbr";
10000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The result of a Iop_CmdFxx operation is a condition code. It is
10003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   encoded using the values defined in type IRCmpFxxResult.
10004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Before we can store the condition code into the guest state (or do
10005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   anything else with it for that matter) we need to convert it to
10006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   the encoding that s390 uses. This is what this function does.
10007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390     VEX                b6 b2 b0   cc.1  cc.0
10009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   0      0x40 EQ             1  0  0     0     0
10010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   1      0x01 LT             0  0  1     0     1
10011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   2      0x00 GT             0  0  0     1     0
10012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   3      0x45 Unordered      1  1  1     1     1
10013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   The following bits from the VEX encoding are interesting:
10015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   b0, b2, b6  with b0 being the LSB. We observe:
10016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   cc.0 = b0;
10018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   cc.1 = b2 | (~b0 & ~b6)
10019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   with cc being the s390 condition code.
10021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
10022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRExpr *
10023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovconvert_vex_fpcc_to_s390(IRTemp vex_cc)
10024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc0  = newTemp(Ity_I32);
10026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc1  = newTemp(Ity_I32);
10027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b0   = newTemp(Ity_I32);
10028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b2   = newTemp(Ity_I32);
10029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp b6   = newTemp(Ity_I32);
10030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b0, binop(Iop_And32, mkexpr(vex_cc), mkU32(1)));
10032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b2, binop(Iop_And32, binop(Iop_Shr32, mkexpr(vex_cc), mkU8(2)),
10033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    mkU32(1)));
10034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(b6, binop(Iop_And32, binop(Iop_Shr32, mkexpr(vex_cc), mkU8(6)),
10035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    mkU32(1)));
10036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cc0, mkexpr(b0));
10038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cc1, binop(Iop_Or32, mkexpr(b2),
10039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     binop(Iop_And32,
10040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           binop(Iop_Sub32, mkU32(1), mkexpr(b0)), /* ~b0 */
10041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           binop(Iop_Sub32, mkU32(1), mkexpr(b6))  /* ~b6 */
10042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           )));
10043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return binop(Iop_Or32, mkexpr(cc0), binop(Iop_Shl32, mkexpr(cc1), mkU8(1)));
10045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CEBR(UChar r1, UChar r2)
10049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
10051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
10052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_vex  = newTemp(Ity_I32);
10053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_s390 = newTemp(Ity_I32);
10054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
10056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_w0(r2));
10057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cc_vex, binop(Iop_CmpF32, mkexpr(op1), mkexpr(op2)));
10058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cc_s390, convert_vex_fpcc_to_s390(cc_vex));
10060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
10061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cebr";
10063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CDBR(UChar r1, UChar r2)
10067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F64);
10069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F64);
10070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_vex  = newTemp(Ity_I32);
10071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_s390 = newTemp(Ity_I32);
10072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_dw0(r1));
10074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_dw0(r2));
10075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cc_vex, binop(Iop_CmpF64, mkexpr(op1), mkexpr(op2)));
10076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cc_s390, convert_vex_fpcc_to_s390(cc_vex));
10078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
10079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cdbr";
10081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CXBR(UChar r1, UChar r2)
10085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F128);
10087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F128);
10088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_vex  = newTemp(Ity_I32);
10089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_s390 = newTemp(Ity_I32);
10090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_pair(r1));
10092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_pair(r2));
10093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cc_vex, binop(Iop_CmpF128, mkexpr(op1), mkexpr(op2)));
10094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cc_s390, convert_vex_fpcc_to_s390(cc_vex));
10096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
10097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cxbr";
10099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CEB(UChar r1, IRTemp op2addr)
10103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F32);
10105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F32);
10106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_vex  = newTemp(Ity_I32);
10107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_s390 = newTemp(Ity_I32);
10108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_w0(r1));
10110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_F32, mkexpr(op2addr)));
10111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cc_vex,  binop(Iop_CmpF32, mkexpr(op1), mkexpr(op2)));
10112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cc_s390, convert_vex_fpcc_to_s390(cc_vex));
10114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
10115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ceb";
10117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CDB(UChar r1, IRTemp op2addr)
10121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F64);
10123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F64);
10124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_vex  = newTemp(Ity_I32);
10125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc_s390 = newTemp(Ity_I32);
10126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_dw0(r1));
10128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, load(Ity_F64, mkexpr(op2addr)));
10129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cc_vex, binop(Iop_CmpF64, mkexpr(op1), mkexpr(op2)));
10130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(cc_s390, convert_vex_fpcc_to_s390(cc_vex));
10132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
10133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cdb";
10135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CXFBR(UChar r1, UChar r2)
10139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I32);
10141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_w1(r2));
10143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, unop(Iop_I32StoF128, mkexpr(op2)));
10144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cxfbr";
10146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CXGBR(UChar r1, UChar r2)
10150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_I64);
10152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_gpr_dw0(r2));
10154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, unop(Iop_I64StoF128, mkexpr(op2)));
10155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cxgbr";
10157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CFXBR(UChar r3, UChar r1, UChar r2)
10161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F128);
10163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
10164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_pair(r2));
10166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_F128toI32S, mkU32(encode_rounding_mode(r3)),
10167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        mkexpr(op)));
10168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result));
10169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f128(S390_CC_OP_BFP_128_TO_INT_32, op);
10170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cfxbr";
10172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CGXBR(UChar r3, UChar r1, UChar r2)
10176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F128);
10178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I64);
10179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_pair(r2));
10181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_F128toI64S, mkU32(encode_rounding_mode(r3)),
10182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        mkexpr(op)));
10183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(result));
10184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f128(S390_CC_OP_BFP_128_TO_INT_64, op);
10185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cgxbr";
10187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_DXBR(UChar r1, UChar r2)
10191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F128);
10193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F128);
10194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
10195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_pair(r1));
10197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_pair(r2));
10198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_DivF128, mkU32(Irrm_NEAREST), mkexpr(op1),
10199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        mkexpr(op2)));
10200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
10201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "dxbr";
10203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LTXBR(UChar r1, UChar r2)
10207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
10209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, get_fpr_pair(r2));
10211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
10212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
10213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ltxbr";
10215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LCXBR(UChar r1, UChar r2)
10219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
10221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_NegF128, get_fpr_pair(r2)));
10223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
10224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
10225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lcxbr";
10227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LXDBR(UChar r1, UChar r2)
10231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F64);
10233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_dw0(r2));
10235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, unop(Iop_F64toF128, mkexpr(op)));
10236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lxdbr";
10238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LXEBR(UChar r1, UChar r2)
10242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F32);
10244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, get_fpr_w0(r2));
10246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, unop(Iop_F32toF128, mkexpr(op)));
10247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lxebr";
10249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LXDB(UChar r1, IRTemp op2addr)
10253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F64);
10255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, load(Ity_F64, mkexpr(op2addr)));
10257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, unop(Iop_F64toF128, mkexpr(op)));
10258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lxdb";
10260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LXEB(UChar r1, IRTemp op2addr)
10264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F32);
10266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, load(Ity_F32, mkexpr(op2addr)));
10268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, unop(Iop_F32toF128, mkexpr(op)));
10269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lxeb";
10271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LNEBR(UChar r1, UChar r2)
10275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
10277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_NegF32, unop(Iop_AbsF32, get_fpr_w0(r2))));
10279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
10280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f(S390_CC_OP_BFP_RESULT_32, result);
10281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lnebr";
10283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LNDBR(UChar r1, UChar r2)
10287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
10289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_NegF64, unop(Iop_AbsF64, get_fpr_dw0(r2))));
10291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
10292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f(S390_CC_OP_BFP_RESULT_64, result);
10293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lndbr";
10295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LNXBR(UChar r1, UChar r2)
10299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
10301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_NegF128, unop(Iop_AbsF128, get_fpr_pair(r2))));
10303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
10304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
10305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lnxbr";
10307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LPEBR(UChar r1, UChar r2)
10311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
10313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_AbsF32, get_fpr_w0(r2)));
10315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
10316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f(S390_CC_OP_BFP_RESULT_32, result);
10317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lpebr";
10319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LPDBR(UChar r1, UChar r2)
10323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
10325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_AbsF64, get_fpr_dw0(r2)));
10327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
10328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f(S390_CC_OP_BFP_RESULT_64, result);
10329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lpdbr";
10331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LPXBR(UChar r1, UChar r2)
10335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
10337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_AbsF128, get_fpr_pair(r2)));
10339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
10340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
10341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lpxbr";
10343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LDXBR(UChar r1, UChar r2)
10347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
10349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_F128toF64, mkU32(Irrm_NEAREST), get_fpr_pair(r2)));
10351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
10352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ldxbr";
10354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LEXBR(UChar r1, UChar r2)
10358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
10360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_F128toF32, mkU32(Irrm_NEAREST), get_fpr_pair(r2)));
10362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
10363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lexbr";
10365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MXBR(UChar r1, UChar r2)
10369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F128);
10371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F128);
10372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
10373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_pair(r1));
10375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_pair(r2));
10376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_MulF128, mkU32(Irrm_NEAREST), mkexpr(op1),
10377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        mkexpr(op2)));
10378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
10379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mxbr";
10381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MAEBR(UChar r1, UChar r3, UChar r2)
10385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, qop(Iop_MAddF32, mkU32(Irrm_NEAREST),
10387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      get_fpr_w0(r1), get_fpr_w0(r2), get_fpr_w0(r3)));
10388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "maebr";
10390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MADBR(UChar r1, UChar r3, UChar r2)
10394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, qop(Iop_MAddF64, mkU32(Irrm_NEAREST),
10396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       get_fpr_dw0(r1), get_fpr_dw0(r2), get_fpr_dw0(r3)));
10397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "madbr";
10399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MAEB(UChar r3, IRTemp op2addr, UChar r1)
10403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op2 = load(Ity_F32, mkexpr(op2addr));
10405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, qop(Iop_MAddF32, mkU32(Irrm_NEAREST),
10407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      get_fpr_w0(r1), op2, get_fpr_w0(r3)));
10408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "maeb";
10410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MADB(UChar r3, IRTemp op2addr, UChar r1)
10414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op2 = load(Ity_F64, mkexpr(op2addr));
10416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, qop(Iop_MAddF64, mkU32(Irrm_NEAREST),
10418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       get_fpr_dw0(r1), op2, get_fpr_dw0(r3)));
10419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "madb";
10421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSEBR(UChar r1, UChar r3, UChar r2)
10425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, qop(Iop_MSubF32, mkU32(Irrm_NEAREST),
10427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      get_fpr_w0(r1), get_fpr_w0(r2), get_fpr_w0(r3)));
10428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msebr";
10430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSDBR(UChar r1, UChar r3, UChar r2)
10434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, qop(Iop_MSubF64, mkU32(Irrm_NEAREST),
10436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       get_fpr_dw0(r1), get_fpr_dw0(r2), get_fpr_dw0(r3)));
10437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msdbr";
10439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSEB(UChar r3, IRTemp op2addr, UChar r1)
10443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op2 = load(Ity_F32, mkexpr(op2addr));
10445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, qop(Iop_MSubF32, mkU32(Irrm_NEAREST),
10447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      get_fpr_w0(r1), op2, get_fpr_w0(r3)));
10448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "mseb";
10450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_MSDB(UChar r3, IRTemp op2addr, UChar r1)
10454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr *op2 = load(Ity_F64, mkexpr(op2addr));
10456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, qop(Iop_MSubF64, mkU32(Irrm_NEAREST),
10458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       get_fpr_dw0(r1), op2, get_fpr_dw0(r3)));
10459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "msdb";
10461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SQEBR(UChar r1, UChar r2)
10465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F32);
10467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_SqrtF32, mkU32(Irrm_NEAREST), get_fpr_w0(r2)));
10469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, mkexpr(result));
10470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sqebr";
10472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SQDBR(UChar r1, UChar r2)
10476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
10478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_SqrtF64, mkU32(Irrm_NEAREST), get_fpr_dw0(r2)));
10480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
10481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sqdbr";
10483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SQXBR(UChar r1, UChar r2)
10487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
10489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_SqrtF128, mkU32(Irrm_NEAREST), get_fpr_pair(r2)));
10491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
10492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sqxbr";
10494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SQEB(UChar r1, IRTemp op2addr)
10498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F32);
10500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, load(Ity_F32, mkexpr(op2addr)));
10502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_w0(r1, binop(Iop_SqrtF32, mkU32(Irrm_NEAREST), mkexpr(op)));
10503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sqeb";
10505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SQDB(UChar r1, IRTemp op2addr)
10509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_F64);
10511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, load(Ity_F64, mkexpr(op2addr)));
10513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, binop(Iop_SqrtF64, mkU32(Irrm_NEAREST), mkexpr(op)));
10514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sqdb";
10516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_SXBR(UChar r1, UChar r2)
10520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op1 = newTemp(Ity_F128);
10522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op2 = newTemp(Ity_F128);
10523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F128);
10524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op1, get_fpr_pair(r1));
10526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op2, get_fpr_pair(r2));
10527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, triop(Iop_SubF128, mkU32(Irrm_NEAREST), mkexpr(op1),
10528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        mkexpr(op2)));
10529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_pair(r1, mkexpr(result));
10530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
10531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "sxbr";
10533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TCEB(UChar r1, IRTemp op2addr)
10537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_F32);
10539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_fpr_w0(r1));
10541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putFZ(S390_CC_OP_BFP_TDC_32, value, op2addr);
10543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tceb";
10545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TCDB(UChar r1, IRTemp op2addr)
10549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_F64);
10551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_fpr_dw0(r1));
10553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_putFZ(S390_CC_OP_BFP_TDC_64, value, op2addr);
10555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tcdb";
10557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_TCXB(UChar r1, IRTemp op2addr)
10561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_F128);
10563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, get_fpr_pair(r1));
10565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put1f128Z(S390_CC_OP_BFP_TDC_128, value, op2addr);
10567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "tcxb";
10569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LCDFR(UChar r1, UChar r2)
10573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
10575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_NegF64, get_fpr_dw0(r2)));
10577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
10578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lcdfr";
10580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LNDFR(UChar r1, UChar r2)
10584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
10586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_NegF64, unop(Iop_AbsF64, get_fpr_dw0(r2))));
10588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
10589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lndfr";
10591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LPDFR(UChar r1, UChar r2)
10595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_F64);
10597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, unop(Iop_AbsF64, get_fpr_dw0(r2)));
10599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, mkexpr(result));
10600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lpdfr";
10602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LDGR(UChar r1, UChar r2)
10606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, unop(Iop_ReinterpI64asF64, get_gpr_dw0(r2)));
10608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "ldgr";
10610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_LGDR(UChar r1, UChar r2)
10614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, unop(Iop_ReinterpF64asI64, get_fpr_dw0(r2)));
10616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "lgdr";
10618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CPSDR(UChar r3, UChar r1, UChar r2)
10623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp sign  = newTemp(Ity_I64);
10625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp value = newTemp(Ity_I64);
10626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(sign, binop(Iop_And64, unop(Iop_ReinterpF64asI64, get_fpr_dw0(r3)),
10628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      mkU64(1ULL << 63)));
10629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(value, binop(Iop_And64, unop(Iop_ReinterpF64asI64, get_fpr_dw0(r2)),
10630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       mkU64((1ULL << 63) - 1)));
10631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_fpr_dw0(r1, unop(Iop_ReinterpI64asF64, binop(Iop_Or64, mkexpr(value),
10632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                    mkexpr(sign))));
10633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cpsdr";
10635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic IRExpr *
10639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_call_cvb(IRExpr *in)
10640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRExpr **args, *call;
10642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   args = mkIRExprVec_1(in);
10644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call = mkIRExprCCall(Ity_I32, 0 /*regparm*/,
10645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        "s390_do_cvb", &s390_do_cvb, args);
10646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Nothing is excluded from definedness checking. */
10648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call->Iex.CCall.cee->mcx_mask = 0;
10649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return call;
10651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CVB(UChar r1, IRTemp op2addr)
10655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, s390_call_cvb(load(Ity_I64, mkexpr(op2addr))));
10657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cvb";
10659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CVBY(UChar r1, IRTemp op2addr)
10663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, s390_call_cvb(load(Ity_I64, mkexpr(op2addr))));
10665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cvby";
10667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *
10671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_cvd(IRExpr *in)
10672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call;
10674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   args = mkIRExprVec_1(in);
10676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call = mkIRExprCCall(Ity_I64, 0 /*regparm*/,
10677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                        "s390_do_cvd", &s390_do_cvd, args);
10678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Nothing is excluded from definedness checking. */
10680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   call->Iex.CCall.cee->mcx_mask = 0;
10681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return call;
10683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CVD(UChar r1, IRTemp op2addr)
10687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   store(mkexpr(op2addr), s390_call_cvd(unop(Iop_32Uto64, get_gpr_w1(r1))));
10689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cvd";
10691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CVDY(UChar r1, IRTemp op2addr)
10695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   store(mkexpr(op2addr), s390_call_cvd(get_gpr_w1(r1)));
10697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cvdy";
10699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_FLOGR(UChar r1, UChar r2)
10703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp input    = newTemp(Ity_I64);
10705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp not_zero = newTemp(Ity_I64);
10706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp tmpnum   = newTemp(Ity_I64);
10707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp num      = newTemp(Ity_I64);
10708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp shift_amount = newTemp(Ity_I8);
10709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* We use the "count leading zeroes" operator because the number of
10711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      leading zeroes is identical with the bit position of the first '1' bit.
10712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      However, that operator does not work when the input value is zero.
10713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Therefore, we set the LSB of the input value to 1 and use Clz64 on
10714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      the modified value. If input == 0, then the result is 64. Otherwise,
10715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      the result of Clz64 is what we want. */
10716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(input, get_gpr_dw0(r2));
10718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(not_zero, binop(Iop_Or64, mkexpr(input), mkU64(1)));
10719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(tmpnum, unop(Iop_Clz64, mkexpr(not_zero)));
10720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* num = (input == 0) ? 64 : tmpnum */
10722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(num, mkite(binop(Iop_CmpEQ64, mkexpr(input), mkU64(0)),
10723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     /* == 0 */ mkU64(64),
10724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     /* != 0 */ mkexpr(tmpnum)));
10725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1, mkexpr(num));
10727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Set the leftmost '1' bit of the input value to zero. The general scheme
10729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      is to first shift the input value by NUM + 1 bits to the left which
10730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      causes the leftmost '1' bit to disappear. Then we shift logically to
10731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      the right by NUM + 1 bits. Because the semantics of Iop_Shl64 and
10732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Iop_Shr64 are undefined if the shift-amount is greater than or equal to
10733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      the width of the value-to-be-shifted, we need to special case
10734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      NUM + 1 >= 64. This is equivalent to INPUT != 0 && INPUT != 1.
10735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      For both such INPUT values the result will be 0. */
10736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(shift_amount, unop(Iop_64to8, binop(Iop_Add64, mkexpr(num),
10738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                          mkU64(1))));
10739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r1 + 1,
10741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               mkite(binop(Iop_CmpLE64U, mkexpr(input), mkU64(1)),
10742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     /* == 0 || == 1*/ mkU64(0),
10743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     /* otherwise */
10744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                     binop(Iop_Shr64,
10745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           binop(Iop_Shl64, mkexpr(input),
10746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 mkexpr(shift_amount)),
10747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           mkexpr(shift_amount))));
10748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Compare the original value as an unsigned integer with 0. */
10750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, input,
10751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      mktemp(Ity_I64, mkU64(0)), False);
10752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "flogr";
10754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STCK(IRTemp op2addr)
10758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRDirty *d;
10760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc = newTemp(Ity_I64);
10761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_STCK",
10763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         &s390x_dirtyhelper_STCK,
10764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         mkIRExprVec_1(mkexpr(op2addr)));
10765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mFx   = Ifx_Write;
10766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mAddr = mkexpr(op2addr);
10767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mSize = 8;
10768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Dirty(d));
10769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(mkU64(S390_CC_OP_SET),
10770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      mkexpr(cc), mkU64(0), mkU64(0));
10771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stck";
10772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STCKF(IRTemp op2addr)
10776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRDirty *d;
10778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc = newTemp(Ity_I64);
10779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_STCKF",
10781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         &s390x_dirtyhelper_STCKF,
10782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         mkIRExprVec_1(mkexpr(op2addr)));
10783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mFx   = Ifx_Write;
10784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mAddr = mkexpr(op2addr);
10785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mSize = 8;
10786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Dirty(d));
10787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(mkU64(S390_CC_OP_SET),
10788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      mkexpr(cc), mkU64(0), mkU64(0));
10789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stckf";
10790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STCKE(IRTemp op2addr)
10794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRDirty *d;
10796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc = newTemp(Ity_I64);
10797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_STCKE",
10799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         &s390x_dirtyhelper_STCKE,
10800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         mkIRExprVec_1(mkexpr(op2addr)));
10801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mFx   = Ifx_Write;
10802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mAddr = mkexpr(op2addr);
10803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mSize = 16;
10804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Dirty(d));
10805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(mkU64(S390_CC_OP_SET),
10806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      mkexpr(cc), mkU64(0), mkU64(0));
10807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stcke";
10808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_STFLE(IRTemp op2addr)
10812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRDirty *d;
10814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp cc = newTemp(Ity_I64);
10815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_STFLE",
10817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         &s390x_dirtyhelper_STFLE,
10818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         mkIRExprVec_1(mkexpr(op2addr)));
10819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->needsBBP = 1;  /* Need to pass pointer to guest state to helper */
10821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   d->nFxState = 1;
10823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vex_bzero(&d->fxState, sizeof(d->fxState));
10824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->fxState[0].fx     = Ifx_Modify;  /* read then write */
10826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->fxState[0].offset = S390X_GUEST_OFFSET(guest_r0);
10827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->fxState[0].size   = sizeof(ULong);
10828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mAddr = mkexpr(op2addr);
10830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Pretend all double words are written */
10831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mSize = S390_NUM_FACILITY_DW * sizeof(ULong);
10832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   d->mFx   = Ifx_Write;
10833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   stmt(IRStmt_Dirty(d));
10835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_thunk_fill(mkU64(S390_CC_OP_SET), mkexpr(cc), mkU64(0), mkU64(0));
10837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "stfle";
10839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic HChar *
10842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_CKSM(UChar r1,UChar r2)
10843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp addr = newTemp(Ity_I64);
10845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp op = newTemp(Ity_I32);
10846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp len = newTemp(Ity_I64);
10847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp oldval = newTemp(Ity_I32);
10848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp mask = newTemp(Ity_I32);
10849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp newop = newTemp(Ity_I32);
10850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result = newTemp(Ity_I32);
10851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp result1 = newTemp(Ity_I32);
10852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   IRTemp inc = newTemp(Ity_I64);
10853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(oldval, get_gpr_w1(r1));
10855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(addr, get_gpr_dw0(r2));
10856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(len, get_gpr_dw0(r2+1));
10857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Condition code is always zero. */
10859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_cc_set(0);
10860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* If length is zero, there is no need to calculate the checksum */
10862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, mkexpr(len), mkU64(0)));
10863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Assiging the increment variable to adjust address and length
10865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      later on. */
10866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(inc, mkite(binop(Iop_CmpLT64U, mkexpr(len), mkU64(4)),
10867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           mkexpr(len), mkU64(4)));
10868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* If length < 4 the final 4-byte 2nd operand value is computed by
10870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      appending the remaining bytes to the right with 0. This is done
10871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      by AND'ing the 4 bytes loaded from memory with an appropriate
10872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      mask. If length >= 4, that mask is simply 0xffffffff. */
10873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(mask, mkite(binop(Iop_CmpLT64U, mkexpr(len), mkU64(4)),
10875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      /* Mask computation when len < 4:
10876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         0xffffffff << (32 - (len % 4)*8) */
10877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      binop(Iop_Shl32, mkU32(0xffffffff),
10878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            unop(Iop_32to8,
10879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 binop(Iop_Sub32, mkU32(32),
10880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       binop(Iop_Shl32,
10881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                             unop(Iop_64to32,
10882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                  binop(Iop_And64,
10883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                        mkexpr(len), mkU64(3))),
10884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                             mkU8(3))))),
10885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                      mkU32(0xffffffff)));
10886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(op, load(Ity_I32, mkexpr(addr)));
10888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(newop, binop(Iop_And32, mkexpr(op), mkexpr(mask)));
10889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result, binop(Iop_Add32, mkexpr(newop), mkexpr(oldval)));
10890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Checking for carry */
10892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assign(result1, mkite(binop(Iop_CmpLT32U, mkexpr(result), mkexpr(newop)),
10893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         binop(Iop_Add32, mkexpr(result), mkU32(1)),
10894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                         mkexpr(result)));
10895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_w1(r1, mkexpr(result1));
10897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2, binop(Iop_Add64, mkexpr(addr), mkexpr(inc)));
10898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(r2+1, binop(Iop_Sub64, mkexpr(len), mkexpr(inc)));
10899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate_if(binop(Iop_CmpNE64, mkexpr(len), mkU64(0)));
10901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return "cksm";
10903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
10904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic HChar *
10906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_TROO(UChar m3, UChar r1, UChar r2)
10907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
10908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp src_addr, des_addr, tab_addr, src_len, test_byte;
10909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_addr = newTemp(Ity_I64);
10910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   des_addr = newTemp(Ity_I64);
10911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   tab_addr = newTemp(Ity_I64);
10912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_byte = newTemp(Ity_I8);
10913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_len = newTemp(Ity_I64);
10914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_addr, get_gpr_dw0(r2));
10916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(des_addr, get_gpr_dw0(r1));
10917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(tab_addr, get_gpr_dw0(1));
10918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_len, get_gpr_dw0(r1+1));
10919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(test_byte, get_gpr_b7(0));
10920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op = newTemp(Ity_I8);
10922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1 = newTemp(Ity_I8);
10923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp result = newTemp(Ity_I64);
10924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* End of source string? We're done; proceed to next insn */
10926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
10927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, mkexpr(src_len), mkU64(0)));
10928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Load character from source string, index translation table and
10930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      store translated character in op1. */
10931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op, load(Ity_I8, mkexpr(src_addr)));
10932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(result, binop(Iop_Add64, unop(Iop_8Uto64, mkexpr(op)),
10934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        mkexpr(tab_addr)));
10935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1, load(Ity_I8, mkexpr(result)));
10936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (! s390_host_has_etf2 || (m3 & 0x1) == 0) {
10938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_cc_set(1);
10939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      next_insn_if(binop(Iop_CmpEQ8, mkexpr(op1), mkexpr(test_byte)));
10940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
10941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   store(get_gpr_dw0(r1), mkexpr(op1));
10942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(des_addr), mkU64(1)));
10944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2, binop(Iop_Add64, mkexpr(src_addr), mkU64(1)));
10945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1+1, binop(Iop_Sub64, mkexpr(src_len), mkU64(1)));
10946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
10948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "troo";
10950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
10951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic HChar *
10953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_TRTO(UChar m3, UChar r1, UChar r2)
10954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
10955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp src_addr, des_addr, tab_addr, src_len, test_byte;
10956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_addr = newTemp(Ity_I64);
10957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   des_addr = newTemp(Ity_I64);
10958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   tab_addr = newTemp(Ity_I64);
10959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_byte = newTemp(Ity_I8);
10960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_len = newTemp(Ity_I64);
10961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_addr, get_gpr_dw0(r2));
10963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(des_addr, get_gpr_dw0(r1));
10964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(tab_addr, get_gpr_dw0(1));
10965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_len, get_gpr_dw0(r1+1));
10966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(test_byte, get_gpr_b7(0));
10967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op = newTemp(Ity_I16);
10969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1 = newTemp(Ity_I8);
10970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp result = newTemp(Ity_I64);
10971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* End of source string? We're done; proceed to next insn */
10973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
10974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, mkexpr(src_len), mkU64(0)));
10975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Load character from source string, index translation table and
10977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      store translated character in op1. */
10978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op, load(Ity_I16, mkexpr(src_addr)));
10979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(result, binop(Iop_Add64, unop(Iop_16Uto64, mkexpr(op)),
10981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        mkexpr(tab_addr)));
10982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1, load(Ity_I8, mkexpr(result)));
10984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (! s390_host_has_etf2 || (m3 & 0x1) == 0) {
10986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_cc_set(1);
10987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      next_insn_if(binop(Iop_CmpEQ8, mkexpr(op1), mkexpr(test_byte)));
10988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
10989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   store(get_gpr_dw0(r1), mkexpr(op1));
10990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2, binop(Iop_Add64, mkexpr(src_addr), mkU64(2)));
10992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(des_addr), mkU64(1)));
10993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1+1, binop(Iop_Sub64, mkexpr(src_len), mkU64(2)));
10994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
10996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "trto";
10998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
10999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic HChar *
11001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_TROT(UChar m3, UChar r1, UChar r2)
11002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp src_addr, des_addr, tab_addr, src_len, test_byte;
11004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_addr = newTemp(Ity_I64);
11005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   des_addr = newTemp(Ity_I64);
11006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   tab_addr = newTemp(Ity_I64);
11007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_byte = newTemp(Ity_I16);
11008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_len = newTemp(Ity_I64);
11009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_addr, get_gpr_dw0(r2));
11011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(des_addr, get_gpr_dw0(r1));
11012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(tab_addr, get_gpr_dw0(1));
11013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_len, get_gpr_dw0(r1+1));
11014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(test_byte, get_gpr_hw3(0));
11015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op = newTemp(Ity_I8);
11017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1 = newTemp(Ity_I16);
11018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp result = newTemp(Ity_I64);
11019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* End of source string? We're done; proceed to next insn */
11021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
11022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, mkexpr(src_len), mkU64(0)));
11023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Load character from source string, index translation table and
11025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      store translated character in op1. */
11026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op, binop(Iop_Shl8, load(Ity_I8, mkexpr(src_addr)), mkU8(1)));
11027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(result, binop(Iop_Add64, unop(Iop_8Uto64, mkexpr(op)),
11029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        mkexpr(tab_addr)));
11030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1, load(Ity_I16, mkexpr(result)));
11031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (! s390_host_has_etf2 || (m3 & 0x1) == 0) {
11033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_cc_set(1);
11034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      next_insn_if(binop(Iop_CmpEQ16, mkexpr(op1), mkexpr(test_byte)));
11035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
11036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   store(get_gpr_dw0(r1), mkexpr(op1));
11037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2, binop(Iop_Add64, mkexpr(src_addr), mkU64(1)));
11039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(des_addr), mkU64(2)));
11040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1+1, binop(Iop_Sub64, mkexpr(src_len), mkU64(1)));
11041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
11043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "trot";
11045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic HChar *
11048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_TRTT(UChar m3, UChar r1, UChar r2)
11049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp src_addr, des_addr, tab_addr, src_len, test_byte;
11051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_addr = newTemp(Ity_I64);
11052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   des_addr = newTemp(Ity_I64);
11053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   tab_addr = newTemp(Ity_I64);
11054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_byte = newTemp(Ity_I16);
11055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_len = newTemp(Ity_I64);
11056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_addr, get_gpr_dw0(r2));
11058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(des_addr, get_gpr_dw0(r1));
11059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(tab_addr, get_gpr_dw0(1));
11060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_len, get_gpr_dw0(r1+1));
11061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(test_byte, get_gpr_hw3(0));
11062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11063663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op = newTemp(Ity_I16);
11064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1 = newTemp(Ity_I16);
11065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp result = newTemp(Ity_I64);
11066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* End of source string? We're done; proceed to next insn */
11068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
11069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, mkexpr(src_len), mkU64(0)));
11070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Load character from source string, index translation table and
11072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      store translated character in op1. */
11073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op, binop(Iop_Shl16, load(Ity_I16, mkexpr(src_addr)), mkU8(1)));
11074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(result, binop(Iop_Add64, unop(Iop_16Uto64, mkexpr(op)),
11076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        mkexpr(tab_addr)));
11077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1, load(Ity_I16, mkexpr(result)));
11078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (! s390_host_has_etf2 || (m3 & 0x1) == 0) {
11080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_cc_set(1);
11081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      next_insn_if(binop(Iop_CmpEQ16, mkexpr(op1), mkexpr(test_byte)));
11082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
11083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   store(get_gpr_dw0(r1), mkexpr(op1));
11085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2, binop(Iop_Add64, mkexpr(src_addr), mkU64(2)));
11087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(des_addr), mkU64(2)));
11088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1+1, binop(Iop_Sub64, mkexpr(src_len), mkU64(2)));
11089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
11091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "trtt";
11093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic HChar *
11096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_TR(UChar length, IRTemp start1, IRTemp start2)
11097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len = newTemp(Ity_I64);
11099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len, mkU64(length));
11101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_TR_EX(len, start1, start2);
11102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "tr";
11104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic HChar *
11107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_TRE(UChar r1,UChar r2)
11108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp src_addr, tab_addr, src_len, test_byte;
11110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_addr = newTemp(Ity_I64);
11111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   tab_addr = newTemp(Ity_I64);
11112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   src_len = newTemp(Ity_I64);
11113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test_byte = newTemp(Ity_I8);
11114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_addr, get_gpr_dw0(r1));
11116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(src_len, get_gpr_dw0(r1+1));
11117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(tab_addr, get_gpr_dw0(r2));
11118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(test_byte, get_gpr_b7(0));
11119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op = newTemp(Ity_I8);
11121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp op1 = newTemp(Ity_I8);
11122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp result = newTemp(Ity_I64);
11123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* End of source string? We're done; proceed to next insn */
11125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
11126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, mkexpr(src_len), mkU64(0)));
11127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Load character from source string and compare with test byte */
11129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op, load(Ity_I8, mkexpr(src_addr)));
11130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(1);
11132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ8, mkexpr(op), mkexpr(test_byte)));
11133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(result, binop(Iop_Add64, unop(Iop_8Uto64, mkexpr(op)),
11135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng			mkexpr(tab_addr)));
11136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(op1, load(Ity_I8, mkexpr(result)));
11138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   store(get_gpr_dw0(r1), mkexpr(op1));
11140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(src_addr), mkU64(1)));
11141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1+1, binop(Iop_Sub64, mkexpr(src_len), mkU64(1)));
11142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
11144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "tre";
11146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *
11149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_cu21(IRExpr *srcval, IRExpr *low_surrogate)
11150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call;
11152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   args = mkIRExprVec_2(srcval, low_surrogate);
11153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call = mkIRExprCCall(Ity_I64, 0 /*regparm*/,
11154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       "s390_do_cu21", &s390_do_cu21, args);
11155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Nothing is excluded from definedness checking. */
11157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call->Iex.CCall.cee->mcx_mask = 0;
11158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return call;
11160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic HChar *
11163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CU21(UChar m3, UChar r1, UChar r2)
11164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr1 = newTemp(Ity_I64);
11166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr2 = newTemp(Ity_I64);
11167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len1 = newTemp(Ity_I64);
11168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len2 = newTemp(Ity_I64);
11169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr1, get_gpr_dw0(r1));
11171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr2, get_gpr_dw0(r2));
11172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len1, get_gpr_dw0(r1 + 1));
11173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len2, get_gpr_dw0(r2 + 1));
11174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* We're processing the 2nd operand 2 bytes at a time. Therefore, if
11176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      there are less than 2 bytes left, then the 2nd operand is exhausted
11177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      and we're done here. cc = 0 */
11178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
11179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len2), mkU64(2)));
11180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* There are at least two bytes there. Read them. */
11182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp srcval = newTemp(Ity_I32);
11183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(srcval, unop(Iop_16Uto32, load(Ity_I16, mkexpr(addr2))));
11184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Find out whether this is a high surrogate. I.e. SRCVAL lies
11186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      inside the interval [0xd800 - 0xdbff] */
11187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp  is_high_surrogate = newTemp(Ity_I32);
11188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *flag1 = mkite(binop(Iop_CmpLE32U, mkU32(0xd800), mkexpr(srcval)),
11189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         mkU32(1), mkU32(0));
11190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *flag2 = mkite(binop(Iop_CmpLE32U, mkexpr(srcval), mkU32(0xdbff)),
11191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         mkU32(1), mkU32(0));
11192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(is_high_surrogate, binop(Iop_And32, flag1, flag2));
11193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* If SRCVAL is a high surrogate and there are less than 4 bytes left,
11195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      then the 2nd operand is exhausted and we're done here. cc = 0 */
11196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *not_enough_bytes =
11197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mkite(binop(Iop_CmpLT64U, mkexpr(len2), mkU64(4)), mkU32(1), mkU32(0));
11198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ32,
11200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      binop(Iop_And32, mkexpr(is_high_surrogate),
11201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            not_enough_bytes), mkU32(1)));
11202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* The 2nd operand is not exhausted. If the first 2 bytes are a high
11204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      surrogate, read the next two bytes (low surrogate). */
11205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp  low_surrogate = newTemp(Ity_I32);
11206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *low_surrogate_addr = binop(Iop_Add64, mkexpr(addr2), mkU64(2));
11207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(low_surrogate,
11209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          mkite(binop(Iop_CmpEQ32, mkexpr(is_high_surrogate), mkU32(1)),
11210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                unop(Iop_16Uto32, load(Ity_I16, low_surrogate_addr)),
11211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                mkU32(0)));  // any value is fine; it will not be used
11212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Call the helper */
11214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp retval = newTemp(Ity_I64);
11215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(retval, s390_call_cu21(unop(Iop_32Uto64, mkexpr(srcval)),
11216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 unop(Iop_32Uto64, mkexpr(low_surrogate))));
11217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Before we can test whether the 1st operand is exhausted we need to
11219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      test for an invalid low surrogate. Because cc=2 outranks cc=1. */
11220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (s390_host_has_etf3 && (m3 & 0x1) == 1) {
11221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      IRExpr *invalid_low_surrogate =
11222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         binop(Iop_And64, mkexpr(retval), mkU64(0xff));
11223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_cc_set(2);
11225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      next_insn_if(binop(Iop_CmpEQ64, invalid_low_surrogate, mkU64(1)));
11226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
11227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Now test whether the 1st operand is exhausted */
11229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp num_bytes = newTemp(Ity_I64);
11230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(num_bytes, binop(Iop_And64,
11231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           binop(Iop_Shr64, mkexpr(retval), mkU8(8)),
11232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           mkU64(0xff)));
11233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(1);
11234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len1), mkexpr(num_bytes)));
11235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Extract the bytes to be stored at addr1 */
11237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp data = newTemp(Ity_I64);
11238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(data, binop(Iop_Shr64, mkexpr(retval), mkU8(16)));
11239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* To store the bytes construct 4 dirty helper calls. The helper calls
11241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      are guarded (num_bytes == 1, num_bytes == 2, etc) such that only
11242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      one of them will be called at runtime. */
11243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int i;
11244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (i = 1; i <= 4; ++i) {
11245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      IRDirty *d;
11246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d = unsafeIRDirty_0_N(0 /* regparms */, "s390x_dirtyhelper_CUxy",
11248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            &s390x_dirtyhelper_CUxy,
11249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            mkIRExprVec_3(mkexpr(addr1), mkexpr(data),
11250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          mkexpr(num_bytes)));
11251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->guard = binop(Iop_CmpEQ64, mkexpr(num_bytes), mkU64(i));
11252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mFx   = Ifx_Write;
11253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mAddr = mkexpr(addr1);
11254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mSize = i;
11255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      stmt(IRStmt_Dirty(d));
11256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
11257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update source address and length */
11259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp num_src_bytes = newTemp(Ity_I64);
11260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(num_src_bytes,
11261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          mkite(binop(Iop_CmpEQ32, mkexpr(is_high_surrogate), mkU32(1)),
11262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                mkU64(4), mkU64(2)));
11263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2,     binop(Iop_Add64, mkexpr(addr2), mkexpr(num_src_bytes)));
11264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2 + 1, binop(Iop_Sub64, mkexpr(len2),  mkexpr(num_src_bytes)));
11265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update destination address and length */
11267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1,     binop(Iop_Add64, mkexpr(addr1), mkexpr(num_bytes)));
11268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1 + 1, binop(Iop_Sub64, mkexpr(len1),  mkexpr(num_bytes)));
11269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
11271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cu21";
11273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *
11276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_cu24(IRExpr *srcval, IRExpr *low_surrogate)
11277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call;
11279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   args = mkIRExprVec_2(srcval, low_surrogate);
11280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call = mkIRExprCCall(Ity_I64, 0 /*regparm*/,
11281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       "s390_do_cu24", &s390_do_cu24, args);
11282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Nothing is excluded from definedness checking. */
11284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call->Iex.CCall.cee->mcx_mask = 0;
11285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return call;
11287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic HChar *
11290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CU24(UChar m3, UChar r1, UChar r2)
11291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr1 = newTemp(Ity_I64);
11293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr2 = newTemp(Ity_I64);
11294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len1 = newTemp(Ity_I64);
11295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len2 = newTemp(Ity_I64);
11296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr1, get_gpr_dw0(r1));
11298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr2, get_gpr_dw0(r2));
11299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len1, get_gpr_dw0(r1 + 1));
11300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len2, get_gpr_dw0(r2 + 1));
11301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* We're processing the 2nd operand 2 bytes at a time. Therefore, if
11303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      there are less than 2 bytes left, then the 2nd operand is exhausted
11304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      and we're done here. cc = 0 */
11305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
11306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len2), mkU64(2)));
11307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* There are at least two bytes there. Read them. */
11309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp srcval = newTemp(Ity_I32);
11310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(srcval, unop(Iop_16Uto32, load(Ity_I16, mkexpr(addr2))));
11311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Find out whether this is a high surrogate. I.e. SRCVAL lies
11313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      inside the interval [0xd800 - 0xdbff] */
11314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp  is_high_surrogate = newTemp(Ity_I32);
11315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *flag1 = mkite(binop(Iop_CmpLE32U, mkU32(0xd800), mkexpr(srcval)),
11316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         mkU32(1), mkU32(0));
11317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *flag2 = mkite(binop(Iop_CmpLE32U, mkexpr(srcval), mkU32(0xdbff)),
11318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         mkU32(1), mkU32(0));
11319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(is_high_surrogate, binop(Iop_And32, flag1, flag2));
11320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* If SRCVAL is a high surrogate and there are less than 4 bytes left,
11322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      then the 2nd operand is exhausted and we're done here. cc = 0 */
11323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *not_enough_bytes =
11324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      mkite(binop(Iop_CmpLT64U, mkexpr(len2), mkU64(4)), mkU32(1), mkU32(0));
11325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ32,
11327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      binop(Iop_And32, mkexpr(is_high_surrogate),
11328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            not_enough_bytes),
11329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      mkU32(1)));
11330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* The 2nd operand is not exhausted. If the first 2 bytes are a high
11332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      surrogate, read the next two bytes (low surrogate). */
11333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp  low_surrogate = newTemp(Ity_I32);
11334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *low_surrogate_addr = binop(Iop_Add64, mkexpr(addr2), mkU64(2));
11335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(low_surrogate,
11337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          mkite(binop(Iop_CmpEQ32, mkexpr(is_high_surrogate), mkU32(1)),
11338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                unop(Iop_16Uto32, load(Ity_I16, low_surrogate_addr)),
11339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                mkU32(0)));  // any value is fine; it will not be used
11340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Call the helper */
11342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp retval = newTemp(Ity_I64);
11343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(retval, s390_call_cu24(unop(Iop_32Uto64, mkexpr(srcval)),
11344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 unop(Iop_32Uto64, mkexpr(low_surrogate))));
11345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Before we can test whether the 1st operand is exhausted we need to
11347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      test for an invalid low surrogate. Because cc=2 outranks cc=1. */
11348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (s390_host_has_etf3 && (m3 & 0x1) == 1) {
11349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      IRExpr *invalid_low_surrogate =
11350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         binop(Iop_And64, mkexpr(retval), mkU64(0xff));
11351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      s390_cc_set(2);
11353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      next_insn_if(binop(Iop_CmpEQ64, invalid_low_surrogate, mkU64(1)));
11354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
11355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Now test whether the 1st operand is exhausted */
11357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(1);
11358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len1), mkU64(4)));
11359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Extract the bytes to be stored at addr1 */
11361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *data = unop(Iop_64to32, binop(Iop_Shr64, mkexpr(retval), mkU8(8)));
11362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   store(mkexpr(addr1), data);
11364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update source address and length */
11366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp num_src_bytes = newTemp(Ity_I64);
11367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(num_src_bytes,
11368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          mkite(binop(Iop_CmpEQ32, mkexpr(is_high_surrogate), mkU32(1)),
11369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                mkU64(4), mkU64(2)));
11370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2,     binop(Iop_Add64, mkexpr(addr2), mkexpr(num_src_bytes)));
11371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2 + 1, binop(Iop_Sub64, mkexpr(len2),  mkexpr(num_src_bytes)));
11372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update destination address and length */
11374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1,     binop(Iop_Add64, mkexpr(addr1), mkU64(4)));
11375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1 + 1, binop(Iop_Sub64, mkexpr(len1),  mkU64(4)));
11376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
11378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cu24";
11380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *
11383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_cu42(IRExpr *srcval)
11384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call;
11386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   args = mkIRExprVec_1(srcval);
11387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call = mkIRExprCCall(Ity_I64, 0 /*regparm*/,
11388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       "s390_do_cu42", &s390_do_cu42, args);
11389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Nothing is excluded from definedness checking. */
11391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call->Iex.CCall.cee->mcx_mask = 0;
11392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return call;
11394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic HChar *
11397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CU42(UChar r1, UChar r2)
11398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr1 = newTemp(Ity_I64);
11400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr2 = newTemp(Ity_I64);
11401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len1 = newTemp(Ity_I64);
11402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len2 = newTemp(Ity_I64);
11403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr1, get_gpr_dw0(r1));
11405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr2, get_gpr_dw0(r2));
11406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len1, get_gpr_dw0(r1 + 1));
11407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len2, get_gpr_dw0(r2 + 1));
11408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* We're processing the 2nd operand 4 bytes at a time. Therefore, if
11410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      there are less than 4 bytes left, then the 2nd operand is exhausted
11411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      and we're done here. cc = 0 */
11412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
11413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len2), mkU64(4)));
11414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Read the 2nd operand. */
11416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp srcval = newTemp(Ity_I32);
11417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(srcval, load(Ity_I32, mkexpr(addr2)));
11418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Call the helper */
11420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp retval = newTemp(Ity_I64);
11421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(retval, s390_call_cu42(unop(Iop_32Uto64, mkexpr(srcval))));
11422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* If the UTF-32 character was invalid, set cc=2 and we're done.
11424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      cc=2 outranks cc=1 (1st operand exhausted) */
11425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *invalid_character = binop(Iop_And64, mkexpr(retval), mkU64(0xff));
11426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(2);
11428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, invalid_character, mkU64(1)));
11429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Now test whether the 1st operand is exhausted */
11431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp num_bytes = newTemp(Ity_I64);
11432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(num_bytes, binop(Iop_And64,
11433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           binop(Iop_Shr64, mkexpr(retval), mkU8(8)),
11434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           mkU64(0xff)));
11435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(1);
11436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len1), mkexpr(num_bytes)));
11437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Extract the bytes to be stored at addr1 */
11439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp data = newTemp(Ity_I64);
11440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(data, binop(Iop_Shr64, mkexpr(retval), mkU8(16)));
11441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* To store the bytes construct 2 dirty helper calls. The helper calls
11443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      are guarded (num_bytes == 2 and num_bytes == 4, respectively) such
11444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      that only one of them will be called at runtime. */
11445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Int i;
11447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (i = 2; i <= 4; ++i) {
11448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      IRDirty *d;
11449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (i == 3) continue;  // skip this one
11451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d = unsafeIRDirty_0_N(0 /* regparms */, "s390x_dirtyhelper_CUxy",
11453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            &s390x_dirtyhelper_CUxy,
11454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            mkIRExprVec_3(mkexpr(addr1), mkexpr(data),
11455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          mkexpr(num_bytes)));
11456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->guard = binop(Iop_CmpEQ64, mkexpr(num_bytes), mkU64(i));
11457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mFx   = Ifx_Write;
11458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mAddr = mkexpr(addr1);
11459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mSize = i;
11460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      stmt(IRStmt_Dirty(d));
11461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
11462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update source address and length */
11464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2,     binop(Iop_Add64, mkexpr(addr2), mkU64(4)));
11465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2 + 1, binop(Iop_Sub64, mkexpr(len2),  mkU64(4)));
11466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update destination address and length */
11468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1,     binop(Iop_Add64, mkexpr(addr1), mkexpr(num_bytes)));
11469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1 + 1, binop(Iop_Sub64, mkexpr(len1),  mkexpr(num_bytes)));
11470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
11472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cu42";
11474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *
11477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_cu41(IRExpr *srcval)
11478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call;
11480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   args = mkIRExprVec_1(srcval);
11481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call = mkIRExprCCall(Ity_I64, 0 /*regparm*/,
11482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       "s390_do_cu41", &s390_do_cu41, args);
11483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Nothing is excluded from definedness checking. */
11485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call->Iex.CCall.cee->mcx_mask = 0;
11486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return call;
11488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic HChar *
11491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CU41(UChar r1, UChar r2)
11492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr1 = newTemp(Ity_I64);
11494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr2 = newTemp(Ity_I64);
11495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len1 = newTemp(Ity_I64);
11496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len2 = newTemp(Ity_I64);
11497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr1, get_gpr_dw0(r1));
11499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr2, get_gpr_dw0(r2));
11500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len1, get_gpr_dw0(r1 + 1));
11501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len2, get_gpr_dw0(r2 + 1));
11502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* We're processing the 2nd operand 4 bytes at a time. Therefore, if
11504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      there are less than 4 bytes left, then the 2nd operand is exhausted
11505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      and we're done here. cc = 0 */
11506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
11507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len2), mkU64(4)));
11508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Read the 2nd operand. */
11510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp srcval = newTemp(Ity_I32);
11511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(srcval, load(Ity_I32, mkexpr(addr2)));
11512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Call the helper */
11514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp retval = newTemp(Ity_I64);
11515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(retval, s390_call_cu41(unop(Iop_32Uto64, mkexpr(srcval))));
11516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* If the UTF-32 character was invalid, set cc=2 and we're done.
11518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      cc=2 outranks cc=1 (1st operand exhausted) */
11519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *invalid_character = binop(Iop_And64, mkexpr(retval), mkU64(0xff));
11520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(2);
11522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpEQ64, invalid_character, mkU64(1)));
11523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Now test whether the 1st operand is exhausted */
11525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp num_bytes = newTemp(Ity_I64);
11526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(num_bytes, binop(Iop_And64,
11527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           binop(Iop_Shr64, mkexpr(retval), mkU8(8)),
11528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           mkU64(0xff)));
11529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(1);
11530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len1), mkexpr(num_bytes)));
11531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Extract the bytes to be stored at addr1 */
11533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp data = newTemp(Ity_I64);
11534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(data, binop(Iop_Shr64, mkexpr(retval), mkU8(16)));
11535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* To store the bytes construct 4 dirty helper calls. The helper calls
11537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      are guarded (num_bytes == 1, num_bytes == 2, etc) such that only
11538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      one of them will be called at runtime. */
11539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int i;
11540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (i = 1; i <= 4; ++i) {
11541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      IRDirty *d;
11542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d = unsafeIRDirty_0_N(0 /* regparms */, "s390x_dirtyhelper_CUxy",
11544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            &s390x_dirtyhelper_CUxy,
11545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                            mkIRExprVec_3(mkexpr(addr1), mkexpr(data),
11546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          mkexpr(num_bytes)));
11547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->guard = binop(Iop_CmpEQ64, mkexpr(num_bytes), mkU64(i));
11548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mFx   = Ifx_Write;
11549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mAddr = mkexpr(addr1);
11550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      d->mSize = i;
11551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      stmt(IRStmt_Dirty(d));
11552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
11553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update source address and length */
11555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2,     binop(Iop_Add64, mkexpr(addr2), mkU64(4)));
11556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2 + 1, binop(Iop_Sub64, mkexpr(len2),  mkU64(4)));
11557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update destination address and length */
11559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1,     binop(Iop_Add64, mkexpr(addr1), mkexpr(num_bytes)));
11560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1 + 1, binop(Iop_Sub64, mkexpr(len1),  mkexpr(num_bytes)));
11561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
11563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cu41";
11565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *
11568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_cu12_cu14_helper1(IRExpr *byte1, IRExpr *etf3_and_m3_is_1)
11569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call;
11571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   args = mkIRExprVec_2(byte1, etf3_and_m3_is_1);
11572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call = mkIRExprCCall(Ity_I64, 0 /*regparm*/, "s390_do_cu12_cu14_helper1",
11573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        &s390_do_cu12_cu14_helper1, args);
11574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Nothing is excluded from definedness checking. */
11576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call->Iex.CCall.cee->mcx_mask = 0;
11577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return call;
11579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *
11582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_cu12_helper2(IRExpr *byte1, IRExpr *byte2, IRExpr *byte3,
11583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       IRExpr *byte4, IRExpr *stuff)
11584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call;
11586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   args = mkIRExprVec_5(byte1, byte2, byte3, byte4, stuff);
11587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call = mkIRExprCCall(Ity_I64, 0 /*regparm*/,
11588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        "s390_do_cu12_helper2", &s390_do_cu12_helper2, args);
11589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Nothing is excluded from definedness checking. */
11591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call->Iex.CCall.cee->mcx_mask = 0;
11592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return call;
11594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *
11597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_call_cu14_helper2(IRExpr *byte1, IRExpr *byte2, IRExpr *byte3,
11598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                       IRExpr *byte4, IRExpr *stuff)
11599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr **args, *call;
11601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   args = mkIRExprVec_5(byte1, byte2, byte3, byte4, stuff);
11602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call = mkIRExprCCall(Ity_I64, 0 /*regparm*/,
11603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        "s390_do_cu14_helper2", &s390_do_cu14_helper2, args);
11604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Nothing is excluded from definedness checking. */
11606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   call->Iex.CCall.cee->mcx_mask = 0;
11607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return call;
11609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void
11612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_cu12_cu14(UChar m3, UChar r1, UChar r2, Bool is_cu12)
11613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr1 = newTemp(Ity_I64);
11615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp addr2 = newTemp(Ity_I64);
11616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len1 = newTemp(Ity_I64);
11617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp len2 = newTemp(Ity_I64);
11618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr1, get_gpr_dw0(r1));
11620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(addr2, get_gpr_dw0(r2));
11621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len1, get_gpr_dw0(r1 + 1));
11622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(len2, get_gpr_dw0(r2 + 1));
11623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt extended_checking = s390_host_has_etf3 && (m3 & 0x1) == 1;
11625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* We're processing the 2nd operand 1 byte at a time. Therefore, if
11627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      there is less than 1 byte left, then the 2nd operand is exhausted
11628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      and we're done here. cc = 0 */
11629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
11630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len2), mkU64(1)));
11631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* There is at least one byte there. Read it. */
11633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp byte1 = newTemp(Ity_I64);
11634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(byte1, unop(Iop_8Uto64, load(Ity_I8, mkexpr(addr2))));
11635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Call the helper to get number of bytes and invalid byte indicator */
11637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp retval1 = newTemp(Ity_I64);
11638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(retval1, s390_call_cu12_cu14_helper1(mkexpr(byte1),
11639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                               mkU64(extended_checking)));
11640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Check for invalid 1st byte */
11642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *is_invalid = unop(Iop_64to1, mkexpr(retval1));
11643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(2);
11644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(is_invalid);
11645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* How many bytes do we have to read? */
11647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp num_src_bytes = newTemp(Ity_I64);
11648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(num_src_bytes, binop(Iop_Shr64, mkexpr(retval1), mkU8(8)));
11649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Now test whether the 2nd operand is exhausted */
11651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(0);
11652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len2), mkexpr(num_src_bytes)));
11653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Read the remaining bytes */
11655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *cond, *addr, *byte2, *byte3, *byte4;
11656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   cond  = binop(Iop_CmpLE64U, mkU64(2), mkexpr(num_src_bytes));
11658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   addr  = binop(Iop_Add64, mkexpr(addr2), mkU64(1));
11659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   byte2 = mkite(cond, unop(Iop_8Uto64, load(Ity_I8, addr)), mkU64(0));
11660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   cond  = binop(Iop_CmpLE64U, mkU64(3), mkexpr(num_src_bytes));
11661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   addr  = binop(Iop_Add64, mkexpr(addr2), mkU64(2));
11662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   byte3 = mkite(cond, unop(Iop_8Uto64, load(Ity_I8, addr)), mkU64(0));
11663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   cond  = binop(Iop_CmpLE64U, mkU64(4), mkexpr(num_src_bytes));
11664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   addr  = binop(Iop_Add64, mkexpr(addr2), mkU64(3));
11665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   byte4 = mkite(cond, unop(Iop_8Uto64, load(Ity_I8, addr)), mkU64(0));
11666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Call the helper to get the converted value and invalid byte indicator.
11668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      We can pass at most 5 arguments; therefore some encoding is needed
11669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      here */
11670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *stuff = binop(Iop_Or64,
11671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         binop(Iop_Shl64, mkexpr(num_src_bytes), mkU8(1)),
11672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         mkU64(extended_checking));
11673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp retval2 = newTemp(Ity_I64);
11674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (is_cu12) {
11676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      assign(retval2, s390_call_cu12_helper2(mkexpr(byte1), byte2, byte3,
11677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                             byte4, stuff));
11678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else {
11679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      assign(retval2, s390_call_cu14_helper2(mkexpr(byte1), byte2, byte3,
11680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                             byte4, stuff));
11681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
11682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11683663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Check for invalid character */
11684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(2);
11685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   is_invalid = unop(Iop_64to1, mkexpr(retval2));
11686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(is_invalid);
11687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Now test whether the 1st operand is exhausted */
11689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp num_bytes = newTemp(Ity_I64);
11690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(num_bytes, binop(Iop_And64,
11691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           binop(Iop_Shr64, mkexpr(retval2), mkU8(8)),
11692663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           mkU64(0xff)));
11693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_cc_set(1);
11694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   next_insn_if(binop(Iop_CmpLT64U, mkexpr(len1), mkexpr(num_bytes)));
11695663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Extract the bytes to be stored at addr1 */
11697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp data = newTemp(Ity_I64);
11698663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(data, binop(Iop_Shr64, mkexpr(retval2), mkU8(16)));
11699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (is_cu12) {
11701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* To store the bytes construct 2 dirty helper calls. The helper calls
11702663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         are guarded (num_bytes == 2 and num_bytes == 4, respectively) such
11703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         that only one of them will be called at runtime. */
11704663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Int i;
11706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      for (i = 2; i <= 4; ++i) {
11707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         IRDirty *d;
11708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (i == 3) continue;  // skip this one
11710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         d = unsafeIRDirty_0_N(0 /* regparms */, "s390x_dirtyhelper_CUxy",
11712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               &s390x_dirtyhelper_CUxy,
11713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               mkIRExprVec_3(mkexpr(addr1), mkexpr(data),
11714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                             mkexpr(num_bytes)));
11715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         d->guard = binop(Iop_CmpEQ64, mkexpr(num_bytes), mkU64(i));
11716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         d->mFx   = Ifx_Write;
11717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         d->mAddr = mkexpr(addr1);
11718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         d->mSize = i;
11719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         stmt(IRStmt_Dirty(d));
11720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
11721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else {
11722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      // cu14
11723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      store(mkexpr(addr1), unop(Iop_64to32, mkexpr(data)));
11724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
11725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update source address and length */
11727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2,     binop(Iop_Add64, mkexpr(addr2), mkexpr(num_src_bytes)));
11728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r2 + 1, binop(Iop_Sub64, mkexpr(len2),  mkexpr(num_src_bytes)));
11729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Update destination address and length */
11731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1,     binop(Iop_Add64, mkexpr(addr1), mkexpr(num_bytes)));
11732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(r1 + 1, binop(Iop_Sub64, mkexpr(len1),  mkexpr(num_bytes)));
11733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   iterate();
11735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic HChar *
11738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CU12(UChar m3, UChar r1, UChar r2)
11739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_cu12_cu14(m3, r1, r2, /* is_cu12 = */ 1);
11741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cu12";
11743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic HChar *
11746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengs390_irgen_CU14(UChar m3, UChar r1, UChar r2)
11747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   s390_irgen_cu12_cu14(m3, r1, r2, /* is_cu12 = */ 0);
11749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return "cu14";
11751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
11754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Build IR for special instructions                    ---*/
11755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
11756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
11758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_client_request(void)
11759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (0)
11761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      vex_printf("%%R3 = client_request ( %%R2 )\n");
11762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11763663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Addr64 next = guest_IA_curr_instr + S390_SPECIAL_OP_PREAMBLE_SIZE
11764663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     + S390_SPECIAL_OP_SIZE;
11765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11766663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->jk_StopHere = Ijk_ClientReq;
11767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dis_res->whatNext = Dis_StopHere;
11768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11769663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_IA(mkaddr_expr(next));
11770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
11773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_guest_NRADDR(void)
11774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (0)
11776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      vex_printf("%%R3 = guest_NRADDR\n");
11777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   put_gpr_dw0(3, IRExpr_Get(S390X_GUEST_OFFSET(guest_NRADDR), Ity_I64));
11779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void
11782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_irgen_call_noredir(void)
11783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Addr64 next = guest_IA_curr_instr + S390_SPECIAL_OP_PREAMBLE_SIZE
11785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     + S390_SPECIAL_OP_SIZE;
11786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Continue after special op */
11788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_gpr_dw0(14, mkaddr_expr(next));
11789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* The address is in REG1, all parameters are in the right (guest) places */
11791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   put_IA(get_gpr_dw0(1));
11792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dis_res->whatNext = Dis_StopHere;
11794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dis_res->jk_StopHere = Ijk_NoRedir;
11795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Force proper alignment for the structures below. */
11798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#pragma pack(1)
11799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic s390_decode_t
11802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_decode_2byte_and_irgen(UChar *bytes)
11803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   typedef union {
11805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
11806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
11807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } E;
11808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
11809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
11810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i  :  8;
11811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } I;
11812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
11813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
11814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
11815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2 :  4;
11816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RR;
11817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } formats;
11818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   union {
11819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      formats fmt;
11820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      UShort value;
11821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } ovl;
11822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(sizeof(formats) == 2);
11824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ((char *)(&ovl.value))[0] = bytes[0];
11826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ((char *)(&ovl.value))[1] = bytes[1];
11827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (ovl.value & 0xffff) {
11829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0101: /* PR */ goto unimplemented;
11830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0102: /* UPT */ goto unimplemented;
11831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0104: /* PTFF */ goto unimplemented;
11832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0107: /* SCKPF */ goto unimplemented;
11833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x010a: /* PFPO */ goto unimplemented;
11834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x010b: /* TAM */ goto unimplemented;
11835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x010c: /* SAM24 */ goto unimplemented;
11836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x010d: /* SAM31 */ goto unimplemented;
11837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x010e: /* SAM64 */ goto unimplemented;
11838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x01ff: /* TRAP2 */ goto unimplemented;
11839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
11840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch ((ovl.value & 0xff00) >> 8) {
11842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x04: /* SPM */ goto unimplemented;
11843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x05: /* BALR */ goto unimplemented;
11844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x06: s390_format_RR_RR(s390_irgen_BCTR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x07: s390_format_RR(s390_irgen_BCR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             goto ok;
11848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0a: s390_format_I(s390_irgen_SVC, ovl.fmt.I.i);  goto ok;
11849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0b: /* BSM */ goto unimplemented;
11850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0c: /* BASSM */ goto unimplemented;
11851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0d: s390_format_RR_RR(s390_irgen_BASR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0e: s390_format_RR(s390_irgen_MVCL, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             goto ok;
11855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x0f: s390_format_RR(s390_irgen_CLCL, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             goto ok;
11857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x10: s390_format_RR_RR(s390_irgen_LPR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x11: s390_format_RR_RR(s390_irgen_LNR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x12: s390_format_RR_RR(s390_irgen_LTR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x13: s390_format_RR_RR(s390_irgen_LCR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x14: s390_format_RR_RR(s390_irgen_NR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x15: s390_format_RR_RR(s390_irgen_CLR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x16: s390_format_RR_RR(s390_irgen_OR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x17: s390_format_RR_RR(s390_irgen_XR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x18: s390_format_RR_RR(s390_irgen_LR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x19: s390_format_RR_RR(s390_irgen_CR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x1a: s390_format_RR_RR(s390_irgen_AR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x1b: s390_format_RR_RR(s390_irgen_SR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x1c: s390_format_RR_RR(s390_irgen_MR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x1d: s390_format_RR_RR(s390_irgen_DR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x1e: s390_format_RR_RR(s390_irgen_ALR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x1f: s390_format_RR_RR(s390_irgen_SLR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x20: /* LPDR */ goto unimplemented;
11890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x21: /* LNDR */ goto unimplemented;
11891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x22: /* LTDR */ goto unimplemented;
11892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x23: /* LCDR */ goto unimplemented;
11893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x24: /* HDR */ goto unimplemented;
11894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x25: /* LDXR */ goto unimplemented;
11895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x26: /* MXR */ goto unimplemented;
11896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x27: /* MXDR */ goto unimplemented;
11897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x28: s390_format_RR_FF(s390_irgen_LDR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x29: /* CDR */ goto unimplemented;
11900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x2a: /* ADR */ goto unimplemented;
11901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x2b: /* SDR */ goto unimplemented;
11902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x2c: /* MDR */ goto unimplemented;
11903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x2d: /* DDR */ goto unimplemented;
11904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x2e: /* AWR */ goto unimplemented;
11905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x2f: /* SWR */ goto unimplemented;
11906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x30: /* LPER */ goto unimplemented;
11907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x31: /* LNER */ goto unimplemented;
11908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x32: /* LTER */ goto unimplemented;
11909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x33: /* LCER */ goto unimplemented;
11910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x34: /* HER */ goto unimplemented;
11911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x35: /* LEDR */ goto unimplemented;
11912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x36: /* AXR */ goto unimplemented;
11913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x37: /* SXR */ goto unimplemented;
11914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x38: s390_format_RR_FF(s390_irgen_LER, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
11915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
11916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x39: /* CER */ goto unimplemented;
11917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x3a: /* AER */ goto unimplemented;
11918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x3b: /* SER */ goto unimplemented;
11919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x3c: /* MDER */ goto unimplemented;
11920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x3d: /* DER */ goto unimplemented;
11921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x3e: /* AUR */ goto unimplemented;
11922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x3f: /* SUR */ goto unimplemented;
11923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
11924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_UNKNOWN_INSN;
11926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovok:
11928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_OK;
11929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunimplemented:
11931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_UNIMPLEMENTED_INSN;
11932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
11933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic s390_decode_t
11935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_decode_4byte_and_irgen(UChar *bytes)
11936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
11937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   typedef union {
11938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
11939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
11940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
11941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  4;
11942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2  : 16;
11943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RI;
11944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
11945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
11946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int    :  8;
11947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
11948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2 :  4;
11949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RRE;
11950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
11951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
11952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
11953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int    :  4;
11954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3 :  4;
11955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2 :  4;
11956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RRF;
11957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
11958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
11959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3 :  4;
11960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int m4 :  4;
11961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
11962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2 :  4;
11963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RRF2;
11964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
11965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
11966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3 :  4;
11967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int    :  4;
11968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
11969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2 :  4;
11970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RRF3;
11971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
11972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
11973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3 :  4;
11974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int    :  4;
11975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
11976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2 :  4;
11977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RRR;
11978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
11979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
11980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3 :  4;
11981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int    :  4;
11982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
11983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2 :  4;
11984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RRF4;
11985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
11986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
11987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
11988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3 :  4;
11989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2 :  4;
11990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2 : 12;
11991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RS;
11992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
11993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
11994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
11995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3 :  4;
11996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2 : 16;
11997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RSI;
11998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
11999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
12000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
12001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int x2 :  4;
12002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2 :  4;
12003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2 : 12;
12004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RX;
12005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
12007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2 :  4;
12008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2 : 12;
12009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } S;
12010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
12012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2 :  8;
12013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b1 :  4;
12014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d1 : 12;
12015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } SI;
12016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } formats;
12017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   union {
12018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      formats fmt;
12019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      UInt value;
12020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } ovl;
12021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(sizeof(formats) == 4);
12023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ((char *)(&ovl.value))[0] = bytes[0];
12025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ((char *)(&ovl.value))[1] = bytes[1];
12026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ((char *)(&ovl.value))[2] = bytes[2];
12027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ((char *)(&ovl.value))[3] = bytes[3];
12028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch ((ovl.value & 0xff0f0000) >> 16) {
12030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa500: s390_format_RI_RU(s390_irgen_IIHH, ovl.fmt.RI.r1,
12031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa501: s390_format_RI_RU(s390_irgen_IIHL, ovl.fmt.RI.r1,
12033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa502: s390_format_RI_RU(s390_irgen_IILH, ovl.fmt.RI.r1,
12035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa503: s390_format_RI_RU(s390_irgen_IILL, ovl.fmt.RI.r1,
12037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa504: s390_format_RI_RU(s390_irgen_NIHH, ovl.fmt.RI.r1,
12039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa505: s390_format_RI_RU(s390_irgen_NIHL, ovl.fmt.RI.r1,
12041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa506: s390_format_RI_RU(s390_irgen_NILH, ovl.fmt.RI.r1,
12043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa507: s390_format_RI_RU(s390_irgen_NILL, ovl.fmt.RI.r1,
12045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa508: s390_format_RI_RU(s390_irgen_OIHH, ovl.fmt.RI.r1,
12047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa509: s390_format_RI_RU(s390_irgen_OIHL, ovl.fmt.RI.r1,
12049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa50a: s390_format_RI_RU(s390_irgen_OILH, ovl.fmt.RI.r1,
12051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa50b: s390_format_RI_RU(s390_irgen_OILL, ovl.fmt.RI.r1,
12053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa50c: s390_format_RI_RU(s390_irgen_LLIHH, ovl.fmt.RI.r1,
12055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa50d: s390_format_RI_RU(s390_irgen_LLIHL, ovl.fmt.RI.r1,
12057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa50e: s390_format_RI_RU(s390_irgen_LLILH, ovl.fmt.RI.r1,
12059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa50f: s390_format_RI_RU(s390_irgen_LLILL, ovl.fmt.RI.r1,
12061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa700: s390_format_RI_RU(s390_irgen_TMLH, ovl.fmt.RI.r1,
12063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa701: s390_format_RI_RU(s390_irgen_TMLL, ovl.fmt.RI.r1,
12065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa702: s390_format_RI_RU(s390_irgen_TMHH, ovl.fmt.RI.r1,
12067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa703: s390_format_RI_RU(s390_irgen_TMHL, ovl.fmt.RI.r1,
12069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa704: s390_format_RI(s390_irgen_BRC, ovl.fmt.RI.r1, ovl.fmt.RI.i2);
12071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                               goto ok;
12072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa705: s390_format_RI_RP(s390_irgen_BRAS, ovl.fmt.RI.r1,
12073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa706: s390_format_RI_RP(s390_irgen_BRCT, ovl.fmt.RI.r1,
12075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa707: s390_format_RI_RP(s390_irgen_BRCTG, ovl.fmt.RI.r1,
12077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa708: s390_format_RI_RI(s390_irgen_LHI, ovl.fmt.RI.r1, ovl.fmt.RI.i2);
12079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  goto ok;
12080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa709: s390_format_RI_RI(s390_irgen_LGHI, ovl.fmt.RI.r1,
12081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa70a: s390_format_RI_RI(s390_irgen_AHI, ovl.fmt.RI.r1, ovl.fmt.RI.i2);
12083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  goto ok;
12084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa70b: s390_format_RI_RI(s390_irgen_AGHI, ovl.fmt.RI.r1,
12085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa70c: s390_format_RI_RI(s390_irgen_MHI, ovl.fmt.RI.r1, ovl.fmt.RI.i2);
12087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  goto ok;
12088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa70d: s390_format_RI_RI(s390_irgen_MGHI, ovl.fmt.RI.r1,
12089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa70e: s390_format_RI_RI(s390_irgen_CHI, ovl.fmt.RI.r1, ovl.fmt.RI.i2);
12091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  goto ok;
12092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa70f: s390_format_RI_RI(s390_irgen_CGHI, ovl.fmt.RI.r1,
12093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RI.i2);  goto ok;
12094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
12095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch ((ovl.value & 0xffff0000) >> 16) {
12097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x8000: /* SSM */ goto unimplemented;
12098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x8200: /* LPSW */ goto unimplemented;
12099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0x9300: /* TS */ goto unimplemented;
12100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb202: /* STIDP */ goto unimplemented;
12101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb204: /* SCK */ goto unimplemented;
12102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb205: s390_format_S_RD(s390_irgen_STCK, ovl.fmt.S.b2, ovl.fmt.S.d2);
12103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                goto ok;
12104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb206: /* SCKC */ goto unimplemented;
12105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb207: /* STCKC */ goto unimplemented;
12106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb208: /* SPT */ goto unimplemented;
12107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb209: /* STPT */ goto unimplemented;
12108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb20a: /* SPKA */ goto unimplemented;
12109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb20b: /* IPK */ goto unimplemented;
12110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb20d: /* PTLB */ goto unimplemented;
12111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb210: /* SPX */ goto unimplemented;
12112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb211: /* STPX */ goto unimplemented;
12113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb212: /* STAP */ goto unimplemented;
12114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb214: /* SIE */ goto unimplemented;
12115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb218: /* PC */ goto unimplemented;
12116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb219: /* SAC */ goto unimplemented;
12117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb21a: /* CFC */ goto unimplemented;
12118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb221: /* IPTE */ goto unimplemented;
12119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb222: s390_format_RRE_R0(s390_irgen_IPM, ovl.fmt.RRE.r1);  goto ok;
12120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb223: /* IVSK */ goto unimplemented;
12121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb224: /* IAC */ goto unimplemented;
12122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb225: /* SSAR */ goto unimplemented;
12123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb226: /* EPAR */ goto unimplemented;
12124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb227: /* ESAR */ goto unimplemented;
12125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb228: /* PT */ goto unimplemented;
12126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb229: /* ISKE */ goto unimplemented;
12127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb22a: /* RRBE */ goto unimplemented;
12128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb22b: /* SSKE */ goto unimplemented;
12129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb22c: /* TB */ goto unimplemented;
12130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb22d: /* DXR */ goto unimplemented;
12131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb22e: /* PGIN */ goto unimplemented;
12132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb22f: /* PGOUT */ goto unimplemented;
12133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb230: /* CSCH */ goto unimplemented;
12134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb231: /* HSCH */ goto unimplemented;
12135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb232: /* MSCH */ goto unimplemented;
12136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb233: /* SSCH */ goto unimplemented;
12137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb234: /* STSCH */ goto unimplemented;
12138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb235: /* TSCH */ goto unimplemented;
12139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb236: /* TPI */ goto unimplemented;
12140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb237: /* SAL */ goto unimplemented;
12141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb238: /* RSCH */ goto unimplemented;
12142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb239: /* STCRW */ goto unimplemented;
12143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb23a: /* STCPS */ goto unimplemented;
12144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb23b: /* RCHP */ goto unimplemented;
12145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb23c: /* SCHM */ goto unimplemented;
12146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb240: /* BAKR */ goto unimplemented;
12147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb241: s390_format_RRE(s390_irgen_CKSM, ovl.fmt.RRE.r1,
12148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                ovl.fmt.RRE.r2);  goto ok;
12149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb244: /* SQDR */ goto unimplemented;
12150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb245: /* SQER */ goto unimplemented;
12151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb246: /* STURA */ goto unimplemented;
12152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb247: /* MSTA */ goto unimplemented;
12153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb248: /* PALB */ goto unimplemented;
12154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb249: /* EREG */ goto unimplemented;
12155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb24a: /* ESTA */ goto unimplemented;
12156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb24b: /* LURA */ goto unimplemented;
12157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb24c: /* TAR */ goto unimplemented;
12158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb24d: s390_format_RRE(s390_irgen_CPYA, ovl.fmt.RRE.r1,
12159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                ovl.fmt.RRE.r2);  goto ok;
12160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb24e: s390_format_RRE(s390_irgen_SAR, ovl.fmt.RRE.r1, ovl.fmt.RRE.r2);
12161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
12162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb24f: s390_format_RRE(s390_irgen_EAR, ovl.fmt.RRE.r1, ovl.fmt.RRE.r2);
12163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                goto ok;
12164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb250: /* CSP */ goto unimplemented;
12165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb252: s390_format_RRE_RR(s390_irgen_MSR, ovl.fmt.RRE.r1,
12166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb254: /* MVPG */ goto unimplemented;
12168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb255: s390_format_RRE_RR(s390_irgen_MVST, ovl.fmt.RRE.r1,
12169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb257: /* CUSE */ goto unimplemented;
12171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb258: /* BSG */ goto unimplemented;
12172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb25a: /* BSA */ goto unimplemented;
12173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb25d: s390_format_RRE_RR(s390_irgen_CLST, ovl.fmt.RRE.r1,
12174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb25e: s390_format_RRE_RR(s390_irgen_SRST, ovl.fmt.RRE.r1,
12176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb263: /* CMPSC */ goto unimplemented;
12178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb274: /* SIGA */ goto unimplemented;
12179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb276: /* XSCH */ goto unimplemented;
12180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb277: /* RP */ goto unimplemented;
12181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb278: s390_format_S_RD(s390_irgen_STCKE, ovl.fmt.S.b2, ovl.fmt.S.d2);goto ok;
12182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb279: /* SACF */ goto unimplemented;
12183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb27c: s390_format_S_RD(s390_irgen_STCKF, ovl.fmt.S.b2, ovl.fmt.S.d2);goto ok;
12184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb27d: /* STSI */ goto unimplemented;
12185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb299: s390_format_S_RD(s390_irgen_SRNM, ovl.fmt.S.b2, ovl.fmt.S.d2);
12186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 goto ok;
12187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb29c: s390_format_S_RD(s390_irgen_STFPC, ovl.fmt.S.b2, ovl.fmt.S.d2);
12188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 goto ok;
12189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb29d: s390_format_S_RD(s390_irgen_LFPC, ovl.fmt.S.b2, ovl.fmt.S.d2);
12190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 goto ok;
12191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb2a5: s390_format_RRE_FF(s390_irgen_TRE, ovl.fmt.RRE.r1, ovl.fmt.RRE.r2);  goto ok;
12192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb2a6: s390_format_RRF_M0RERE(s390_irgen_CU21, ovl.fmt.RRF3.r3,
12193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
12194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto ok;
12195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb2a7: s390_format_RRF_M0RERE(s390_irgen_CU12, ovl.fmt.RRF3.r3,
12196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
12197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto ok;
12198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb2b0: s390_format_S_RD(s390_irgen_STFLE, ovl.fmt.S.b2, ovl.fmt.S.d2);
12199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 goto ok;
12200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb2b1: /* STFL */ goto unimplemented;
12201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb2b2: /* LPSWE */ goto unimplemented;
12202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb2b8: /* SRNMB */ goto unimplemented;
12203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb2b9: /* SRNMT */ goto unimplemented;
12204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb2bd: /* LFAS */ goto unimplemented;
12205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb2ff: /* TRAP4 */ goto unimplemented;
12206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb300: s390_format_RRE_FF(s390_irgen_LPEBR, ovl.fmt.RRE.r1,
12207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb301: s390_format_RRE_FF(s390_irgen_LNEBR, ovl.fmt.RRE.r1,
12209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb302: s390_format_RRE_FF(s390_irgen_LTEBR, ovl.fmt.RRE.r1,
12211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb303: s390_format_RRE_FF(s390_irgen_LCEBR, ovl.fmt.RRE.r1,
12213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb304: s390_format_RRE_FF(s390_irgen_LDEBR, ovl.fmt.RRE.r1,
12215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb305: s390_format_RRE_FF(s390_irgen_LXDBR, ovl.fmt.RRE.r1,
12217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb306: s390_format_RRE_FF(s390_irgen_LXEBR, ovl.fmt.RRE.r1,
12219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb307: /* MXDBR */ goto unimplemented;
12221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb308: /* KEBR */ goto unimplemented;
12222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb309: s390_format_RRE_FF(s390_irgen_CEBR, ovl.fmt.RRE.r1,
12223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb30a: s390_format_RRE_FF(s390_irgen_AEBR, ovl.fmt.RRE.r1,
12225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb30b: s390_format_RRE_FF(s390_irgen_SEBR, ovl.fmt.RRE.r1,
12227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb30c: /* MDEBR */ goto unimplemented;
12229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb30d: s390_format_RRE_FF(s390_irgen_DEBR, ovl.fmt.RRE.r1,
12230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb30e: s390_format_RRF_F0FF(s390_irgen_MAEBR, ovl.fmt.RRF.r1,
12232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF.r3, ovl.fmt.RRF.r2);  goto ok;
12233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb30f: s390_format_RRF_F0FF(s390_irgen_MSEBR, ovl.fmt.RRF.r1,
12234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF.r3, ovl.fmt.RRF.r2);  goto ok;
12235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb310: s390_format_RRE_FF(s390_irgen_LPDBR, ovl.fmt.RRE.r1,
12236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb311: s390_format_RRE_FF(s390_irgen_LNDBR, ovl.fmt.RRE.r1,
12238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb312: s390_format_RRE_FF(s390_irgen_LTDBR, ovl.fmt.RRE.r1,
12240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb313: s390_format_RRE_FF(s390_irgen_LCDBR, ovl.fmt.RRE.r1,
12242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb314: s390_format_RRE_FF(s390_irgen_SQEBR, ovl.fmt.RRE.r1,
12244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb315: s390_format_RRE_FF(s390_irgen_SQDBR, ovl.fmt.RRE.r1,
12246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb316: s390_format_RRE_FF(s390_irgen_SQXBR, ovl.fmt.RRE.r1,
12248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb317: s390_format_RRE_FF(s390_irgen_MEEBR, ovl.fmt.RRE.r1,
12250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb318: /* KDBR */ goto unimplemented;
12252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb319: s390_format_RRE_FF(s390_irgen_CDBR, ovl.fmt.RRE.r1,
12253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb31a: s390_format_RRE_FF(s390_irgen_ADBR, ovl.fmt.RRE.r1,
12255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb31b: s390_format_RRE_FF(s390_irgen_SDBR, ovl.fmt.RRE.r1,
12257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb31c: s390_format_RRE_FF(s390_irgen_MDBR, ovl.fmt.RRE.r1,
12259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb31d: s390_format_RRE_FF(s390_irgen_DDBR, ovl.fmt.RRE.r1,
12261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb31e: s390_format_RRF_F0FF(s390_irgen_MADBR, ovl.fmt.RRF.r1,
12263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF.r3, ovl.fmt.RRF.r2);  goto ok;
12264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb31f: s390_format_RRF_F0FF(s390_irgen_MSDBR, ovl.fmt.RRF.r1,
12265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF.r3, ovl.fmt.RRF.r2);  goto ok;
12266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb324: /* LDER */ goto unimplemented;
12267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb325: /* LXDR */ goto unimplemented;
12268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb326: /* LXER */ goto unimplemented;
12269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb32e: /* MAER */ goto unimplemented;
12270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb32f: /* MSER */ goto unimplemented;
12271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb336: /* SQXR */ goto unimplemented;
12272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb337: /* MEER */ goto unimplemented;
12273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb338: /* MAYLR */ goto unimplemented;
12274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb339: /* MYLR */ goto unimplemented;
12275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb33a: /* MAYR */ goto unimplemented;
12276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb33b: /* MYR */ goto unimplemented;
12277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb33c: /* MAYHR */ goto unimplemented;
12278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb33d: /* MYHR */ goto unimplemented;
12279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb33e: /* MADR */ goto unimplemented;
12280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb33f: /* MSDR */ goto unimplemented;
12281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb340: s390_format_RRE_FF(s390_irgen_LPXBR, ovl.fmt.RRE.r1,
12282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb341: s390_format_RRE_FF(s390_irgen_LNXBR, ovl.fmt.RRE.r1,
12284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb342: s390_format_RRE_FF(s390_irgen_LTXBR, ovl.fmt.RRE.r1,
12286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb343: s390_format_RRE_FF(s390_irgen_LCXBR, ovl.fmt.RRE.r1,
12288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb344: s390_format_RRE_FF(s390_irgen_LEDBR, ovl.fmt.RRE.r1,
12290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb345: s390_format_RRE_FF(s390_irgen_LDXBR, ovl.fmt.RRE.r1,
12292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb346: s390_format_RRE_FF(s390_irgen_LEXBR, ovl.fmt.RRE.r1,
12294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb347: /* FIXBR */ goto unimplemented;
12296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb348: /* KXBR */ goto unimplemented;
12297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb349: s390_format_RRE_FF(s390_irgen_CXBR, ovl.fmt.RRE.r1,
12298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb34a: s390_format_RRE_FF(s390_irgen_AXBR, ovl.fmt.RRE.r1,
12300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb34b: s390_format_RRE_FF(s390_irgen_SXBR, ovl.fmt.RRE.r1,
12302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb34c: s390_format_RRE_FF(s390_irgen_MXBR, ovl.fmt.RRE.r1,
12304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb34d: s390_format_RRE_FF(s390_irgen_DXBR, ovl.fmt.RRE.r1,
12306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb350: /* TBEDR */ goto unimplemented;
12308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb351: /* TBDR */ goto unimplemented;
12309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb353: /* DIEBR */ goto unimplemented;
12310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb357: /* FIEBR */ goto unimplemented;
12311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb358: /* THDER */ goto unimplemented;
12312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb359: /* THDR */ goto unimplemented;
12313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb35b: /* DIDBR */ goto unimplemented;
12314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb35f: /* FIDBR */ goto unimplemented;
12315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb360: /* LPXR */ goto unimplemented;
12316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb361: /* LNXR */ goto unimplemented;
12317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb362: /* LTXR */ goto unimplemented;
12318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb363: /* LCXR */ goto unimplemented;
12319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb365: s390_format_RRE_FF(s390_irgen_LXR, ovl.fmt.RRE.r1,
12320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb366: /* LEXR */ goto unimplemented;
12322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb367: /* FIXR */ goto unimplemented;
12323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb369: /* CXR */ goto unimplemented;
12324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb370: s390_format_RRE_FF(s390_irgen_LPDFR, ovl.fmt.RRE.r1,
12325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb371: s390_format_RRE_FF(s390_irgen_LNDFR, ovl.fmt.RRE.r1,
12327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb372: s390_format_RRF_F0FF2(s390_irgen_CPSDR, ovl.fmt.RRF3.r3,
12329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
12330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb373: s390_format_RRE_FF(s390_irgen_LCDFR, ovl.fmt.RRE.r1,
12332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb374: s390_format_RRE_F0(s390_irgen_LZER, ovl.fmt.RRE.r1);  goto ok;
12334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb375: s390_format_RRE_F0(s390_irgen_LZDR, ovl.fmt.RRE.r1);  goto ok;
12335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb376: s390_format_RRE_F0(s390_irgen_LZXR, ovl.fmt.RRE.r1);  goto ok;
12336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb377: /* FIER */ goto unimplemented;
12337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb37f: /* FIDR */ goto unimplemented;
12338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb384: s390_format_RRE_R0(s390_irgen_SFPC, ovl.fmt.RRE.r1);  goto ok;
12339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb385: /* SFASR */ goto unimplemented;
12340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb38c: s390_format_RRE_R0(s390_irgen_EFPC, ovl.fmt.RRE.r1);  goto ok;
12341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb390: /* CELFBR */ goto unimplemented;
12342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb391: /* CDLFBR */ goto unimplemented;
12343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb392: /* CXLFBR */ goto unimplemented;
12344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb394: s390_format_RRE_FR(s390_irgen_CEFBR, ovl.fmt.RRE.r1,
12345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb395: s390_format_RRE_FR(s390_irgen_CDFBR, ovl.fmt.RRE.r1,
12347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb396: s390_format_RRE_FR(s390_irgen_CXFBR, ovl.fmt.RRE.r1,
12349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb398: s390_format_RRF_U0RF(s390_irgen_CFEBR, ovl.fmt.RRF3.r3,
12351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
12352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     goto ok;
12353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb399: s390_format_RRF_U0RF(s390_irgen_CFDBR, ovl.fmt.RRF3.r3,
12354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
12355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     goto ok;
12356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb39a: s390_format_RRF_U0RF(s390_irgen_CFXBR, ovl.fmt.RRF3.r3,
12357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
12358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     goto ok;
12359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3a0: /* CELGBR */ goto unimplemented;
12360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3a1: /* CDLGBR */ goto unimplemented;
12361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3a2: /* CXLGBR */ goto unimplemented;
12362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3a4: s390_format_RRE_FR(s390_irgen_CEGBR, ovl.fmt.RRE.r1,
12363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3a5: s390_format_RRE_FR(s390_irgen_CDGBR, ovl.fmt.RRE.r1,
12365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3a6: s390_format_RRE_FR(s390_irgen_CXGBR, ovl.fmt.RRE.r1,
12367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3a8: s390_format_RRF_U0RF(s390_irgen_CGEBR, ovl.fmt.RRF3.r3,
12369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
12370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     goto ok;
12371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3a9: s390_format_RRF_U0RF(s390_irgen_CGDBR, ovl.fmt.RRF3.r3,
12372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
12373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     goto ok;
12374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3aa: s390_format_RRF_U0RF(s390_irgen_CGXBR, ovl.fmt.RRF3.r3,
12375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
12376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     goto ok;
12377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3b4: /* CEFR */ goto unimplemented;
12378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3b5: /* CDFR */ goto unimplemented;
12379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3b6: /* CXFR */ goto unimplemented;
12380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3b8: /* CFER */ goto unimplemented;
12381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3b9: /* CFDR */ goto unimplemented;
12382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3ba: /* CFXR */ goto unimplemented;
12383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3c1: s390_format_RRE_FR(s390_irgen_LDGR, ovl.fmt.RRE.r1,
12384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3c4: /* CEGR */ goto unimplemented;
12386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3c5: /* CDGR */ goto unimplemented;
12387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3c6: /* CXGR */ goto unimplemented;
12388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3c8: /* CGER */ goto unimplemented;
12389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3c9: /* CGDR */ goto unimplemented;
12390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3ca: /* CGXR */ goto unimplemented;
12391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3cd: s390_format_RRE_RF(s390_irgen_LGDR, ovl.fmt.RRE.r1,
12392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3d0: /* MDTR */ goto unimplemented;
12394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3d1: /* DDTR */ goto unimplemented;
12395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3d2: /* ADTR */ goto unimplemented;
12396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3d3: /* SDTR */ goto unimplemented;
12397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3d4: /* LDETR */ goto unimplemented;
12398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3d5: /* LEDTR */ goto unimplemented;
12399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3d6: /* LTDTR */ goto unimplemented;
12400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3d7: /* FIDTR */ goto unimplemented;
12401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3d8: /* MXTR */ goto unimplemented;
12402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3d9: /* DXTR */ goto unimplemented;
12403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3da: /* AXTR */ goto unimplemented;
12404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3db: /* SXTR */ goto unimplemented;
12405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3dc: /* LXDTR */ goto unimplemented;
12406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3dd: /* LDXTR */ goto unimplemented;
12407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3de: /* LTXTR */ goto unimplemented;
12408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3df: /* FIXTR */ goto unimplemented;
12409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3e0: /* KDTR */ goto unimplemented;
12410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3e1: /* CGDTR */ goto unimplemented;
12411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3e2: /* CUDTR */ goto unimplemented;
12412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3e3: /* CSDTR */ goto unimplemented;
12413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3e4: /* CDTR */ goto unimplemented;
12414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3e5: /* EEDTR */ goto unimplemented;
12415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3e7: /* ESDTR */ goto unimplemented;
12416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3e8: /* KXTR */ goto unimplemented;
12417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3e9: /* CGXTR */ goto unimplemented;
12418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3ea: /* CUXTR */ goto unimplemented;
12419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3eb: /* CSXTR */ goto unimplemented;
12420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3ec: /* CXTR */ goto unimplemented;
12421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3ed: /* EEXTR */ goto unimplemented;
12422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3ef: /* ESXTR */ goto unimplemented;
12423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3f1: /* CDGTR */ goto unimplemented;
12424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3f2: /* CDUTR */ goto unimplemented;
12425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3f3: /* CDSTR */ goto unimplemented;
12426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3f4: /* CEDTR */ goto unimplemented;
12427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3f5: /* QADTR */ goto unimplemented;
12428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3f6: /* IEDTR */ goto unimplemented;
12429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3f7: /* RRDTR */ goto unimplemented;
12430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3f9: /* CXGTR */ goto unimplemented;
12431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3fa: /* CXUTR */ goto unimplemented;
12432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3fb: /* CXSTR */ goto unimplemented;
12433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3fc: /* CEXTR */ goto unimplemented;
12434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3fd: /* QAXTR */ goto unimplemented;
12435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3fe: /* IEXTR */ goto unimplemented;
12436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb3ff: /* RRXTR */ goto unimplemented;
12437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb900: s390_format_RRE_RR(s390_irgen_LPGR, ovl.fmt.RRE.r1,
12438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb901: s390_format_RRE_RR(s390_irgen_LNGR, ovl.fmt.RRE.r1,
12440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb902: s390_format_RRE_RR(s390_irgen_LTGR, ovl.fmt.RRE.r1,
12442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb903: s390_format_RRE_RR(s390_irgen_LCGR, ovl.fmt.RRE.r1,
12444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb904: s390_format_RRE_RR(s390_irgen_LGR, ovl.fmt.RRE.r1,
12446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb905: /* LURAG */ goto unimplemented;
12448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb906: s390_format_RRE_RR(s390_irgen_LGBR, ovl.fmt.RRE.r1,
12449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb907: s390_format_RRE_RR(s390_irgen_LGHR, ovl.fmt.RRE.r1,
12451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb908: s390_format_RRE_RR(s390_irgen_AGR, ovl.fmt.RRE.r1,
12453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb909: s390_format_RRE_RR(s390_irgen_SGR, ovl.fmt.RRE.r1,
12455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb90a: s390_format_RRE_RR(s390_irgen_ALGR, ovl.fmt.RRE.r1,
12457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb90b: s390_format_RRE_RR(s390_irgen_SLGR, ovl.fmt.RRE.r1,
12459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb90c: s390_format_RRE_RR(s390_irgen_MSGR, ovl.fmt.RRE.r1,
12461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb90d: s390_format_RRE_RR(s390_irgen_DSGR, ovl.fmt.RRE.r1,
12463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb90e: /* EREGG */ goto unimplemented;
12465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb90f: s390_format_RRE_RR(s390_irgen_LRVGR, ovl.fmt.RRE.r1,
12466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb910: s390_format_RRE_RR(s390_irgen_LPGFR, ovl.fmt.RRE.r1,
12468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb911: s390_format_RRE_RR(s390_irgen_LNGFR, ovl.fmt.RRE.r1,
12470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb912: s390_format_RRE_RR(s390_irgen_LTGFR, ovl.fmt.RRE.r1,
12472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb913: s390_format_RRE_RR(s390_irgen_LCGFR, ovl.fmt.RRE.r1,
12474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb914: s390_format_RRE_RR(s390_irgen_LGFR, ovl.fmt.RRE.r1,
12476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb916: s390_format_RRE_RR(s390_irgen_LLGFR, ovl.fmt.RRE.r1,
12478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb917: s390_format_RRE_RR(s390_irgen_LLGTR, ovl.fmt.RRE.r1,
12480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb918: s390_format_RRE_RR(s390_irgen_AGFR, ovl.fmt.RRE.r1,
12482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb919: s390_format_RRE_RR(s390_irgen_SGFR, ovl.fmt.RRE.r1,
12484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb91a: s390_format_RRE_RR(s390_irgen_ALGFR, ovl.fmt.RRE.r1,
12486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb91b: s390_format_RRE_RR(s390_irgen_SLGFR, ovl.fmt.RRE.r1,
12488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb91c: s390_format_RRE_RR(s390_irgen_MSGFR, ovl.fmt.RRE.r1,
12490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb91d: s390_format_RRE_RR(s390_irgen_DSGFR, ovl.fmt.RRE.r1,
12492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb91e: /* KMAC */ goto unimplemented;
12494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb91f: s390_format_RRE_RR(s390_irgen_LRVR, ovl.fmt.RRE.r1,
12495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb920: s390_format_RRE_RR(s390_irgen_CGR, ovl.fmt.RRE.r1,
12497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb921: s390_format_RRE_RR(s390_irgen_CLGR, ovl.fmt.RRE.r1,
12499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb925: /* STURG */ goto unimplemented;
12501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb926: s390_format_RRE_RR(s390_irgen_LBR, ovl.fmt.RRE.r1,
12502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb927: s390_format_RRE_RR(s390_irgen_LHR, ovl.fmt.RRE.r1,
12504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb928: /* PCKMO */ goto unimplemented;
12506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb92b: /* KMO */ goto unimplemented;
12507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb92c: /* PCC */ goto unimplemented;
12508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb92d: /* KMCTR */ goto unimplemented;
12509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb92e: /* KM */ goto unimplemented;
12510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb92f: /* KMC */ goto unimplemented;
12511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb930: s390_format_RRE_RR(s390_irgen_CGFR, ovl.fmt.RRE.r1,
12512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb931: s390_format_RRE_RR(s390_irgen_CLGFR, ovl.fmt.RRE.r1,
12514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb93e: /* KIMD */ goto unimplemented;
12516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb93f: /* KLMD */ goto unimplemented;
12517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb941: /* CFDTR */ goto unimplemented;
12518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb942: /* CLGDTR */ goto unimplemented;
12519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb943: /* CLFDTR */ goto unimplemented;
12520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb946: s390_format_RRE_RR(s390_irgen_BCTGR, ovl.fmt.RRE.r1,
12521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb949: /* CFXTR */ goto unimplemented;
12523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb94a: /* CLGXTR */ goto unimplemented;
12524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb94b: /* CLFXTR */ goto unimplemented;
12525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb951: /* CDFTR */ goto unimplemented;
12526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb952: /* CDLGTR */ goto unimplemented;
12527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb953: /* CDLFTR */ goto unimplemented;
12528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb959: /* CXFTR */ goto unimplemented;
12529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb95a: /* CXLGTR */ goto unimplemented;
12530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb95b: /* CXLFTR */ goto unimplemented;
12531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb960: /* CGRT */ goto unimplemented;
12532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb961: /* CLGRT */ goto unimplemented;
12533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb972: /* CRT */ goto unimplemented;
12534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb973: /* CLRT */ goto unimplemented;
12535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb980: s390_format_RRE_RR(s390_irgen_NGR, ovl.fmt.RRE.r1,
12536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb981: s390_format_RRE_RR(s390_irgen_OGR, ovl.fmt.RRE.r1,
12538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb982: s390_format_RRE_RR(s390_irgen_XGR, ovl.fmt.RRE.r1,
12540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb983: s390_format_RRE_RR(s390_irgen_FLOGR, ovl.fmt.RRE.r1,
12542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb984: s390_format_RRE_RR(s390_irgen_LLGCR, ovl.fmt.RRE.r1,
12544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb985: s390_format_RRE_RR(s390_irgen_LLGHR, ovl.fmt.RRE.r1,
12546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb986: s390_format_RRE_RR(s390_irgen_MLGR, ovl.fmt.RRE.r1,
12548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb987: s390_format_RRE_RR(s390_irgen_DLGR, ovl.fmt.RRE.r1,
12550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb988: s390_format_RRE_RR(s390_irgen_ALCGR, ovl.fmt.RRE.r1,
12552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb989: s390_format_RRE_RR(s390_irgen_SLBGR, ovl.fmt.RRE.r1,
12554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb98a: /* CSPG */ goto unimplemented;
12556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb98d: /* EPSW */ goto unimplemented;
12557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb98e: /* IDTE */ goto unimplemented;
12558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb990: s390_format_RRF_M0RERE(s390_irgen_TRTT, ovl.fmt.RRF3.r3,
12559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);  goto ok;
12560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb991: s390_format_RRF_M0RERE(s390_irgen_TRTO, ovl.fmt.RRF3.r3,
12561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);  goto ok;
12562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb992: s390_format_RRF_M0RERE(s390_irgen_TROT, ovl.fmt.RRF3.r3,
12563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);  goto ok;
12564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb993: s390_format_RRF_M0RERE(s390_irgen_TROO, ovl.fmt.RRF3.r3,
12565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);  goto ok;
12566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb994: s390_format_RRE_RR(s390_irgen_LLCR, ovl.fmt.RRE.r1,
12567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb995: s390_format_RRE_RR(s390_irgen_LLHR, ovl.fmt.RRE.r1,
12569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb996: s390_format_RRE_RR(s390_irgen_MLR, ovl.fmt.RRE.r1,
12571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb997: s390_format_RRE_RR(s390_irgen_DLR, ovl.fmt.RRE.r1,
12573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb998: s390_format_RRE_RR(s390_irgen_ALCR, ovl.fmt.RRE.r1,
12575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb999: s390_format_RRE_RR(s390_irgen_SLBR, ovl.fmt.RRE.r1,
12577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb99a: /* EPAIR */ goto unimplemented;
12579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb99b: /* ESAIR */ goto unimplemented;
12580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb99d: /* ESEA */ goto unimplemented;
12581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb99e: /* PTI */ goto unimplemented;
12582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb99f: /* SSAIR */ goto unimplemented;
12583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9a2: /* PTF */ goto unimplemented;
12584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9aa: /* LPTEA */ goto unimplemented;
12585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9ae: /* RRBM */ goto unimplemented;
12586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9af: /* PFMF */ goto unimplemented;
12587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb9b0: s390_format_RRF_M0RERE(s390_irgen_CU14, ovl.fmt.RRF3.r3,
12588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
12589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto ok;
12590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb9b1: s390_format_RRF_M0RERE(s390_irgen_CU24, ovl.fmt.RRF3.r3,
12591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
12592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      goto ok;
12593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb9b2: s390_format_RRE_RR(s390_irgen_CU41, ovl.fmt.RRE.r1,
12594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   ovl.fmt.RRE.r2);  goto ok;
12595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xb9b3: s390_format_RRE_RR(s390_irgen_CU42, ovl.fmt.RRE.r1,
12596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   ovl.fmt.RRE.r2);  goto ok;
12597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9bd: /* TRTRE */ goto unimplemented;
12598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9be: /* SRSTU */ goto unimplemented;
12599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9bf: /* TRTE */ goto unimplemented;
12600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9c8: s390_format_RRF_R0RR2(s390_irgen_AHHHR, ovl.fmt.RRF4.r3,
12601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9c9: s390_format_RRF_R0RR2(s390_irgen_SHHHR, ovl.fmt.RRF4.r3,
12604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9ca: s390_format_RRF_R0RR2(s390_irgen_ALHHHR, ovl.fmt.RRF4.r3,
12607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9cb: s390_format_RRF_R0RR2(s390_irgen_SLHHHR, ovl.fmt.RRF4.r3,
12610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9cd: s390_format_RRE_RR(s390_irgen_CHHR, ovl.fmt.RRE.r1,
12613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9cf: s390_format_RRE_RR(s390_irgen_CLHHR, ovl.fmt.RRE.r1,
12615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9d8: s390_format_RRF_R0RR2(s390_irgen_AHHLR, ovl.fmt.RRF4.r3,
12617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9d9: s390_format_RRF_R0RR2(s390_irgen_SHHLR, ovl.fmt.RRF4.r3,
12620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9da: s390_format_RRF_R0RR2(s390_irgen_ALHHLR, ovl.fmt.RRF4.r3,
12623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9db: s390_format_RRF_R0RR2(s390_irgen_SLHHLR, ovl.fmt.RRF4.r3,
12626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9dd: s390_format_RRE_RR(s390_irgen_CHLR, ovl.fmt.RRE.r1,
12629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9df: s390_format_RRE_RR(s390_irgen_CLHLR, ovl.fmt.RRE.r1,
12631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RRE.r2);  goto ok;
12632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9e1: /* POPCNT */ goto unimplemented;
12633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9e2: s390_format_RRF_U0RR(s390_irgen_LOCGR, ovl.fmt.RRF3.r3,
12634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2,
12635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     S390_XMNM_LOCGR);  goto ok;
12636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9e4: s390_format_RRF_R0RR2(s390_irgen_NGRK, ovl.fmt.RRF4.r3,
12637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9e6: s390_format_RRF_R0RR2(s390_irgen_OGRK, ovl.fmt.RRF4.r3,
12640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9e7: s390_format_RRF_R0RR2(s390_irgen_XGRK, ovl.fmt.RRF4.r3,
12643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9e8: s390_format_RRF_R0RR2(s390_irgen_AGRK, ovl.fmt.RRF4.r3,
12646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9e9: s390_format_RRF_R0RR2(s390_irgen_SGRK, ovl.fmt.RRF4.r3,
12649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9ea: s390_format_RRF_R0RR2(s390_irgen_ALGRK, ovl.fmt.RRF4.r3,
12652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9eb: s390_format_RRF_R0RR2(s390_irgen_SLGRK, ovl.fmt.RRF4.r3,
12655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9f2: s390_format_RRF_U0RR(s390_irgen_LOCR, ovl.fmt.RRF3.r3,
12658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2,
12659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                     S390_XMNM_LOCR);  goto ok;
12660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9f4: s390_format_RRF_R0RR2(s390_irgen_NRK, ovl.fmt.RRF4.r3,
12661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9f6: s390_format_RRF_R0RR2(s390_irgen_ORK, ovl.fmt.RRF4.r3,
12664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9f7: s390_format_RRF_R0RR2(s390_irgen_XRK, ovl.fmt.RRF4.r3,
12667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9f8: s390_format_RRF_R0RR2(s390_irgen_ARK, ovl.fmt.RRF4.r3,
12670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9f9: s390_format_RRF_R0RR2(s390_irgen_SRK, ovl.fmt.RRF4.r3,
12673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9fa: s390_format_RRF_R0RR2(s390_irgen_ALRK, ovl.fmt.RRF4.r3,
12676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb9fb: s390_format_RRF_R0RR2(s390_irgen_SLRK, ovl.fmt.RRF4.r3,
12679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
12680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      goto ok;
12681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
12682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch ((ovl.value & 0xff000000) >> 24) {
12684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x40: s390_format_RX_RRRD(s390_irgen_STH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x41: s390_format_RX_RRRD(s390_irgen_LA, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x42: s390_format_RX_RRRD(s390_irgen_STC, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x43: s390_format_RX_RRRD(s390_irgen_IC, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x44: s390_format_RX_RRRD(s390_irgen_EX, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x45: /* BAL */ goto unimplemented;
12695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x46: s390_format_RX_RRRD(s390_irgen_BCT, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x47: s390_format_RX(s390_irgen_BC, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x48: s390_format_RX_RRRD(s390_irgen_LH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x49: s390_format_RX_RRRD(s390_irgen_CH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x4a: s390_format_RX_RRRD(s390_irgen_AH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x4b: s390_format_RX_RRRD(s390_irgen_SH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x4c: s390_format_RX_RRRD(s390_irgen_MH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x4d: s390_format_RX_RRRD(s390_irgen_BAS, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x4e: s390_format_RX_RRRD(s390_irgen_CVD, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x4f: s390_format_RX_RRRD(s390_irgen_CVB, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x50: s390_format_RX_RRRD(s390_irgen_ST, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x51: s390_format_RX_RRRD(s390_irgen_LAE, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x54: s390_format_RX_RRRD(s390_irgen_N, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x55: s390_format_RX_RRRD(s390_irgen_CL, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x56: s390_format_RX_RRRD(s390_irgen_O, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x57: s390_format_RX_RRRD(s390_irgen_X, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x58: s390_format_RX_RRRD(s390_irgen_L, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x59: s390_format_RX_RRRD(s390_irgen_C, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x5a: s390_format_RX_RRRD(s390_irgen_A, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x5b: s390_format_RX_RRRD(s390_irgen_S, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x5c: s390_format_RX_RRRD(s390_irgen_M, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x5d: s390_format_RX_RRRD(s390_irgen_D, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x5e: s390_format_RX_RRRD(s390_irgen_AL, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x5f: s390_format_RX_RRRD(s390_irgen_SL, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x60: s390_format_RX_FRRD(s390_irgen_STD, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x67: /* MXD */ goto unimplemented;
12746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x68: s390_format_RX_FRRD(s390_irgen_LD, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x69: /* CD */ goto unimplemented;
12749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x6a: /* AD */ goto unimplemented;
12750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x6b: /* SD */ goto unimplemented;
12751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x6c: /* MD */ goto unimplemented;
12752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x6d: /* DD */ goto unimplemented;
12753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x6e: /* AW */ goto unimplemented;
12754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x6f: /* SW */ goto unimplemented;
12755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x70: s390_format_RX_FRRD(s390_irgen_STE, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x71: s390_format_RX_RRRD(s390_irgen_MS, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x78: s390_format_RX_FRRD(s390_irgen_LE, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
12760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RX.b2, ovl.fmt.RX.d2);  goto ok;
12761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x79: /* CE */ goto unimplemented;
12762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x7a: /* AE */ goto unimplemented;
12763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x7b: /* SE */ goto unimplemented;
12764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x7c: /* MDE */ goto unimplemented;
12765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x7d: /* DE */ goto unimplemented;
12766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x7e: /* AU */ goto unimplemented;
12767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x7f: /* SU */ goto unimplemented;
12768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x83: /* DIAG */ goto unimplemented;
12769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x84: s390_format_RSI_RRP(s390_irgen_BRXH, ovl.fmt.RSI.r1,
12770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RSI.r3, ovl.fmt.RSI.i2);  goto ok;
12771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x85: s390_format_RSI_RRP(s390_irgen_BRXLE, ovl.fmt.RSI.r1,
12772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RSI.r3, ovl.fmt.RSI.i2);  goto ok;
12773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x86: s390_format_RS_RRRD(s390_irgen_BXH, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
12774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
12775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x87: s390_format_RS_RRRD(s390_irgen_BXLE, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
12776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
12777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x88: s390_format_RS_R0RD(s390_irgen_SRL, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
12778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.d2);  goto ok;
12779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x89: s390_format_RS_R0RD(s390_irgen_SLL, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
12780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.d2);  goto ok;
12781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x8a: s390_format_RS_R0RD(s390_irgen_SRA, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
12782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.d2);  goto ok;
12783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x8b: s390_format_RS_R0RD(s390_irgen_SLA, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
12784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.d2);  goto ok;
12785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x8c: s390_format_RS_R0RD(s390_irgen_SRDL, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
12786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.d2);  goto ok;
12787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x8d: s390_format_RS_R0RD(s390_irgen_SLDL, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
12788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.d2);  goto ok;
12789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x8e: s390_format_RS_R0RD(s390_irgen_SRDA, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
12790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.d2);  goto ok;
12791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x8f: s390_format_RS_R0RD(s390_irgen_SLDA, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
12792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.d2);  goto ok;
12793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x90: s390_format_RS_RRRD(s390_irgen_STM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
12794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
12795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x91: s390_format_SI_URD(s390_irgen_TM, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
12796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 ovl.fmt.SI.d1);  goto ok;
12797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x92: s390_format_SI_URD(s390_irgen_MVI, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
12798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 ovl.fmt.SI.d1);  goto ok;
12799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x94: s390_format_SI_URD(s390_irgen_NI, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
12800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 ovl.fmt.SI.d1);  goto ok;
12801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x95: s390_format_SI_URD(s390_irgen_CLI, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
12802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 ovl.fmt.SI.d1);  goto ok;
12803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x96: s390_format_SI_URD(s390_irgen_OI, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
12804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 ovl.fmt.SI.d1);  goto ok;
12805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x97: s390_format_SI_URD(s390_irgen_XI, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
12806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                 ovl.fmt.SI.d1);  goto ok;
12807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x98: s390_format_RS_RRRD(s390_irgen_LM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
12808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
12809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x99: /* TRACE */ goto unimplemented;
12810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x9a: s390_format_RS_AARD(s390_irgen_LAM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
12811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
12812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0x9b: s390_format_RS_AARD(s390_irgen_STAM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
12813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
12814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa8: s390_format_RS_RRRD(s390_irgen_MVCLE, ovl.fmt.RS.r1,
12815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.r3, ovl.fmt.RS.b2, ovl.fmt.RS.d2);
12816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  goto ok;
12817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xa9: s390_format_RS_RRRD(s390_irgen_CLCLE, ovl.fmt.RS.r1,
12818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.r3, ovl.fmt.RS.b2, ovl.fmt.RS.d2);
12819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  goto ok;
12820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xac: /* STNSM */ goto unimplemented;
12821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xad: /* STOSM */ goto unimplemented;
12822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xae: /* SIGP */ goto unimplemented;
12823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xaf: /* MC */ goto unimplemented;
12824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb1: /* LRA */ goto unimplemented;
12825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb6: /* STCTL */ goto unimplemented;
12826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xb7: /* LCTL */ goto unimplemented;
12827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xba: s390_format_RS_RRRD(s390_irgen_CS, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
12828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
12829663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xbb: s390_format_RS_RRRD(s390_irgen_CDS, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
12830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
12831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xbd: s390_format_RS_RURD(s390_irgen_CLM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
12832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
12833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xbe: s390_format_RS_RURD(s390_irgen_STCM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
12834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
12835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xbf: s390_format_RS_RURD(s390_irgen_ICM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
12836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  ovl.fmt.RS.b2, ovl.fmt.RS.d2);  goto ok;
12837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
12838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_UNKNOWN_INSN;
12840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovok:
12842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_OK;
12843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunimplemented:
12845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_UNIMPLEMENTED_INSN;
12846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
12847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic s390_decode_t
12849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_decode_6byte_and_irgen(UChar *bytes)
12850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
12851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   typedef union {
12852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
12854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
12855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3  :  4;
12856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2  : 16;
12857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  8;
12858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
12859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RIE;
12860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
12862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
12863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2  :  4;
12864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i3  :  8;
12865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i4  :  8;
12866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i5  :  8;
12867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
12868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RIE_RRUUU;
12869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
12871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
12872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  4;
12873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2  : 16;
12874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int m3  :  4;
12875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  4;
12876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
12877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RIEv1;
12878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
12880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
12881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2  :  4;
12882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i4  : 16;
12883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int m3  :  4;
12884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  4;
12885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
12886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RIE_RRPU;
12887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
12889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
12890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int m3  :  4;
12891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i4  : 16;
12892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2  :  8;
12893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
12894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RIEv3;
12895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
12897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
12898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  4;
12899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2  : 32;
12900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RIL;
12901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
12903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
12904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int m3  :  4;
12905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b4  :  4;
12906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d4  : 12;
12907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2  :  8;
12908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
12909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RIS;
12910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
12912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
12913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r2  :  4;
12914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b4  :  4;
12915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d4  : 12;
12916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int m3  :  4;
12917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  4;
12918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
12919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RRS;
12920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
12922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int l1  :  4;
12923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  4;
12924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b1  :  4;
12925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d1  : 12;
12926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  8;
12927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
12928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RSL;
12929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
12931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
12932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3  :  4;
12933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2  :  4;
12934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int dl2 : 12;
12935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int dh2 :  8;
12936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
12937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RSY;
12938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
12940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
12941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int x2  :  4;
12942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2  :  4;
12943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2  : 12;
12944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  8;
12945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
12946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RXE;
12947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
12949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3  :  4;
12950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int x2  :  4;
12951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2  :  4;
12952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2  : 12;
12953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
12954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int     :  4;
12955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
12956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RXF;
12957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
12959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1  :  4;
12960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int x2  :  4;
12961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2  :  4;
12962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int dl2 : 12;
12963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int dh2 :  8;
12964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
12965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } RXY;
12966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
12968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2  :  8;
12969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b1  :  4;
12970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int dl1 : 12;
12971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int dh1 :  8;
12972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  8;
12973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } SIY;
12974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
12976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int l  :  8;
12977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b1 :  4;
12978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d1 : 12;
12979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2 :  4;
12980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2 : 12;
12981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } SS;
12982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
12984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int l1 :  4;
12985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int l2 :  4;
12986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b1 :  4;
12987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d1 : 12;
12988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2 :  4;
12989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2 : 12;
12990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } SS_LLRDRD;
12991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
12992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op :  8;
12993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r1 :  4;
12994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3 :  4;
12995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2 :  4;
12996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2 : 12;
12997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b4 :  4;
12998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d4 : 12;
12999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } SS_RRRDRD2;
13000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
13001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
13002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b1 :  4;
13003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d1 : 12;
13004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2 :  4;
13005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2 : 12;
13006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } SSE;
13007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
13008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op1 :  8;
13009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int r3  :  4;
13010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op2 :  4;
13011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b1  :  4;
13012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d1  : 12;
13013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b2  :  4;
13014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d2  : 12;
13015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } SSF;
13016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct {
13017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int op : 16;
13018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int b1 :  4;
13019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int d1 : 12;
13020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int i2 : 16;
13021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } SIL;
13022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } formats;
13023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   union {
13024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      formats fmt;
13025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ULong value;
13026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } ovl;
13027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(sizeof(formats) == 6);
13029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ((char *)(&ovl.value))[0] = bytes[0];
13031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ((char *)(&ovl.value))[1] = bytes[1];
13032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ((char *)(&ovl.value))[2] = bytes[2];
13033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ((char *)(&ovl.value))[3] = bytes[3];
13034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ((char *)(&ovl.value))[4] = bytes[4];
13035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ((char *)(&ovl.value))[5] = bytes[5];
13036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ((char *)(&ovl.value))[6] = 0x0;
13037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ((char *)(&ovl.value))[7] = 0x0;
13038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch ((ovl.value >> 16) & 0xff00000000ffULL) {
13040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000002ULL: s390_format_RXY_RRRD(s390_irgen_LTG, ovl.fmt.RXY.r1,
13041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000003ULL: /* LRAG */ goto unimplemented;
13045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000004ULL: s390_format_RXY_RRRD(s390_irgen_LG, ovl.fmt.RXY.r1,
13046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000006ULL: s390_format_RXY_RRRD(s390_irgen_CVBY, ovl.fmt.RXY.r1,
13050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000008ULL: s390_format_RXY_RRRD(s390_irgen_AG, ovl.fmt.RXY.r1,
13054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000009ULL: s390_format_RXY_RRRD(s390_irgen_SG, ovl.fmt.RXY.r1,
13058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000000aULL: s390_format_RXY_RRRD(s390_irgen_ALG, ovl.fmt.RXY.r1,
13062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000000bULL: s390_format_RXY_RRRD(s390_irgen_SLG, ovl.fmt.RXY.r1,
13066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000000cULL: s390_format_RXY_RRRD(s390_irgen_MSG, ovl.fmt.RXY.r1,
13070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000000dULL: s390_format_RXY_RRRD(s390_irgen_DSG, ovl.fmt.RXY.r1,
13074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000000eULL: /* CVBG */ goto unimplemented;
13078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000000fULL: s390_format_RXY_RRRD(s390_irgen_LRVG, ovl.fmt.RXY.r1,
13079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000012ULL: s390_format_RXY_RRRD(s390_irgen_LT, ovl.fmt.RXY.r1,
13083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000013ULL: /* LRAY */ goto unimplemented;
13087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000014ULL: s390_format_RXY_RRRD(s390_irgen_LGF, ovl.fmt.RXY.r1,
13088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000015ULL: s390_format_RXY_RRRD(s390_irgen_LGH, ovl.fmt.RXY.r1,
13092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000016ULL: s390_format_RXY_RRRD(s390_irgen_LLGF, ovl.fmt.RXY.r1,
13096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000017ULL: s390_format_RXY_RRRD(s390_irgen_LLGT, ovl.fmt.RXY.r1,
13100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000018ULL: s390_format_RXY_RRRD(s390_irgen_AGF, ovl.fmt.RXY.r1,
13104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000019ULL: s390_format_RXY_RRRD(s390_irgen_SGF, ovl.fmt.RXY.r1,
13108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000001aULL: s390_format_RXY_RRRD(s390_irgen_ALGF, ovl.fmt.RXY.r1,
13112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000001bULL: s390_format_RXY_RRRD(s390_irgen_SLGF, ovl.fmt.RXY.r1,
13116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000001cULL: s390_format_RXY_RRRD(s390_irgen_MSGF, ovl.fmt.RXY.r1,
13120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000001dULL: s390_format_RXY_RRRD(s390_irgen_DSGF, ovl.fmt.RXY.r1,
13124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000001eULL: s390_format_RXY_RRRD(s390_irgen_LRV, ovl.fmt.RXY.r1,
13128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000001fULL: s390_format_RXY_RRRD(s390_irgen_LRVH, ovl.fmt.RXY.r1,
13132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000020ULL: s390_format_RXY_RRRD(s390_irgen_CG, ovl.fmt.RXY.r1,
13136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000021ULL: s390_format_RXY_RRRD(s390_irgen_CLG, ovl.fmt.RXY.r1,
13140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000024ULL: s390_format_RXY_RRRD(s390_irgen_STG, ovl.fmt.RXY.r1,
13144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000026ULL: s390_format_RXY_RRRD(s390_irgen_CVDY, ovl.fmt.RXY.r1,
13148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000002eULL: /* CVDG */ goto unimplemented;
13152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000002fULL: s390_format_RXY_RRRD(s390_irgen_STRVG,
13153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.r1, ovl.fmt.RXY.x2,
13154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.b2, ovl.fmt.RXY.dl2,
13155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000030ULL: s390_format_RXY_RRRD(s390_irgen_CGF, ovl.fmt.RXY.r1,
13157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000031ULL: s390_format_RXY_RRRD(s390_irgen_CLGF, ovl.fmt.RXY.r1,
13161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000032ULL: s390_format_RXY_RRRD(s390_irgen_LTGF, ovl.fmt.RXY.r1,
13165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000034ULL: s390_format_RXY_RRRD(s390_irgen_CGH, ovl.fmt.RXY.r1,
13169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000036ULL: s390_format_RXY_URRD(s390_irgen_PFD, ovl.fmt.RXY.r1,
13173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000003eULL: s390_format_RXY_RRRD(s390_irgen_STRV, ovl.fmt.RXY.r1,
13177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000003fULL: s390_format_RXY_RRRD(s390_irgen_STRVH,
13181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.r1, ovl.fmt.RXY.x2,
13182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.b2, ovl.fmt.RXY.dl2,
13183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000046ULL: s390_format_RXY_RRRD(s390_irgen_BCTG, ovl.fmt.RXY.r1,
13185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000050ULL: s390_format_RXY_RRRD(s390_irgen_STY, ovl.fmt.RXY.r1,
13189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000051ULL: s390_format_RXY_RRRD(s390_irgen_MSY, ovl.fmt.RXY.r1,
13193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000054ULL: s390_format_RXY_RRRD(s390_irgen_NY, ovl.fmt.RXY.r1,
13197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000055ULL: s390_format_RXY_RRRD(s390_irgen_CLY, ovl.fmt.RXY.r1,
13201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000056ULL: s390_format_RXY_RRRD(s390_irgen_OY, ovl.fmt.RXY.r1,
13205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000057ULL: s390_format_RXY_RRRD(s390_irgen_XY, ovl.fmt.RXY.r1,
13209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000058ULL: s390_format_RXY_RRRD(s390_irgen_LY, ovl.fmt.RXY.r1,
13213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000059ULL: s390_format_RXY_RRRD(s390_irgen_CY, ovl.fmt.RXY.r1,
13217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000005aULL: s390_format_RXY_RRRD(s390_irgen_AY, ovl.fmt.RXY.r1,
13221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000005bULL: s390_format_RXY_RRRD(s390_irgen_SY, ovl.fmt.RXY.r1,
13225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000005cULL: s390_format_RXY_RRRD(s390_irgen_MFY, ovl.fmt.RXY.r1,
13229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000005eULL: s390_format_RXY_RRRD(s390_irgen_ALY, ovl.fmt.RXY.r1,
13233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000005fULL: s390_format_RXY_RRRD(s390_irgen_SLY, ovl.fmt.RXY.r1,
13237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000070ULL: s390_format_RXY_RRRD(s390_irgen_STHY, ovl.fmt.RXY.r1,
13241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000071ULL: s390_format_RXY_RRRD(s390_irgen_LAY, ovl.fmt.RXY.r1,
13245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000072ULL: s390_format_RXY_RRRD(s390_irgen_STCY, ovl.fmt.RXY.r1,
13249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000073ULL: s390_format_RXY_RRRD(s390_irgen_ICY, ovl.fmt.RXY.r1,
13253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000075ULL: s390_format_RXY_RRRD(s390_irgen_LAEY, ovl.fmt.RXY.r1,
13257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000076ULL: s390_format_RXY_RRRD(s390_irgen_LB, ovl.fmt.RXY.r1,
13261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000077ULL: s390_format_RXY_RRRD(s390_irgen_LGB, ovl.fmt.RXY.r1,
13265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000078ULL: s390_format_RXY_RRRD(s390_irgen_LHY, ovl.fmt.RXY.r1,
13269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000079ULL: s390_format_RXY_RRRD(s390_irgen_CHY, ovl.fmt.RXY.r1,
13273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000007aULL: s390_format_RXY_RRRD(s390_irgen_AHY, ovl.fmt.RXY.r1,
13277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000007bULL: s390_format_RXY_RRRD(s390_irgen_SHY, ovl.fmt.RXY.r1,
13281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000007cULL: s390_format_RXY_RRRD(s390_irgen_MHY, ovl.fmt.RXY.r1,
13285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000080ULL: s390_format_RXY_RRRD(s390_irgen_NG, ovl.fmt.RXY.r1,
13289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000081ULL: s390_format_RXY_RRRD(s390_irgen_OG, ovl.fmt.RXY.r1,
13293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000082ULL: s390_format_RXY_RRRD(s390_irgen_XG, ovl.fmt.RXY.r1,
13297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000086ULL: s390_format_RXY_RRRD(s390_irgen_MLG, ovl.fmt.RXY.r1,
13301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000087ULL: s390_format_RXY_RRRD(s390_irgen_DLG, ovl.fmt.RXY.r1,
13305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000088ULL: s390_format_RXY_RRRD(s390_irgen_ALCG, ovl.fmt.RXY.r1,
13309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000089ULL: s390_format_RXY_RRRD(s390_irgen_SLBG, ovl.fmt.RXY.r1,
13313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000008eULL: s390_format_RXY_RRRD(s390_irgen_STPQ, ovl.fmt.RXY.r1,
13317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe3000000008fULL: s390_format_RXY_RRRD(s390_irgen_LPQ, ovl.fmt.RXY.r1,
13321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000090ULL: s390_format_RXY_RRRD(s390_irgen_LLGC, ovl.fmt.RXY.r1,
13325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000091ULL: s390_format_RXY_RRRD(s390_irgen_LLGH, ovl.fmt.RXY.r1,
13329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000094ULL: s390_format_RXY_RRRD(s390_irgen_LLC, ovl.fmt.RXY.r1,
13333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000095ULL: s390_format_RXY_RRRD(s390_irgen_LLH, ovl.fmt.RXY.r1,
13337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000096ULL: s390_format_RXY_RRRD(s390_irgen_ML, ovl.fmt.RXY.r1,
13341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000097ULL: s390_format_RXY_RRRD(s390_irgen_DL, ovl.fmt.RXY.r1,
13345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000098ULL: s390_format_RXY_RRRD(s390_irgen_ALC, ovl.fmt.RXY.r1,
13349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe30000000099ULL: s390_format_RXY_RRRD(s390_irgen_SLB, ovl.fmt.RXY.r1,
13353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000c0ULL: s390_format_RXY_RRRD(s390_irgen_LBH, ovl.fmt.RXY.r1,
13357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000c2ULL: s390_format_RXY_RRRD(s390_irgen_LLCH, ovl.fmt.RXY.r1,
13361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000c3ULL: s390_format_RXY_RRRD(s390_irgen_STCH, ovl.fmt.RXY.r1,
13365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000c4ULL: s390_format_RXY_RRRD(s390_irgen_LHH, ovl.fmt.RXY.r1,
13369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000c6ULL: s390_format_RXY_RRRD(s390_irgen_LLHH, ovl.fmt.RXY.r1,
13373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000c7ULL: s390_format_RXY_RRRD(s390_irgen_STHH, ovl.fmt.RXY.r1,
13377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000caULL: s390_format_RXY_RRRD(s390_irgen_LFH, ovl.fmt.RXY.r1,
13381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000cbULL: s390_format_RXY_RRRD(s390_irgen_STFH, ovl.fmt.RXY.r1,
13385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000cdULL: s390_format_RXY_RRRD(s390_irgen_CHF, ovl.fmt.RXY.r1,
13389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe300000000cfULL: s390_format_RXY_RRRD(s390_irgen_CLHF, ovl.fmt.RXY.r1,
13393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000004ULL: s390_format_RSY_RRRD(s390_irgen_LMG, ovl.fmt.RSY.r1,
13397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000000aULL: s390_format_RSY_RRRD(s390_irgen_SRAG, ovl.fmt.RSY.r1,
13401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000000bULL: s390_format_RSY_RRRD(s390_irgen_SLAG, ovl.fmt.RSY.r1,
13405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000000cULL: s390_format_RSY_RRRD(s390_irgen_SRLG, ovl.fmt.RSY.r1,
13409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000000dULL: s390_format_RSY_RRRD(s390_irgen_SLLG, ovl.fmt.RSY.r1,
13413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000000fULL: /* TRACG */ goto unimplemented;
13417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000014ULL: s390_format_RSY_RRRD(s390_irgen_CSY, ovl.fmt.RSY.r1,
13418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000001cULL: s390_format_RSY_RRRD(s390_irgen_RLLG, ovl.fmt.RSY.r1,
13422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13423b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13424b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13425b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000001dULL: s390_format_RSY_RRRD(s390_irgen_RLL, ovl.fmt.RSY.r1,
13426b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13427b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13428b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13429b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000020ULL: s390_format_RSY_RURD(s390_irgen_CLMH, ovl.fmt.RSY.r1,
13430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13431b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000021ULL: s390_format_RSY_RURD(s390_irgen_CLMY, ovl.fmt.RSY.r1,
13434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13436b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000024ULL: s390_format_RSY_RRRD(s390_irgen_STMG, ovl.fmt.RSY.r1,
13438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000025ULL: /* STCTG */ goto unimplemented;
13442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000026ULL: s390_format_RSY_RRRD(s390_irgen_STMH, ovl.fmt.RSY.r1,
13443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13446b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000002cULL: s390_format_RSY_RURD(s390_irgen_STCMH,
13447b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
13448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
13449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13450b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000002dULL: s390_format_RSY_RURD(s390_irgen_STCMY,
13451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
13452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
13453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000002fULL: /* LCTLG */ goto unimplemented;
13455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000030ULL: s390_format_RSY_RRRD(s390_irgen_CSG, ovl.fmt.RSY.r1,
13456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xeb0000000031ULL: s390_format_RSY_RRRD(s390_irgen_CDSY, ovl.fmt.RSY.r1,
13460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                                ovl.fmt.RSY.dl2,
13462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                                ovl.fmt.RSY.dh2);  goto ok;
13463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xeb000000003eULL: s390_format_RSY_RRRD(s390_irgen_CDSG, ovl.fmt.RSY.r1,
13464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                                ovl.fmt.RSY.dl2,
13466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                                ovl.fmt.RSY.dh2);  goto ok;
13467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000044ULL: s390_format_RSY_RRRD(s390_irgen_BXHG, ovl.fmt.RSY.r1,
13468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000045ULL: s390_format_RSY_RRRD(s390_irgen_BXLEG,
13472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
13473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
13474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000004cULL: /* ECAG */ goto unimplemented;
13476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000051ULL: s390_format_SIY_URD(s390_irgen_TMY, ovl.fmt.SIY.i2,
13477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
13478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
13479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000052ULL: s390_format_SIY_URD(s390_irgen_MVIY, ovl.fmt.SIY.i2,
13480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
13481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
13482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000054ULL: s390_format_SIY_URD(s390_irgen_NIY, ovl.fmt.SIY.i2,
13483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
13484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
13485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000055ULL: s390_format_SIY_URD(s390_irgen_CLIY, ovl.fmt.SIY.i2,
13486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
13487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
13488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000056ULL: s390_format_SIY_URD(s390_irgen_OIY, ovl.fmt.SIY.i2,
13489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
13490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
13491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000057ULL: s390_format_SIY_URD(s390_irgen_XIY, ovl.fmt.SIY.i2,
13492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
13493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
13494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000006aULL: s390_format_SIY_IRD(s390_irgen_ASI, ovl.fmt.SIY.i2,
13495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
13496b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
13497b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000006eULL: s390_format_SIY_IRD(s390_irgen_ALSI, ovl.fmt.SIY.i2,
13498b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
13499b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
13500b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000007aULL: s390_format_SIY_IRD(s390_irgen_AGSI, ovl.fmt.SIY.i2,
13501b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
13502b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
13503b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000007eULL: s390_format_SIY_IRD(s390_irgen_ALGSI, ovl.fmt.SIY.i2,
13504b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
13505b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.SIY.dh1);  goto ok;
13506b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000080ULL: s390_format_RSY_RURD(s390_irgen_ICMH, ovl.fmt.RSY.r1,
13507b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13508b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13509b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13510b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000081ULL: s390_format_RSY_RURD(s390_irgen_ICMY, ovl.fmt.RSY.r1,
13511b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13512b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13513b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13514b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000008eULL: /* MVCLU */ goto unimplemented;
13515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000008fULL: /* CLCLU */ goto unimplemented;
13516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000090ULL: s390_format_RSY_RRRD(s390_irgen_STMY, ovl.fmt.RSY.r1,
13517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000096ULL: s390_format_RSY_RRRD(s390_irgen_LMH, ovl.fmt.RSY.r1,
13521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb0000000098ULL: s390_format_RSY_RRRD(s390_irgen_LMY, ovl.fmt.RSY.r1,
13525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13528b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000009aULL: s390_format_RSY_AARD(s390_irgen_LAMY, ovl.fmt.RSY.r1,
13529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb000000009bULL: s390_format_RSY_AARD(s390_irgen_STAMY,
13533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
13534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
13535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000c0ULL: /* TP */ goto unimplemented;
13537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000dcULL: s390_format_RSY_RRRD(s390_irgen_SRAK, ovl.fmt.RSY.r1,
13538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000ddULL: s390_format_RSY_RRRD(s390_irgen_SLAK, ovl.fmt.RSY.r1,
13542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000deULL: s390_format_RSY_RRRD(s390_irgen_SRLK, ovl.fmt.RSY.r1,
13546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000dfULL: s390_format_RSY_RRRD(s390_irgen_SLLK, ovl.fmt.RSY.r1,
13550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000e2ULL: s390_format_RSY_RDRM(s390_irgen_LOCG, ovl.fmt.RSY.r1,
13554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2,
13557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                S390_XMNM_LOCG);  goto ok;
13558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000e3ULL: s390_format_RSY_RDRM(s390_irgen_STOCG,
13559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
13560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
13561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2,
13562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                S390_XMNM_STOCG);  goto ok;
13563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000e4ULL: s390_format_RSY_RRRD(s390_irgen_LANG, ovl.fmt.RSY.r1,
13564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000e6ULL: s390_format_RSY_RRRD(s390_irgen_LAOG, ovl.fmt.RSY.r1,
13568b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13569b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000e7ULL: s390_format_RSY_RRRD(s390_irgen_LAXG, ovl.fmt.RSY.r1,
13572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000e8ULL: s390_format_RSY_RRRD(s390_irgen_LAAG, ovl.fmt.RSY.r1,
13576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000eaULL: s390_format_RSY_RRRD(s390_irgen_LAALG,
13580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
13581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
13582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000f2ULL: s390_format_RSY_RDRM(s390_irgen_LOC, ovl.fmt.RSY.r1,
13584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2, S390_XMNM_LOC);
13587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                goto ok;
13588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000f3ULL: s390_format_RSY_RDRM(s390_irgen_STOC, ovl.fmt.RSY.r1,
13589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2,
13592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                S390_XMNM_STOC);  goto ok;
13593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000f4ULL: s390_format_RSY_RRRD(s390_irgen_LAN, ovl.fmt.RSY.r1,
13594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000f6ULL: s390_format_RSY_RRRD(s390_irgen_LAO, ovl.fmt.RSY.r1,
13598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000f7ULL: s390_format_RSY_RRRD(s390_irgen_LAX, ovl.fmt.RSY.r1,
13602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13603b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13604b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000f8ULL: s390_format_RSY_RRRD(s390_irgen_LAA, ovl.fmt.RSY.r1,
13606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeb00000000faULL: s390_format_RSY_RRRD(s390_irgen_LAAL, ovl.fmt.RSY.r1,
13610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
13611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dl2,
13612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RSY.dh2);  goto ok;
13613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000044ULL: s390_format_RIE_RRP(s390_irgen_BRXHG, ovl.fmt.RIE.r1,
13614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.RIE.r3, ovl.fmt.RIE.i2);
13615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               goto ok;
13616b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000045ULL: s390_format_RIE_RRP(s390_irgen_BRXLG, ovl.fmt.RIE.r1,
13617b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               ovl.fmt.RIE.r3, ovl.fmt.RIE.i2);
13618b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               goto ok;
13619b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000051ULL: /* RISBLG */ goto unimplemented;
13620b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000054ULL: s390_format_RIE_RRUUU(s390_irgen_RNSBG,
13621b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.r1,
13622b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.r2,
13623b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i3,
13624b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i4,
13625b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i5);
13626b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 goto ok;
13627b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000055ULL: s390_format_RIE_RRUUU(s390_irgen_RISBG,
13628b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.r1,
13629b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.r2,
13630b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i3,
13631b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i4,
13632b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i5);
13633b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 goto ok;
13634b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000056ULL: s390_format_RIE_RRUUU(s390_irgen_ROSBG,
13635b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.r1,
13636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.r2,
13637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i3,
13638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i4,
13639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i5);
13640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 goto ok;
13641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000057ULL: s390_format_RIE_RRUUU(s390_irgen_RXSBG,
13642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.r1,
13643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.r2,
13644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i3,
13645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i4,
13646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIE_RRUUU.i5);
13647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 goto ok;
13648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec000000005dULL: /* RISBHG */ goto unimplemented;
13649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000064ULL: s390_format_RIE_RRPU(s390_irgen_CGRJ,
13650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.r1,
13651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.r2,
13652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.i4,
13653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.m3);  goto ok;
13654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000065ULL: s390_format_RIE_RRPU(s390_irgen_CLGRJ,
13655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.r1,
13656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.r2,
13657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.i4,
13658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.m3);  goto ok;
13659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000070ULL: /* CGIT */ goto unimplemented;
13660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000071ULL: /* CLGIT */ goto unimplemented;
13661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000072ULL: /* CIT */ goto unimplemented;
13662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000073ULL: /* CLFIT */ goto unimplemented;
13663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000076ULL: s390_format_RIE_RRPU(s390_irgen_CRJ,
13664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.r1,
13665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.r2,
13666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.i4,
13667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.m3);  goto ok;
13668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec0000000077ULL: s390_format_RIE_RRPU(s390_irgen_CLRJ,
13669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.r1,
13670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.r2,
13671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.i4,
13672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE_RRPU.m3);  goto ok;
13673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec000000007cULL: s390_format_RIE_RUPI(s390_irgen_CGIJ,
13674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.r1,
13675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.m3,
13676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.i4,
13677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.i2);  goto ok;
13678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec000000007dULL: s390_format_RIE_RUPU(s390_irgen_CLGIJ,
13679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.r1,
13680b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.m3,
13681b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.i4,
13682b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.i2);  goto ok;
13683b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec000000007eULL: s390_format_RIE_RUPI(s390_irgen_CIJ,
13684b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.r1,
13685b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.m3,
13686b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.i4,
13687b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.i2);  goto ok;
13688b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec000000007fULL: s390_format_RIE_RUPU(s390_irgen_CLIJ,
13689b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.r1,
13690b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.m3,
13691b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.i4,
13692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIEv3.i2);  goto ok;
13693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000d8ULL: s390_format_RIE_RRI0(s390_irgen_AHIK, ovl.fmt.RIE.r1,
13694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE.r3, ovl.fmt.RIE.i2);
13695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                goto ok;
13696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000d9ULL: s390_format_RIE_RRI0(s390_irgen_AGHIK,
13697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE.r1, ovl.fmt.RIE.r3,
13698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE.i2);  goto ok;
13699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000daULL: s390_format_RIE_RRI0(s390_irgen_ALHSIK,
13700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE.r1, ovl.fmt.RIE.r3,
13701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE.i2);  goto ok;
13702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000dbULL: s390_format_RIE_RRI0(s390_irgen_ALGHSIK,
13703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE.r1, ovl.fmt.RIE.r3,
13704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RIE.i2);  goto ok;
13705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000e4ULL: s390_format_RRS(s390_irgen_CGRB, ovl.fmt.RRS.r1,
13706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           ovl.fmt.RRS.r2, ovl.fmt.RRS.b4,
13707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           ovl.fmt.RRS.d4, ovl.fmt.RRS.m3);
13708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           goto ok;
13709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000e5ULL: s390_format_RRS(s390_irgen_CLGRB, ovl.fmt.RRS.r1,
13710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           ovl.fmt.RRS.r2, ovl.fmt.RRS.b4,
13711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           ovl.fmt.RRS.d4, ovl.fmt.RRS.m3);
13712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           goto ok;
13713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000f6ULL: s390_format_RRS(s390_irgen_CRB, ovl.fmt.RRS.r1,
13714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           ovl.fmt.RRS.r2, ovl.fmt.RRS.b4,
13715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           ovl.fmt.RRS.d4, ovl.fmt.RRS.m3);
13716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           goto ok;
13717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000f7ULL: s390_format_RRS(s390_irgen_CLRB, ovl.fmt.RRS.r1,
13718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           ovl.fmt.RRS.r2, ovl.fmt.RRS.b4,
13719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           ovl.fmt.RRS.d4, ovl.fmt.RRS.m3);
13720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                           goto ok;
13721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000fcULL: s390_format_RIS_RURDI(s390_irgen_CGIB,
13722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.r1, ovl.fmt.RIS.m3,
13723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.b4, ovl.fmt.RIS.d4,
13724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.i2);  goto ok;
13725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000fdULL: s390_format_RIS_RURDU(s390_irgen_CLGIB,
13726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.r1, ovl.fmt.RIS.m3,
13727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.b4, ovl.fmt.RIS.d4,
13728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.i2);  goto ok;
13729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000feULL: s390_format_RIS_RURDI(s390_irgen_CIB, ovl.fmt.RIS.r1,
13730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.m3, ovl.fmt.RIS.b4,
13731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.d4,
13732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.i2);  goto ok;
13733b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xec00000000ffULL: s390_format_RIS_RURDU(s390_irgen_CLIB,
13734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.r1, ovl.fmt.RIS.m3,
13735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.b4, ovl.fmt.RIS.d4,
13736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RIS.i2);  goto ok;
13737b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000004ULL: s390_format_RXE_FRRD(s390_irgen_LDEB, ovl.fmt.RXE.r1,
13738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000005ULL: s390_format_RXE_FRRD(s390_irgen_LXDB, ovl.fmt.RXE.r1,
13741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000006ULL: s390_format_RXE_FRRD(s390_irgen_LXEB, ovl.fmt.RXE.r1,
13744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000007ULL: /* MXDB */ goto unimplemented;
13747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000008ULL: /* KEB */ goto unimplemented;
13748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000009ULL: s390_format_RXE_FRRD(s390_irgen_CEB, ovl.fmt.RXE.r1,
13749b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13750b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13751b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000000aULL: s390_format_RXE_FRRD(s390_irgen_AEB, ovl.fmt.RXE.r1,
13752b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000000bULL: s390_format_RXE_FRRD(s390_irgen_SEB, ovl.fmt.RXE.r1,
13755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000000cULL: /* MDEB */ goto unimplemented;
13758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000000dULL: s390_format_RXE_FRRD(s390_irgen_DEB, ovl.fmt.RXE.r1,
13759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13761b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000000eULL: s390_format_RXF_FRRDF(s390_irgen_MAEB,
13762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.r3, ovl.fmt.RXF.x2,
13763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.b2, ovl.fmt.RXF.d2,
13764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.r1);  goto ok;
13765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000000fULL: s390_format_RXF_FRRDF(s390_irgen_MSEB,
13766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.r3, ovl.fmt.RXF.x2,
13767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.b2, ovl.fmt.RXF.d2,
13768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.r1);  goto ok;
13769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000010ULL: s390_format_RXE_FRRD(s390_irgen_TCEB, ovl.fmt.RXE.r1,
13770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000011ULL: s390_format_RXE_FRRD(s390_irgen_TCDB, ovl.fmt.RXE.r1,
13773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000012ULL: s390_format_RXE_FRRD(s390_irgen_TCXB, ovl.fmt.RXE.r1,
13776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000014ULL: s390_format_RXE_FRRD(s390_irgen_SQEB, ovl.fmt.RXE.r1,
13779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000015ULL: s390_format_RXE_FRRD(s390_irgen_SQDB, ovl.fmt.RXE.r1,
13782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000017ULL: s390_format_RXE_FRRD(s390_irgen_MEEB, ovl.fmt.RXE.r1,
13785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000018ULL: /* KDB */ goto unimplemented;
13788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000019ULL: s390_format_RXE_FRRD(s390_irgen_CDB, ovl.fmt.RXE.r1,
13789b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000001aULL: s390_format_RXE_FRRD(s390_irgen_ADB, ovl.fmt.RXE.r1,
13792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000001bULL: s390_format_RXE_FRRD(s390_irgen_SDB, ovl.fmt.RXE.r1,
13795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000001cULL: s390_format_RXE_FRRD(s390_irgen_MDB, ovl.fmt.RXE.r1,
13798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000001dULL: s390_format_RXE_FRRD(s390_irgen_DDB, ovl.fmt.RXE.r1,
13801b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
13802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXE.d2);  goto ok;
13803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000001eULL: s390_format_RXF_FRRDF(s390_irgen_MADB,
13804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.r3, ovl.fmt.RXF.x2,
13805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.b2, ovl.fmt.RXF.d2,
13806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.r1);  goto ok;
13807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000001fULL: s390_format_RXF_FRRDF(s390_irgen_MSDB,
13808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.r3, ovl.fmt.RXF.x2,
13809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.b2, ovl.fmt.RXF.d2,
13810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                 ovl.fmt.RXF.r1);  goto ok;
13811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000024ULL: /* LDE */ goto unimplemented;
13812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000025ULL: /* LXD */ goto unimplemented;
13813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000026ULL: /* LXE */ goto unimplemented;
13814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000002eULL: /* MAE */ goto unimplemented;
13815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000002fULL: /* MSE */ goto unimplemented;
13816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000034ULL: /* SQE */ goto unimplemented;
13817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000035ULL: /* SQD */ goto unimplemented;
13818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000037ULL: /* MEE */ goto unimplemented;
13819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000038ULL: /* MAYL */ goto unimplemented;
13820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000039ULL: /* MYL */ goto unimplemented;
13821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000003aULL: /* MAY */ goto unimplemented;
13822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000003bULL: /* MY */ goto unimplemented;
13823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000003cULL: /* MAYH */ goto unimplemented;
13824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000003dULL: /* MYH */ goto unimplemented;
13825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000003eULL: /* MAD */ goto unimplemented;
13826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed000000003fULL: /* MSD */ goto unimplemented;
13827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000040ULL: /* SLDT */ goto unimplemented;
13828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000041ULL: /* SRDT */ goto unimplemented;
13829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000048ULL: /* SLXT */ goto unimplemented;
13830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000049ULL: /* SRXT */ goto unimplemented;
13831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000050ULL: /* TDCET */ goto unimplemented;
13832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000051ULL: /* TDGET */ goto unimplemented;
13833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000054ULL: /* TDCDT */ goto unimplemented;
13834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000055ULL: /* TDGDT */ goto unimplemented;
13835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000058ULL: /* TDCXT */ goto unimplemented;
13836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000059ULL: /* TDGXT */ goto unimplemented;
13837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000064ULL: s390_format_RXY_FRRD(s390_irgen_LEY, ovl.fmt.RXY.r1,
13838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000065ULL: s390_format_RXY_FRRD(s390_irgen_LDY, ovl.fmt.RXY.r1,
13842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000066ULL: s390_format_RXY_FRRD(s390_irgen_STEY, ovl.fmt.RXY.r1,
13846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xed0000000067ULL: s390_format_RXY_FRRD(s390_irgen_STDY, ovl.fmt.RXY.r1,
13850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
13851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dl2,
13852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                ovl.fmt.RXY.dh2);  goto ok;
13853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
13854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (((ovl.value >> 16) & 0xff0f00000000ULL) >> 32) {
13856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc000ULL: s390_format_RIL_RP(s390_irgen_LARL, ovl.fmt.RIL.r1,
13857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc001ULL: s390_format_RIL_RI(s390_irgen_LGFI, ovl.fmt.RIL.r1,
13859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc004ULL: s390_format_RIL(s390_irgen_BRCL, ovl.fmt.RIL.r1,
13861b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                   ovl.fmt.RIL.i2);  goto ok;
13862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc005ULL: s390_format_RIL_RP(s390_irgen_BRASL, ovl.fmt.RIL.r1,
13863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc006ULL: s390_format_RIL_RU(s390_irgen_XIHF, ovl.fmt.RIL.r1,
13865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc007ULL: s390_format_RIL_RU(s390_irgen_XILF, ovl.fmt.RIL.r1,
13867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc008ULL: s390_format_RIL_RU(s390_irgen_IIHF, ovl.fmt.RIL.r1,
13869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc009ULL: s390_format_RIL_RU(s390_irgen_IILF, ovl.fmt.RIL.r1,
13871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc00aULL: s390_format_RIL_RU(s390_irgen_NIHF, ovl.fmt.RIL.r1,
13873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc00bULL: s390_format_RIL_RU(s390_irgen_NILF, ovl.fmt.RIL.r1,
13875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc00cULL: s390_format_RIL_RU(s390_irgen_OIHF, ovl.fmt.RIL.r1,
13877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc00dULL: s390_format_RIL_RU(s390_irgen_OILF, ovl.fmt.RIL.r1,
13879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc00eULL: s390_format_RIL_RU(s390_irgen_LLIHF, ovl.fmt.RIL.r1,
13881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc00fULL: s390_format_RIL_RU(s390_irgen_LLILF, ovl.fmt.RIL.r1,
13883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc200ULL: s390_format_RIL_RI(s390_irgen_MSGFI, ovl.fmt.RIL.r1,
13885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc201ULL: s390_format_RIL_RI(s390_irgen_MSFI, ovl.fmt.RIL.r1,
13887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc204ULL: s390_format_RIL_RU(s390_irgen_SLGFI, ovl.fmt.RIL.r1,
13889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc205ULL: s390_format_RIL_RU(s390_irgen_SLFI, ovl.fmt.RIL.r1,
13891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc208ULL: s390_format_RIL_RI(s390_irgen_AGFI, ovl.fmt.RIL.r1,
13893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc209ULL: s390_format_RIL_RI(s390_irgen_AFI, ovl.fmt.RIL.r1,
13895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc20aULL: s390_format_RIL_RU(s390_irgen_ALGFI, ovl.fmt.RIL.r1,
13897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc20bULL: s390_format_RIL_RU(s390_irgen_ALFI, ovl.fmt.RIL.r1,
13899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13900b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc20cULL: s390_format_RIL_RI(s390_irgen_CGFI, ovl.fmt.RIL.r1,
13901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc20dULL: s390_format_RIL_RI(s390_irgen_CFI, ovl.fmt.RIL.r1,
13903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc20eULL: s390_format_RIL_RU(s390_irgen_CLGFI, ovl.fmt.RIL.r1,
13905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc20fULL: s390_format_RIL_RU(s390_irgen_CLFI, ovl.fmt.RIL.r1,
13907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13908b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc402ULL: s390_format_RIL_RP(s390_irgen_LLHRL, ovl.fmt.RIL.r1,
13909b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc404ULL: s390_format_RIL_RP(s390_irgen_LGHRL, ovl.fmt.RIL.r1,
13911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc405ULL: s390_format_RIL_RP(s390_irgen_LHRL, ovl.fmt.RIL.r1,
13913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc406ULL: s390_format_RIL_RP(s390_irgen_LLGHRL, ovl.fmt.RIL.r1,
13915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc407ULL: s390_format_RIL_RP(s390_irgen_STHRL, ovl.fmt.RIL.r1,
13917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc408ULL: s390_format_RIL_RP(s390_irgen_LGRL, ovl.fmt.RIL.r1,
13919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13920b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc40bULL: s390_format_RIL_RP(s390_irgen_STGRL, ovl.fmt.RIL.r1,
13921b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13922b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc40cULL: s390_format_RIL_RP(s390_irgen_LGFRL, ovl.fmt.RIL.r1,
13923b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13924b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc40dULL: s390_format_RIL_RP(s390_irgen_LRL, ovl.fmt.RIL.r1,
13925b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13926b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc40eULL: s390_format_RIL_RP(s390_irgen_LLGFRL, ovl.fmt.RIL.r1,
13927b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13928b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc40fULL: s390_format_RIL_RP(s390_irgen_STRL, ovl.fmt.RIL.r1,
13929b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13930b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc600ULL: s390_format_RIL_RP(s390_irgen_EXRL, ovl.fmt.RIL.r1,
13931b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc602ULL: s390_format_RIL_UP(s390_irgen_PFDRL, ovl.fmt.RIL.r1,
13933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc604ULL: s390_format_RIL_RP(s390_irgen_CGHRL, ovl.fmt.RIL.r1,
13935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc605ULL: s390_format_RIL_RP(s390_irgen_CHRL, ovl.fmt.RIL.r1,
13937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc606ULL: s390_format_RIL_RP(s390_irgen_CLGHRL, ovl.fmt.RIL.r1,
13939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc607ULL: s390_format_RIL_RP(s390_irgen_CLHRL, ovl.fmt.RIL.r1,
13941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc608ULL: s390_format_RIL_RP(s390_irgen_CGRL, ovl.fmt.RIL.r1,
13943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc60aULL: s390_format_RIL_RP(s390_irgen_CLGRL, ovl.fmt.RIL.r1,
13945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc60cULL: s390_format_RIL_RP(s390_irgen_CGFRL, ovl.fmt.RIL.r1,
13947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc60dULL: s390_format_RIL_RP(s390_irgen_CRL, ovl.fmt.RIL.r1,
13949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc60eULL: s390_format_RIL_RP(s390_irgen_CLGFRL, ovl.fmt.RIL.r1,
13951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc60fULL: s390_format_RIL_RP(s390_irgen_CLRL, ovl.fmt.RIL.r1,
13953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13954b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc800ULL: /* MVCOS */ goto unimplemented;
13955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc801ULL: /* ECTG */ goto unimplemented;
13956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc802ULL: /* CSST */ goto unimplemented;
13957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc804ULL: /* LPD */ goto unimplemented;
13958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xc805ULL: /* LPDG */ goto unimplemented;
13959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xcc06ULL: /* BRCTH */ goto unimplemented;
13960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xcc08ULL: s390_format_RIL_RI(s390_irgen_AIH, ovl.fmt.RIL.r1,
13961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xcc0aULL: s390_format_RIL_RI(s390_irgen_ALSIH, ovl.fmt.RIL.r1,
13963b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13964b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xcc0bULL: s390_format_RIL_RI(s390_irgen_ALSIHN, ovl.fmt.RIL.r1,
13965b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13966b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xcc0dULL: s390_format_RIL_RI(s390_irgen_CIH, ovl.fmt.RIL.r1,
13967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xcc0fULL: s390_format_RIL_RU(s390_irgen_CLIH, ovl.fmt.RIL.r1,
13969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                      ovl.fmt.RIL.i2);  goto ok;
13970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
13971b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13972b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (((ovl.value >> 16) & 0xff0000000000ULL) >> 40) {
13973b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd0ULL: /* TRTR */ goto unimplemented;
13974b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd1ULL: /* MVN */ goto unimplemented;
13975b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd2ULL: s390_format_SS_L0RDRD(s390_irgen_MVC, ovl.fmt.SS.l,
13976b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SS.b1, ovl.fmt.SS.d1,
13977b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SS.b2, ovl.fmt.SS.d2);  goto ok;
13978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd3ULL: /* MVZ */ goto unimplemented;
13979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd4ULL: s390_format_SS_L0RDRD(s390_irgen_NC, ovl.fmt.SS.l,
13980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SS.b1, ovl.fmt.SS.d1,
13981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SS.b2, ovl.fmt.SS.d2);  goto ok;
13982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd5ULL: s390_format_SS_L0RDRD(s390_irgen_CLC, ovl.fmt.SS.l,
13983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SS.b1, ovl.fmt.SS.d1,
13984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SS.b2, ovl.fmt.SS.d2);  goto ok;
13985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd6ULL: s390_format_SS_L0RDRD(s390_irgen_OC, ovl.fmt.SS.l,
13986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SS.b1, ovl.fmt.SS.d1,
13987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SS.b2, ovl.fmt.SS.d2);  goto ok;
13988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd7ULL:
13989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (ovl.fmt.SS.b1 == ovl.fmt.SS.b2 && ovl.fmt.SS.d1 == ovl.fmt.SS.d2)
13990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_irgen_XC_sameloc(ovl.fmt.SS.l, ovl.fmt.SS.b1, ovl.fmt.SS.d1);
13991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      else
13992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        s390_format_SS_L0RDRD(s390_irgen_XC, ovl.fmt.SS.l,
13993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                              ovl.fmt.SS.b1, ovl.fmt.SS.d1,
13994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                              ovl.fmt.SS.b2, ovl.fmt.SS.d2);
13995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      goto ok;
13996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xd9ULL: /* MVCK */ goto unimplemented;
13997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xdaULL: /* MVCP */ goto unimplemented;
13998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xdbULL: /* MVCS */ goto unimplemented;
13999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0xdcULL: s390_format_SS_L0RDRD(s390_irgen_TR, ovl.fmt.SS.l,
14000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       ovl.fmt.SS.b1, ovl.fmt.SS.d1,
14001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       ovl.fmt.SS.b2, ovl.fmt.SS.d2);  goto ok;
14002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xddULL: /* TRT */ goto unimplemented;
14003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xdeULL: /* ED */ goto unimplemented;
14004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xdfULL: /* EDMK */ goto unimplemented;
14005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe1ULL: /* PKU */ goto unimplemented;
14006b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe2ULL: /* UNPKU */ goto unimplemented;
14007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe8ULL: /* MVCIN */ goto unimplemented;
14008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe9ULL: /* PKA */ goto unimplemented;
14009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeaULL: /* UNPKA */ goto unimplemented;
14010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xeeULL: /* PLO */ goto unimplemented;
14011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xefULL: /* LMD */ goto unimplemented;
14012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xf0ULL: /* SRP */ goto unimplemented;
14013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xf1ULL: /* MVO */ goto unimplemented;
14014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xf2ULL: /* PACK */ goto unimplemented;
14015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xf3ULL: /* UNPK */ goto unimplemented;
14016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xf8ULL: /* ZAP */ goto unimplemented;
14017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xf9ULL: /* CP */ goto unimplemented;
14018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xfaULL: /* AP */ goto unimplemented;
14019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xfbULL: /* SP */ goto unimplemented;
14020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xfcULL: /* MP */ goto unimplemented;
14021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xfdULL: /* DP */ goto unimplemented;
14022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
14023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (((ovl.value >> 16) & 0xffff00000000ULL) >> 32) {
14025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe500ULL: /* LASP */ goto unimplemented;
14026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe501ULL: /* TPROT */ goto unimplemented;
14027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe502ULL: /* STRAG */ goto unimplemented;
14028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe50eULL: /* MVCSK */ goto unimplemented;
14029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe50fULL: /* MVCDK */ goto unimplemented;
14030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe544ULL: s390_format_SIL_RDI(s390_irgen_MVHHI, ovl.fmt.SIL.b1,
14031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
14032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
14033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe548ULL: s390_format_SIL_RDI(s390_irgen_MVGHI, ovl.fmt.SIL.b1,
14034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
14035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
14036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe54cULL: s390_format_SIL_RDI(s390_irgen_MVHI, ovl.fmt.SIL.b1,
14037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
14038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
14039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe554ULL: s390_format_SIL_RDI(s390_irgen_CHHSI, ovl.fmt.SIL.b1,
14040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
14041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
14042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe555ULL: s390_format_SIL_RDU(s390_irgen_CLHHSI, ovl.fmt.SIL.b1,
14043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
14044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
14045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe558ULL: s390_format_SIL_RDI(s390_irgen_CGHSI, ovl.fmt.SIL.b1,
14046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
14047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
14048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe559ULL: s390_format_SIL_RDU(s390_irgen_CLGHSI, ovl.fmt.SIL.b1,
14049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
14050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
14051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe55cULL: s390_format_SIL_RDI(s390_irgen_CHSI, ovl.fmt.SIL.b1,
14052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
14053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
14054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case 0xe55dULL: s390_format_SIL_RDU(s390_irgen_CLFHSI, ovl.fmt.SIL.b1,
14055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
14056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                       goto ok;
14057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
14058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_UNKNOWN_INSN;
14060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovok:
14062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_OK;
14063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunimplemented:
14065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return S390_DECODE_UNIMPLEMENTED_INSN;
14066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
14067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Handle "special" instructions. */
14069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic s390_decode_t
14070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_decode_special_and_irgen(UChar *bytes)
14071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
14072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_decode_t status = S390_DECODE_OK;
14073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Got a "Special" instruction preamble.  Which one is it? */
14075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (bytes[0] == 0x18 && bytes[1] == 0x22 /* lr %r2, %r2 */) {
14076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_irgen_client_request();
14077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else if (bytes[0] == 0x18 && bytes[1] == 0x33 /* lr %r3, %r3 */) {
14078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_irgen_guest_NRADDR();
14079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else if (bytes[0] == 0x18 && bytes[1] == 0x44 /* lr %r4, %r4 */) {
14080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      s390_irgen_call_noredir();
14081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
14082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* We don't know what it is. */
14083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return S390_DECODE_UNKNOWN_SPECIAL_INSN;
14084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
14085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dis_res->len = S390_SPECIAL_OP_PREAMBLE_SIZE + S390_SPECIAL_OP_SIZE;
14087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return status;
14089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
14090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14092b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Function returns # bytes that were decoded or 0 in case of failure */
14093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic UInt
14094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovs390_decode_and_irgen(UChar *bytes, UInt insn_length, DisResult *dres)
14095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
14096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   s390_decode_t status;
14097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dis_res = dres;
14099b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Spot the 8-byte preamble:   18ff lr r15,r15
14101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  1811 lr r1,r1
14102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  1822 lr r2,r2
14103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                  1833 lr r3,r3 */
14104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (bytes[ 0] == 0x18 && bytes[ 1] == 0xff && bytes[ 2] == 0x18 &&
14105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       bytes[ 3] == 0x11 && bytes[ 4] == 0x18 && bytes[ 5] == 0x22 &&
14106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       bytes[ 6] == 0x18 && bytes[ 7] == 0x33) {
14107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* Handle special instruction that follows that preamble. */
14109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (0) vex_printf("special function handling...\n");
14110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      insn_length = S390_SPECIAL_OP_PREAMBLE_SIZE + S390_SPECIAL_OP_SIZE;
14112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      guest_IA_next_instr = guest_IA_curr_instr + insn_length;
14113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      status =
14115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         s390_decode_special_and_irgen(bytes + S390_SPECIAL_OP_PREAMBLE_SIZE);
14116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else {
14117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* Handle normal instructions. */
14118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      switch (insn_length) {
14119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 2:
14120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         status = s390_decode_2byte_and_irgen(bytes);
14121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
14122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 4:
14124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         status = s390_decode_4byte_and_irgen(bytes);
14125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
14126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 6:
14128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         status = s390_decode_6byte_and_irgen(bytes);
14129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
14130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      default:
14132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        status = S390_DECODE_ERROR;
14133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        break;
14134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
14135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
14136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* If next instruction is execute, stop here */
14137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (dis_res->whatNext == Dis_Continue && bytes[insn_length] == 0x44) {
14138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      put_IA(mkaddr_expr(guest_IA_next_instr));
14139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      dis_res->whatNext = Dis_StopHere;
14140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dis_res->jk_StopHere = Ijk_Boring;
14141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
14142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (status == S390_DECODE_OK) return insn_length;  /* OK */
14144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Decoding failed somehow */
14146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vex_printf("vex s390->IR: ");
14147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switch (status) {
14148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case S390_DECODE_UNKNOWN_INSN:
14149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      vex_printf("unknown insn: ");
14150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
14151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case S390_DECODE_UNIMPLEMENTED_INSN:
14153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      vex_printf("unimplemented insn: ");
14154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
14155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case S390_DECODE_UNKNOWN_SPECIAL_INSN:
14157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      vex_printf("unimplemented special insn: ");
14158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
14159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   default:
14161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case S390_DECODE_ERROR:
14162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      vex_printf("decoding error: ");
14163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
14164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
14165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vex_printf("%02x%02x", bytes[0], bytes[1]);
14167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (insn_length > 2) {
14168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      vex_printf(" %02x%02x", bytes[2], bytes[3]);
14169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
14170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (insn_length > 4) {
14171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      vex_printf(" %02x%02x", bytes[4], bytes[5]);
14172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
14173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vex_printf("\n");
14174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return 0;  /* Failed */
14176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
14177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Disassemble a single instruction INSN into IR. */
14180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic DisResult
14181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovdisInstr_S390_WRK(UChar *insn)
14182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
14183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UChar byte;
14184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt  insn_length;
14185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   DisResult dres;
14186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* ---------------------------------------------------- */
14188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* --- Compute instruction length                    -- */
14189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* ---------------------------------------------------- */
14190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Get the first byte of the insn. */
14192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   byte = insn[0];
14193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* The leftmost two bits (0:1) encode the length of the insn in bytes.
14195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      00 -> 2 bytes, 01 -> 4 bytes, 10 -> 4 bytes, 11 -> 6 bytes. */
14196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   insn_length = ((((byte >> 6) + 1) >> 1) + 1) << 1;
14197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   guest_IA_next_instr = guest_IA_curr_instr + insn_length;
14199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* ---------------------------------------------------- */
14201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* --- Initialise the DisResult data                 -- */
14202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* ---------------------------------------------------- */
14203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dres.whatNext   = Dis_Continue;
14204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dres.len        = insn_length;
14205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dres.continueAt = 0;
14206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dres.jk_StopHere = Ijk_INVALID;
14207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* fixs390: consider chasing of conditional jumps */
14209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Normal and special instruction handling starts here. */
14211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (s390_decode_and_irgen(insn, insn_length, &dres) == 0) {
14212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* All decode failures end up here. The decoder has already issued an
14213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         error message.
14214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         Tell the dispatcher that this insn cannot be decoded, and so has
14215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         not been executed, and (is currently) the next to be executed.
14216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         The insn address in the guest state needs to be set to
14217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         guest_IA_curr_instr, otherwise the complaint will report an
14218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         incorrect address. */
14219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      put_IA(mkaddr_expr(guest_IA_curr_instr));
14220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dres.whatNext    = Dis_StopHere;
14222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dres.jk_StopHere = Ijk_NoDecode;
14223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dres.continueAt  = 0;
14224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dres.len         = 0;
14225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else {
14226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Decode success */
14227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (dres.whatNext) {
14228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Dis_Continue:
14229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         put_IA(mkaddr_expr(guest_IA_next_instr));
14230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
14231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Dis_ResteerU:
14232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Dis_ResteerC:
14233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         put_IA(mkaddr_expr(dres.continueAt));
14234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
14235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Dis_StopHere:
14236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
14237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
14238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(0);
14239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
14240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
14241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return dres;
14243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
14244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
14247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Top-level fn                                         ---*/
14248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------*/
14249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Disassemble a single instruction into IR.  The instruction
14251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   is located in host memory at &guest_code[delta]. */
14252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovDisResult
14254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovdisInstr_S390(IRSB        *irsb_IN,
14255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              Bool       (*resteerOkFn)(void *, Addr64),
14256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              Bool         resteerCisOk,
14257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              void        *callback_opaque,
14258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              UChar       *guest_code,
14259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              Long         delta,
14260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              Addr64       guest_IP,
14261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              VexArch      guest_arch,
14262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              VexArchInfo *archinfo,
14263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              VexAbiInfo  *abiinfo,
14264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              Bool         host_bigendian)
14265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
14266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(guest_arch == VexArchS390X);
14267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* The instruction decoder requires a big-endian machine. */
14269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vassert(host_bigendian == True);
14270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Set globals (see top of this file) */
14272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   guest_IA_curr_instr = guest_IP;
14273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   irsb = irsb_IN;
14274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   resteer_fn = resteerOkFn;
14275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   resteer_data = callback_opaque;
14276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return disInstr_S390_WRK(guest_code + delta);
14278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
14279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------------------------------------------------------*/
14281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- end                                   guest_s390_toIR.c ---*/
14282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------------------------------------------------------*/
14283