1 /* -*- mode: C; c-basic-offset: 3; -*- */
3 /*---------------------------------------------------------------*/
4 /*--- begin guest_s390_toIR.c ---*/
5 /*---------------------------------------------------------------*/
8 This file is part of Valgrind, a dynamic binary instrumentation
11 Copyright IBM Corp. 2010-2011
13 This program is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2 of the
16 License, or (at your option) any later version.
18 This program is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
28 The GNU General Public License is contained in the file COPYING.
31 /* Contributed by Florian Krohm and Christian Borntraeger */
33 /* Translates s390 code to IR. */
35 #include "libvex_basictypes.h"
36 #include "libvex_ir.h"
37 #include "libvex_guest_s390x.h" /* VexGuestS390XState */
38 #include "libvex.h" /* needed for bb_to_IR.h */
39 #include "libvex_guest_offsets.h" /* OFFSET_s390x_SYSNO */
41 #include "main_util.h" /* vassert */
42 #include "main_globals.h" /* vex_traceflags */
43 #include "guest_generic_bb_to_IR.h" /* DisResult */
44 #include "guest_s390_defs.h" /* prototypes for this file's functions */
45 #include "host_s390_disasm.h"
46 #include "host_s390_defs.h" /* S390_ROUND_xyzzy */
49 /*------------------------------------------------------------*/
51 /*------------------------------------------------------------*/
53 /* The IRSB* into which we're generating code. */
56 /* The guest address for the instruction currently being
58 static Addr64 guest_IA_curr_instr;
60 /* The guest address for the instruction following the current instruction. */
61 static Addr64 guest_IA_next_instr;
63 /* Result of disassembly step. */
64 static DisResult *dis_res;
66 /* The last seen execute target instruction */
67 ULong last_execute_target;
69 /* The possible outcomes of a decoding operation */
72 S390_DECODE_UNKNOWN_INSN,
73 S390_DECODE_UNIMPLEMENTED_INSN,
74 S390_DECODE_UNKNOWN_SPECIAL_INSN,
78 /*------------------------------------------------------------*/
79 /*--- Helpers for constructing IR. ---*/
80 /*------------------------------------------------------------*/
82 /* Sign extend a value with the given number of bits. This is a
83 macro because it allows us to overload the type of the value.
84 Note that VALUE must have a signed type! */
86 #define sign_extend(value,num_bits) \
87 (((value) << (sizeof(__typeof__(value)) * 8 - (num_bits))) >> \
88 (sizeof(__typeof__(value)) * 8 - (num_bits)))
91 /* Add a statement to the current irsb. */
92 static __inline__ void
95 addStmtToIRSB(irsb, st);
98 /* Allocate a new temporary of the given type. */
99 static __inline__ IRTemp
102 vassert(isPlausibleIRType(type));
104 return newIRTemp(irsb->tyenv, type);
107 /* Create an expression node for a temporary */
108 static __inline__ IRExpr *
111 return IRExpr_RdTmp(tmp);
114 /* Add a statement that assigns to a temporary */
115 static __inline__ void
116 assign(IRTemp dst, IRExpr *expr)
118 stmt(IRStmt_WrTmp(dst, expr));
121 /* Create a temporary of the given type and assign the expression to it */
122 static __inline__ IRTemp
123 mktemp(IRType type, IRExpr *expr)
125 IRTemp temp = newTemp(type);
132 /* Create a unary expression */
133 static __inline__ IRExpr *
134 unop(IROp kind, IRExpr *op)
136 return IRExpr_Unop(kind, op);
139 /* Create a binary expression */
140 static __inline__ IRExpr *
141 binop(IROp kind, IRExpr *op1, IRExpr *op2)
143 return IRExpr_Binop(kind, op1, op2);
146 /* Create a ternary expression */
147 static __inline__ IRExpr *
148 triop(IROp kind, IRExpr *op1, IRExpr *op2, IRExpr *op3)
150 return IRExpr_Triop(kind, op1, op2, op3);
153 /* Create a quaternary expression */
154 static __inline__ IRExpr *
155 qop(IROp kind, IRExpr *op1, IRExpr *op2, IRExpr *op3, IRExpr *op4)
157 return IRExpr_Qop(kind, op1, op2, op3, op4);
160 /* Create an expression node for an 8-bit integer constant */
161 static __inline__ IRExpr *
164 vassert(value < 256);
166 return IRExpr_Const(IRConst_U8((UChar)value));
169 /* Create an expression node for a 16-bit integer constant */
170 static __inline__ IRExpr *
173 vassert(value < 65536);
175 return IRExpr_Const(IRConst_U16((UShort)value));
178 /* Create an expression node for a 32-bit integer constant */
179 static __inline__ IRExpr *
182 return IRExpr_Const(IRConst_U32(value));
185 /* Create an expression node for a 64-bit integer constant */
186 static __inline__ IRExpr *
189 return IRExpr_Const(IRConst_U64(value));
192 /* Create an expression node for a 32-bit floating point constant
193 whose value is given by a bit pattern. */
194 static __inline__ IRExpr *
197 return IRExpr_Const(IRConst_F32i(value));
200 /* Create an expression node for a 32-bit floating point constant
201 whose value is given by a bit pattern. */
202 static __inline__ IRExpr *
205 return IRExpr_Const(IRConst_F64i(value));
208 /* Little helper function for my sanity. ITE = if-then-else */
210 mkite(IRExpr *condition, IRExpr *iftrue, IRExpr *iffalse)
212 vassert(typeOfIRExpr(irsb->tyenv, condition) == Ity_I1);
214 return IRExpr_Mux0X(unop(Iop_1Uto8, condition), iffalse, iftrue);
217 /* Add a statement that stores DATA at ADDR. This is a big-endian machine. */
218 static void __inline__
219 store(IRExpr *addr, IRExpr *data)
221 stmt(IRStmt_Store(Iend_BE, addr, data));
224 /* Create an expression that loads a TYPE sized value from ADDR.
225 This is a big-endian machine. */
226 static __inline__ IRExpr *
227 load(IRType type, IRExpr *addr)
229 return IRExpr_Load(Iend_BE, type, addr);
234 call_function(IRExpr *callee_address)
236 irsb->next = callee_address;
237 irsb->jumpkind = Ijk_Call;
239 dis_res->whatNext = Dis_StopHere;
242 /* Function return sequence */
244 return_from_function(IRExpr *return_address)
246 irsb->next = return_address;
247 irsb->jumpkind = Ijk_Ret;
249 dis_res->whatNext = Dis_StopHere;
252 /* A conditional branch whose target is not known at instrumentation time.
254 if (condition) goto computed_target;
256 Needs to be represented as:
258 if (! condition) goto next_instruction;
259 goto computed_target;
261 This inversion is being handled at code generation time. So we just
262 take the condition here as is.
265 if_not_condition_goto_computed(IRExpr *condition, IRExpr *target)
267 vassert(typeOfIRExpr(irsb->tyenv, condition) == Ity_I1);
269 stmt(IRStmt_Exit(condition, Ijk_Boring, IRConst_U64(guest_IA_next_instr)));
272 irsb->jumpkind = Ijk_Boring;
274 dis_res->whatNext = Dis_StopHere;
277 /* A conditional branch whose target is known at instrumentation time. */
279 if_condition_goto(IRExpr *condition, Addr64 target)
281 vassert(typeOfIRExpr(irsb->tyenv, condition) == Ity_I1);
283 stmt(IRStmt_Exit(condition, Ijk_Boring, IRConst_U64(target)));
284 dis_res->whatNext = Dis_Continue;
287 /* An unconditional branch. Target may or may not be known at instrumentation
290 always_goto(IRExpr *target)
293 irsb->jumpkind = Ijk_Boring;
295 dis_res->whatNext = Dis_StopHere;
300 system_call(IRExpr *sysno)
302 /* Store the system call number in the pseudo register. */
303 stmt(IRStmt_Put(OFFSET_s390x_SYSNO, sysno));
305 /* Store the current IA into guest_IP_AT_SYSCALL. libvex_ir.h says so. */
306 stmt(IRStmt_Put(OFFSET_s390x_IP_AT_SYSCALL, mkU64(guest_IA_curr_instr)));
308 /* It's important that all ArchRegs carry their up-to-date value
309 at this point. So we declare an end-of-block here, which
310 forces any TempRegs caching ArchRegs to be flushed. */
311 irsb->next = mkU64(guest_IA_next_instr);
313 irsb->jumpkind = Ijk_Sys_syscall;
315 dis_res->whatNext = Dis_StopHere;
318 /* Encode the s390 rounding mode as it appears in the m3/m4 fields of certain
319 instructions to VEX's IRRoundingMode. */
320 static IRRoundingMode
321 encode_rounding_mode(UChar mode)
324 case S390_ROUND_NEAREST_EVEN: return Irrm_NEAREST;
325 case S390_ROUND_ZERO: return Irrm_ZERO;
326 case S390_ROUND_POSINF: return Irrm_PosINF;
327 case S390_ROUND_NEGINF: return Irrm_NegINF;
329 vpanic("encode_rounding_mode");
332 static __inline__ IRExpr *get_fpr_dw0(UInt);
333 static __inline__ void put_fpr_dw0(UInt, IRExpr *);
335 /* Read a floating point register pair and combine their contents into a
338 get_fpr_pair(UInt archreg)
340 IRExpr *high = get_fpr_dw0(archreg);
341 IRExpr *low = get_fpr_dw0(archreg + 2);
343 return binop(Iop_F64HLtoF128, high, low);
346 /* Write a 128-bit floating point value into a register pair. */
348 put_fpr_pair(UInt archreg, IRExpr *expr)
350 IRExpr *high = unop(Iop_F128HItoF64, expr);
351 IRExpr *low = unop(Iop_F128LOtoF64, expr);
353 put_fpr_dw0(archreg, high);
354 put_fpr_dw0(archreg + 2, low);
358 /* Flags thunk offsets */
359 #define S390X_GUEST_OFFSET_CC_OP S390_GUEST_OFFSET(guest_CC_OP)
360 #define S390X_GUEST_OFFSET_CC_DEP1 S390_GUEST_OFFSET(guest_CC_DEP1)
361 #define S390X_GUEST_OFFSET_CC_DEP2 S390_GUEST_OFFSET(guest_CC_DEP2)
362 #define S390X_GUEST_OFFSET_CC_NDEP S390_GUEST_OFFSET(guest_CC_NDEP)
364 /*------------------------------------------------------------*/
365 /*--- Build the flags thunk. ---*/
366 /*------------------------------------------------------------*/
368 /* Completely fill the flags thunk. We're always filling all fields.
369 Apparently, that is better for redundant PUT elimination. */
371 s390_cc_thunk_fill(IRExpr *op, IRExpr *dep1, IRExpr *dep2, IRExpr *ndep)
373 UInt op_off, dep1_off, dep2_off, ndep_off;
375 op_off = S390X_GUEST_OFFSET_CC_OP;
376 dep1_off = S390X_GUEST_OFFSET_CC_DEP1;
377 dep2_off = S390X_GUEST_OFFSET_CC_DEP2;
378 ndep_off = S390X_GUEST_OFFSET_CC_NDEP;
380 stmt(IRStmt_Put(op_off, op));
381 stmt(IRStmt_Put(dep1_off, dep1));
382 stmt(IRStmt_Put(dep2_off, dep2));
383 stmt(IRStmt_Put(ndep_off, ndep));
387 /* Create an expression for V and widen the result to 64 bit. */
389 s390_cc_widen(IRTemp v, Bool sign_extend)
395 switch (typeOfIRTemp(irsb->tyenv, v)) {
399 expr = unop(sign_extend ? Iop_32Sto64 : Iop_32Uto64, expr);
402 expr = unop(sign_extend ? Iop_16Sto64 : Iop_16Uto64, expr);
405 expr = unop(sign_extend ? Iop_8Sto64 : Iop_8Uto64, expr);
408 vpanic("s390_cc_widen");
415 s390_cc_thunk_put1(UInt opc, IRTemp d1, Bool sign_extend)
417 IRExpr *op, *dep1, *dep2, *ndep;
420 dep1 = s390_cc_widen(d1, sign_extend);
424 s390_cc_thunk_fill(op, dep1, dep2, ndep);
429 s390_cc_thunk_put2(UInt opc, IRTemp d1, IRTemp d2, Bool sign_extend)
431 IRExpr *op, *dep1, *dep2, *ndep;
434 dep1 = s390_cc_widen(d1, sign_extend);
435 dep2 = s390_cc_widen(d2, sign_extend);
438 s390_cc_thunk_fill(op, dep1, dep2, ndep);
442 /* memcheck believes that the NDEP field in the flags thunk is always
443 defined. But for some flag computations (e.g. add with carry) that is
444 just not true. We therefore need to convey to memcheck that the value
445 of the ndep field does matter and therefore we make the DEP2 field
448 DEP2 = original_DEP2 ^ NDEP
450 In s390_calculate_cc we exploit that (a^b)^b == a
451 I.e. we xor the DEP2 value with the NDEP value to recover the
452 original_DEP2 value. */
454 s390_cc_thunk_put3(UInt opc, IRTemp d1, IRTemp d2, IRTemp nd, Bool sign_extend)
456 IRExpr *op, *dep1, *dep2, *ndep, *dep2x;
459 dep1 = s390_cc_widen(d1, sign_extend);
460 dep2 = s390_cc_widen(d2, sign_extend);
461 ndep = s390_cc_widen(nd, sign_extend);
463 dep2x = binop(Iop_Xor64, dep2, ndep);
465 s390_cc_thunk_fill(op, dep1, dep2x, ndep);
469 /* Write one floating point value into the flags thunk */
471 s390_cc_thunk_put1f(UInt opc, IRTemp d1)
473 IRExpr *op, *dep1, *dep2, *ndep;
480 s390_cc_thunk_fill(op, dep1, dep2, ndep);
484 /* Write a floating point value and an integer into the flags thunk. The
485 integer value is zero-extended first. */
487 s390_cc_thunk_putFZ(UInt opc, IRTemp d1, IRTemp d2)
489 IRExpr *op, *dep1, *dep2, *ndep;
493 dep2 = s390_cc_widen(d2, False);
496 s390_cc_thunk_fill(op, dep1, dep2, ndep);
500 /* Write a 128-bit floating point value into the flags thunk. This is
501 done by splitting the value into two 64-bits values. */
503 s390_cc_thunk_put1f128(UInt opc, IRTemp d1)
505 IRExpr *op, *hi, *lo, *ndep;
508 hi = unop(Iop_F128HItoF64, mkexpr(d1));
509 lo = unop(Iop_F128LOtoF64, mkexpr(d1));
512 s390_cc_thunk_fill(op, hi, lo, ndep);
516 /* Write a 128-bit floating point value and an integer into the flags thunk.
517 The integer value is zero-extended first. */
519 s390_cc_thunk_put1f128Z(UInt opc, IRTemp d1, IRTemp nd)
521 IRExpr *op, *hi, *lo, *lox, *ndep;
524 hi = unop(Iop_F128HItoF64, mkexpr(d1));
525 lo = unop(Iop_ReinterpF64asI64, unop(Iop_F128LOtoF64, mkexpr(d1)));
526 ndep = s390_cc_widen(nd, False);
528 lox = binop(Iop_Xor64, lo, ndep); /* convey dependency */
530 s390_cc_thunk_fill(op, hi, lox, ndep);
535 s390_cc_set(UInt val)
537 s390_cc_thunk_fill(mkU64(S390_CC_OP_SET),
538 mkU64(val), mkU64(0), mkU64(0));
541 /* Build IR to calculate the condition code from flags thunk.
542 Returns an expression of type Ity_I32 */
544 s390_call_calculate_cc(void)
546 IRExpr **args, *call, *op, *dep1, *dep2, *ndep;
548 op = IRExpr_Get(S390X_GUEST_OFFSET_CC_OP, Ity_I64);
549 dep1 = IRExpr_Get(S390X_GUEST_OFFSET_CC_DEP1, Ity_I64);
550 dep2 = IRExpr_Get(S390X_GUEST_OFFSET_CC_DEP2, Ity_I64);
551 ndep = IRExpr_Get(S390X_GUEST_OFFSET_CC_NDEP, Ity_I64);
553 args = mkIRExprVec_4(op, dep1, dep2, ndep);
554 call = mkIRExprCCall(Ity_I32, 0 /*regparm*/,
555 "s390_calculate_cc", &s390_calculate_cc, args);
557 /* Exclude OP and NDEP from definedness checking. We're only
558 interested in DEP1 and DEP2. */
559 call->Iex.CCall.cee->mcx_mask = (1<<0) | (1<<3);
564 /* Build IR to calculate the internal condition code for a "compare and branch"
565 insn. Returns an expression of type Ity_I32 */
567 s390_call_calculate_icc(UInt opc, IRTemp op1, IRTemp op2, Bool sign_extend)
569 IRExpr **args, *call, *op, *dep1, *dep2;
572 dep1 = s390_cc_widen(op1, sign_extend);
573 dep2 = s390_cc_widen(op2, sign_extend);
575 args = mkIRExprVec_3(op, dep1, dep2);
576 call = mkIRExprCCall(Ity_I32, 0 /*regparm*/,
577 "s390_calculate_icc", &s390_calculate_icc, args);
579 /* Exclude OP from definedness checking. We're only
580 interested in DEP1 and DEP2. */
581 call->Iex.CCall.cee->mcx_mask = (1<<0);
586 /* Build IR to calculate the condition code from flags thunk.
587 Returns an expression of type Ity_I32 */
589 s390_call_calculate_cond(UInt m)
591 IRExpr **args, *call, *op, *dep1, *dep2, *ndep, *mask;
594 op = IRExpr_Get(S390X_GUEST_OFFSET_CC_OP, Ity_I64);
595 dep1 = IRExpr_Get(S390X_GUEST_OFFSET_CC_DEP1, Ity_I64);
596 dep2 = IRExpr_Get(S390X_GUEST_OFFSET_CC_DEP2, Ity_I64);
597 ndep = IRExpr_Get(S390X_GUEST_OFFSET_CC_NDEP, Ity_I64);
599 args = mkIRExprVec_5(mask, op, dep1, dep2, ndep);
600 call = mkIRExprCCall(Ity_I32, 0 /*regparm*/,
601 "s390_calculate_cond", &s390_calculate_cond, args);
603 /* Exclude the requested condition, OP and NDEP from definedness
604 checking. We're only interested in DEP1 and DEP2. */
605 call->Iex.CCall.cee->mcx_mask = (1<<0) | (1<<1) | (1<<4);
610 #define s390_cc_thunk_putZ(op,dep1) s390_cc_thunk_put1(op,dep1,False)
611 #define s390_cc_thunk_putS(op,dep1) s390_cc_thunk_put1(op,dep1,True)
612 #define s390_cc_thunk_putF(op,dep1) s390_cc_thunk_put1f(op,dep1)
613 #define s390_cc_thunk_putZZ(op,dep1,dep2) s390_cc_thunk_put2(op,dep1,dep2,False)
614 #define s390_cc_thunk_putSS(op,dep1,dep2) s390_cc_thunk_put2(op,dep1,dep2,True)
615 #define s390_cc_thunk_putFF(op,dep1,dep2) s390_cc_thunk_put2f(op,dep1,dep2)
616 #define s390_cc_thunk_putZZZ(op,dep1,dep2,ndep) \
617 s390_cc_thunk_put3(op,dep1,dep2,ndep,False)
618 #define s390_cc_thunk_putSSS(op,dep1,dep2,ndep) \
619 s390_cc_thunk_put3(op,dep1,dep2,ndep,True)
620 #define s390_call_calculate_iccZZ(op,dep1,dep2) \
621 s390_call_calculate_icc(op,dep1,dep2,False)
622 #define s390_call_calculate_iccSS(op,dep1,dep2) \
623 s390_call_calculate_icc(op,dep1,dep2,True)
626 #define OFFB_TISTART offsetof(VexGuestS390XState, guest_TISTART)
627 #define OFFB_TILEN offsetof(VexGuestS390XState, guest_TILEN)
630 /*------------------------------------------------------------*/
631 /*--- Guest register access ---*/
632 /*------------------------------------------------------------*/
635 /*------------------------------------------------------------*/
636 /*--- ar registers ---*/
637 /*------------------------------------------------------------*/
639 /* Return the guest state offset of a ar register. */
641 ar_offset(UInt archreg)
643 static const UInt offset[16] = {
644 offsetof(VexGuestS390XState, guest_a0),
645 offsetof(VexGuestS390XState, guest_a1),
646 offsetof(VexGuestS390XState, guest_a2),
647 offsetof(VexGuestS390XState, guest_a3),
648 offsetof(VexGuestS390XState, guest_a4),
649 offsetof(VexGuestS390XState, guest_a5),
650 offsetof(VexGuestS390XState, guest_a6),
651 offsetof(VexGuestS390XState, guest_a7),
652 offsetof(VexGuestS390XState, guest_a8),
653 offsetof(VexGuestS390XState, guest_a9),
654 offsetof(VexGuestS390XState, guest_a10),
655 offsetof(VexGuestS390XState, guest_a11),
656 offsetof(VexGuestS390XState, guest_a12),
657 offsetof(VexGuestS390XState, guest_a13),
658 offsetof(VexGuestS390XState, guest_a14),
659 offsetof(VexGuestS390XState, guest_a15),
662 vassert(archreg < 16);
664 return offset[archreg];
668 /* Return the guest state offset of word #0 of a ar register. */
669 static __inline__ UInt
670 ar_w0_offset(UInt archreg)
672 return ar_offset(archreg) + 0;
675 /* Write word #0 of a ar to the guest state. */
676 static __inline__ void
677 put_ar_w0(UInt archreg, IRExpr *expr)
679 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
681 stmt(IRStmt_Put(ar_w0_offset(archreg), expr));
684 /* Read word #0 of a ar register. */
685 static __inline__ IRExpr *
686 get_ar_w0(UInt archreg)
688 return IRExpr_Get(ar_w0_offset(archreg), Ity_I32);
692 /*------------------------------------------------------------*/
693 /*--- fpr registers ---*/
694 /*------------------------------------------------------------*/
696 /* Return the guest state offset of a fpr register. */
698 fpr_offset(UInt archreg)
700 static const UInt offset[16] = {
701 offsetof(VexGuestS390XState, guest_f0),
702 offsetof(VexGuestS390XState, guest_f1),
703 offsetof(VexGuestS390XState, guest_f2),
704 offsetof(VexGuestS390XState, guest_f3),
705 offsetof(VexGuestS390XState, guest_f4),
706 offsetof(VexGuestS390XState, guest_f5),
707 offsetof(VexGuestS390XState, guest_f6),
708 offsetof(VexGuestS390XState, guest_f7),
709 offsetof(VexGuestS390XState, guest_f8),
710 offsetof(VexGuestS390XState, guest_f9),
711 offsetof(VexGuestS390XState, guest_f10),
712 offsetof(VexGuestS390XState, guest_f11),
713 offsetof(VexGuestS390XState, guest_f12),
714 offsetof(VexGuestS390XState, guest_f13),
715 offsetof(VexGuestS390XState, guest_f14),
716 offsetof(VexGuestS390XState, guest_f15),
719 vassert(archreg < 16);
721 return offset[archreg];
725 /* Return the guest state offset of word #0 of a fpr register. */
726 static __inline__ UInt
727 fpr_w0_offset(UInt archreg)
729 return fpr_offset(archreg) + 0;
732 /* Write word #0 of a fpr to the guest state. */
733 static __inline__ void
734 put_fpr_w0(UInt archreg, IRExpr *expr)
736 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_F32);
738 stmt(IRStmt_Put(fpr_w0_offset(archreg), expr));
741 /* Read word #0 of a fpr register. */
742 static __inline__ IRExpr *
743 get_fpr_w0(UInt archreg)
745 return IRExpr_Get(fpr_w0_offset(archreg), Ity_F32);
748 /* Return the guest state offset of double word #0 of a fpr register. */
749 static __inline__ UInt
750 fpr_dw0_offset(UInt archreg)
752 return fpr_offset(archreg) + 0;
755 /* Write double word #0 of a fpr to the guest state. */
756 static __inline__ void
757 put_fpr_dw0(UInt archreg, IRExpr *expr)
759 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_F64);
761 stmt(IRStmt_Put(fpr_dw0_offset(archreg), expr));
764 /* Read double word #0 of a fpr register. */
765 static __inline__ IRExpr *
766 get_fpr_dw0(UInt archreg)
768 return IRExpr_Get(fpr_dw0_offset(archreg), Ity_F64);
772 /*------------------------------------------------------------*/
773 /*--- gpr registers ---*/
774 /*------------------------------------------------------------*/
776 /* Return the guest state offset of a gpr register. */
778 gpr_offset(UInt archreg)
780 static const UInt offset[16] = {
781 offsetof(VexGuestS390XState, guest_r0),
782 offsetof(VexGuestS390XState, guest_r1),
783 offsetof(VexGuestS390XState, guest_r2),
784 offsetof(VexGuestS390XState, guest_r3),
785 offsetof(VexGuestS390XState, guest_r4),
786 offsetof(VexGuestS390XState, guest_r5),
787 offsetof(VexGuestS390XState, guest_r6),
788 offsetof(VexGuestS390XState, guest_r7),
789 offsetof(VexGuestS390XState, guest_r8),
790 offsetof(VexGuestS390XState, guest_r9),
791 offsetof(VexGuestS390XState, guest_r10),
792 offsetof(VexGuestS390XState, guest_r11),
793 offsetof(VexGuestS390XState, guest_r12),
794 offsetof(VexGuestS390XState, guest_r13),
795 offsetof(VexGuestS390XState, guest_r14),
796 offsetof(VexGuestS390XState, guest_r15),
799 vassert(archreg < 16);
801 return offset[archreg];
805 /* Return the guest state offset of word #0 of a gpr register. */
806 static __inline__ UInt
807 gpr_w0_offset(UInt archreg)
809 return gpr_offset(archreg) + 0;
812 /* Write word #0 of a gpr to the guest state. */
813 static __inline__ void
814 put_gpr_w0(UInt archreg, IRExpr *expr)
816 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
818 stmt(IRStmt_Put(gpr_w0_offset(archreg), expr));
821 /* Read word #0 of a gpr register. */
822 static __inline__ IRExpr *
823 get_gpr_w0(UInt archreg)
825 return IRExpr_Get(gpr_w0_offset(archreg), Ity_I32);
828 /* Return the guest state offset of double word #0 of a gpr register. */
829 static __inline__ UInt
830 gpr_dw0_offset(UInt archreg)
832 return gpr_offset(archreg) + 0;
835 /* Write double word #0 of a gpr to the guest state. */
836 static __inline__ void
837 put_gpr_dw0(UInt archreg, IRExpr *expr)
839 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I64);
841 stmt(IRStmt_Put(gpr_dw0_offset(archreg), expr));
844 /* Read double word #0 of a gpr register. */
845 static __inline__ IRExpr *
846 get_gpr_dw0(UInt archreg)
848 return IRExpr_Get(gpr_dw0_offset(archreg), Ity_I64);
851 /* Return the guest state offset of half word #1 of a gpr register. */
852 static __inline__ UInt
853 gpr_hw1_offset(UInt archreg)
855 return gpr_offset(archreg) + 2;
858 /* Write half word #1 of a gpr to the guest state. */
859 static __inline__ void
860 put_gpr_hw1(UInt archreg, IRExpr *expr)
862 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I16);
864 stmt(IRStmt_Put(gpr_hw1_offset(archreg), expr));
867 /* Read half word #1 of a gpr register. */
868 static __inline__ IRExpr *
869 get_gpr_hw1(UInt archreg)
871 return IRExpr_Get(gpr_hw1_offset(archreg), Ity_I16);
874 /* Return the guest state offset of byte #6 of a gpr register. */
875 static __inline__ UInt
876 gpr_b6_offset(UInt archreg)
878 return gpr_offset(archreg) + 6;
881 /* Write byte #6 of a gpr to the guest state. */
882 static __inline__ void
883 put_gpr_b6(UInt archreg, IRExpr *expr)
885 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
887 stmt(IRStmt_Put(gpr_b6_offset(archreg), expr));
890 /* Read byte #6 of a gpr register. */
891 static __inline__ IRExpr *
892 get_gpr_b6(UInt archreg)
894 return IRExpr_Get(gpr_b6_offset(archreg), Ity_I8);
897 /* Return the guest state offset of byte #3 of a gpr register. */
898 static __inline__ UInt
899 gpr_b3_offset(UInt archreg)
901 return gpr_offset(archreg) + 3;
904 /* Write byte #3 of a gpr to the guest state. */
905 static __inline__ void
906 put_gpr_b3(UInt archreg, IRExpr *expr)
908 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
910 stmt(IRStmt_Put(gpr_b3_offset(archreg), expr));
913 /* Read byte #3 of a gpr register. */
914 static __inline__ IRExpr *
915 get_gpr_b3(UInt archreg)
917 return IRExpr_Get(gpr_b3_offset(archreg), Ity_I8);
920 /* Return the guest state offset of byte #0 of a gpr register. */
921 static __inline__ UInt
922 gpr_b0_offset(UInt archreg)
924 return gpr_offset(archreg) + 0;
927 /* Write byte #0 of a gpr to the guest state. */
928 static __inline__ void
929 put_gpr_b0(UInt archreg, IRExpr *expr)
931 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
933 stmt(IRStmt_Put(gpr_b0_offset(archreg), expr));
936 /* Read byte #0 of a gpr register. */
937 static __inline__ IRExpr *
938 get_gpr_b0(UInt archreg)
940 return IRExpr_Get(gpr_b0_offset(archreg), Ity_I8);
943 /* Return the guest state offset of word #1 of a gpr register. */
944 static __inline__ UInt
945 gpr_w1_offset(UInt archreg)
947 return gpr_offset(archreg) + 4;
950 /* Write word #1 of a gpr to the guest state. */
951 static __inline__ void
952 put_gpr_w1(UInt archreg, IRExpr *expr)
954 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
956 stmt(IRStmt_Put(gpr_w1_offset(archreg), expr));
959 /* Read word #1 of a gpr register. */
960 static __inline__ IRExpr *
961 get_gpr_w1(UInt archreg)
963 return IRExpr_Get(gpr_w1_offset(archreg), Ity_I32);
966 /* Return the guest state offset of half word #3 of a gpr register. */
967 static __inline__ UInt
968 gpr_hw3_offset(UInt archreg)
970 return gpr_offset(archreg) + 6;
973 /* Write half word #3 of a gpr to the guest state. */
974 static __inline__ void
975 put_gpr_hw3(UInt archreg, IRExpr *expr)
977 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I16);
979 stmt(IRStmt_Put(gpr_hw3_offset(archreg), expr));
982 /* Read half word #3 of a gpr register. */
983 static __inline__ IRExpr *
984 get_gpr_hw3(UInt archreg)
986 return IRExpr_Get(gpr_hw3_offset(archreg), Ity_I16);
989 /* Return the guest state offset of byte #7 of a gpr register. */
990 static __inline__ UInt
991 gpr_b7_offset(UInt archreg)
993 return gpr_offset(archreg) + 7;
996 /* Write byte #7 of a gpr to the guest state. */
997 static __inline__ void
998 put_gpr_b7(UInt archreg, IRExpr *expr)
1000 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1002 stmt(IRStmt_Put(gpr_b7_offset(archreg), expr));
1005 /* Read byte #7 of a gpr register. */
1006 static __inline__ IRExpr *
1007 get_gpr_b7(UInt archreg)
1009 return IRExpr_Get(gpr_b7_offset(archreg), Ity_I8);
1012 /* Return the guest state offset of half word #0 of a gpr register. */
1013 static __inline__ UInt
1014 gpr_hw0_offset(UInt archreg)
1016 return gpr_offset(archreg) + 0;
1019 /* Write half word #0 of a gpr to the guest state. */
1020 static __inline__ void
1021 put_gpr_hw0(UInt archreg, IRExpr *expr)
1023 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I16);
1025 stmt(IRStmt_Put(gpr_hw0_offset(archreg), expr));
1028 /* Read half word #0 of a gpr register. */
1029 static __inline__ IRExpr *
1030 get_gpr_hw0(UInt archreg)
1032 return IRExpr_Get(gpr_hw0_offset(archreg), Ity_I16);
1035 /* Return the guest state offset of byte #4 of a gpr register. */
1036 static __inline__ UInt
1037 gpr_b4_offset(UInt archreg)
1039 return gpr_offset(archreg) + 4;
1042 /* Write byte #4 of a gpr to the guest state. */
1043 static __inline__ void
1044 put_gpr_b4(UInt archreg, IRExpr *expr)
1046 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1048 stmt(IRStmt_Put(gpr_b4_offset(archreg), expr));
1051 /* Read byte #4 of a gpr register. */
1052 static __inline__ IRExpr *
1053 get_gpr_b4(UInt archreg)
1055 return IRExpr_Get(gpr_b4_offset(archreg), Ity_I8);
1058 /* Return the guest state offset of byte #1 of a gpr register. */
1059 static __inline__ UInt
1060 gpr_b1_offset(UInt archreg)
1062 return gpr_offset(archreg) + 1;
1065 /* Write byte #1 of a gpr to the guest state. */
1066 static __inline__ void
1067 put_gpr_b1(UInt archreg, IRExpr *expr)
1069 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1071 stmt(IRStmt_Put(gpr_b1_offset(archreg), expr));
1074 /* Read byte #1 of a gpr register. */
1075 static __inline__ IRExpr *
1076 get_gpr_b1(UInt archreg)
1078 return IRExpr_Get(gpr_b1_offset(archreg), Ity_I8);
1081 /* Return the guest state offset of half word #2 of a gpr register. */
1082 static __inline__ UInt
1083 gpr_hw2_offset(UInt archreg)
1085 return gpr_offset(archreg) + 4;
1088 /* Write half word #2 of a gpr to the guest state. */
1089 static __inline__ void
1090 put_gpr_hw2(UInt archreg, IRExpr *expr)
1092 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I16);
1094 stmt(IRStmt_Put(gpr_hw2_offset(archreg), expr));
1097 /* Read half word #2 of a gpr register. */
1098 static __inline__ IRExpr *
1099 get_gpr_hw2(UInt archreg)
1101 return IRExpr_Get(gpr_hw2_offset(archreg), Ity_I16);
1104 /* Return the guest state offset of byte #5 of a gpr register. */
1105 static __inline__ UInt
1106 gpr_b5_offset(UInt archreg)
1108 return gpr_offset(archreg) + 5;
1111 /* Write byte #5 of a gpr to the guest state. */
1112 static __inline__ void
1113 put_gpr_b5(UInt archreg, IRExpr *expr)
1115 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1117 stmt(IRStmt_Put(gpr_b5_offset(archreg), expr));
1120 /* Read byte #5 of a gpr register. */
1121 static __inline__ IRExpr *
1122 get_gpr_b5(UInt archreg)
1124 return IRExpr_Get(gpr_b5_offset(archreg), Ity_I8);
1127 /* Return the guest state offset of byte #2 of a gpr register. */
1128 static __inline__ UInt
1129 gpr_b2_offset(UInt archreg)
1131 return gpr_offset(archreg) + 2;
1134 /* Write byte #2 of a gpr to the guest state. */
1135 static __inline__ void
1136 put_gpr_b2(UInt archreg, IRExpr *expr)
1138 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I8);
1140 stmt(IRStmt_Put(gpr_b2_offset(archreg), expr));
1143 /* Read byte #2 of a gpr register. */
1144 static __inline__ IRExpr *
1145 get_gpr_b2(UInt archreg)
1147 return IRExpr_Get(gpr_b2_offset(archreg), Ity_I8);
1150 /* Return the guest state offset of the counter register. */
1152 counter_offset(void)
1154 return offsetof(VexGuestS390XState, guest_counter);
1157 /* Return the guest state offset of double word #0 of the counter register. */
1158 static __inline__ UInt
1159 counter_dw0_offset(void)
1161 return counter_offset() + 0;
1164 /* Write double word #0 of the counter to the guest state. */
1165 static __inline__ void
1166 put_counter_dw0(IRExpr *expr)
1168 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I64);
1170 stmt(IRStmt_Put(counter_dw0_offset(), expr));
1173 /* Read double word #0 of the counter register. */
1174 static __inline__ IRExpr *
1175 get_counter_dw0(void)
1177 return IRExpr_Get(counter_dw0_offset(), Ity_I64);
1180 /* Return the guest state offset of word #0 of the counter register. */
1181 static __inline__ UInt
1182 counter_w0_offset(void)
1184 return counter_offset() + 0;
1187 /* Return the guest state offset of word #1 of the counter register. */
1188 static __inline__ UInt
1189 counter_w1_offset(void)
1191 return counter_offset() + 4;
1194 /* Write word #0 of the counter to the guest state. */
1195 static __inline__ void
1196 put_counter_w0(IRExpr *expr)
1198 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
1200 stmt(IRStmt_Put(counter_w0_offset(), expr));
1203 /* Read word #0 of the counter register. */
1204 static __inline__ IRExpr *
1205 get_counter_w0(void)
1207 return IRExpr_Get(counter_w0_offset(), Ity_I32);
1210 /* Write word #1 of the counter to the guest state. */
1211 static __inline__ void
1212 put_counter_w1(IRExpr *expr)
1214 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
1216 stmt(IRStmt_Put(counter_w1_offset(), expr));
1219 /* Read word #1 of the counter register. */
1220 static __inline__ IRExpr *
1221 get_counter_w1(void)
1223 return IRExpr_Get(counter_w1_offset(), Ity_I32);
1226 /* Return the guest state offset of the fpc register. */
1230 return offsetof(VexGuestS390XState, guest_fpc);
1233 /* Return the guest state offset of word #0 of the fpc register. */
1234 static __inline__ UInt
1237 return fpc_offset() + 0;
1240 /* Write word #0 of the fpc to the guest state. */
1241 static __inline__ void
1242 put_fpc_w0(IRExpr *expr)
1244 vassert(typeOfIRExpr(irsb->tyenv, expr) == Ity_I32);
1246 stmt(IRStmt_Put(fpc_w0_offset(), expr));
1249 /* Read word #0 of the fpc register. */
1250 static __inline__ IRExpr *
1253 return IRExpr_Get(fpc_w0_offset(), Ity_I32);
1257 /*------------------------------------------------------------*/
1258 /*--- Build IR for formats ---*/
1259 /*------------------------------------------------------------*/
1261 s390_format_I(HChar *(*irgen)(UChar i),
1264 HChar *mnm = irgen(i);
1266 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1267 s390_disasm(ENC2(MNM, UINT), mnm, i);
1271 s390_format_RI(HChar *(*irgen)(UChar r1, UShort i2),
1272 UChar r1, UShort i2)
1278 s390_format_RI_RU(HChar *(*irgen)(UChar r1, UShort i2),
1279 UChar r1, UShort i2)
1281 HChar *mnm = irgen(r1, i2);
1283 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1284 s390_disasm(ENC3(MNM, GPR, UINT), mnm, r1, i2);
1288 s390_format_RI_RI(HChar *(*irgen)(UChar r1, UShort i2),
1289 UChar r1, UShort i2)
1291 HChar *mnm = irgen(r1, i2);
1293 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1294 s390_disasm(ENC3(MNM, GPR, INT), mnm, r1, (Int)(Short)i2);
1298 s390_format_RI_RP(HChar *(*irgen)(UChar r1, UShort i2),
1299 UChar r1, UShort i2)
1301 HChar *mnm = irgen(r1, i2);
1303 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1304 s390_disasm(ENC3(MNM, GPR, PCREL), mnm, r1, (Int)(Short)i2);
1308 s390_format_RIE_RRP(HChar *(*irgen)(UChar r1, UChar r3, UShort i2),
1309 UChar r1, UChar r3, UShort i2)
1311 HChar *mnm = irgen(r1, r3, i2);
1313 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1314 s390_disasm(ENC4(MNM, GPR, GPR, PCREL), mnm, r1, r3, (Int)(Short)i2);
1318 s390_format_RIE_RRI0(HChar *(*irgen)(UChar r1, UChar r3, UShort i2),
1319 UChar r1, UChar r3, UShort i2)
1321 HChar *mnm = irgen(r1, r3, i2);
1323 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1324 s390_disasm(ENC4(MNM, GPR, GPR, INT), mnm, r1, r3, (Int)(Short)i2);
1328 s390_format_RIE_RRUUU(HChar *(*irgen)(UChar r1, UChar r2, UChar i3, UChar i4,
1330 UChar r1, UChar r2, UChar i3, UChar i4, UChar i5)
1332 HChar *mnm = irgen(r1, r2, i3, i4, i5);
1334 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1335 s390_disasm(ENC6(MNM, GPR, GPR, UINT, UINT, UINT), mnm, r1, r2, i3, i4,
1340 s390_format_RIE_RRPU(HChar *(*irgen)(UChar r1, UChar r2, UShort i4, UChar m3),
1341 UChar r1, UChar r2, UShort i4, UChar m3)
1343 HChar *mnm = irgen(r1, r2, i4, m3);
1345 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1346 s390_disasm(ENC5(XMNM, GPR, GPR, CABM, PCREL), S390_XMNM_CAB, mnm, m3, r1,
1347 r2, m3, (Int)(Short)i4);
1351 s390_format_RIE_RUPU(HChar *(*irgen)(UChar r1, UChar m3, UShort i4, UChar i2),
1352 UChar r1, UChar m3, UShort i4, UChar i2)
1354 HChar *mnm = irgen(r1, m3, i4, i2);
1356 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1357 s390_disasm(ENC5(XMNM, GPR, UINT, CABM, PCREL), S390_XMNM_CAB, mnm, m3,
1358 r1, i2, m3, (Int)(Short)i4);
1362 s390_format_RIE_RUPI(HChar *(*irgen)(UChar r1, UChar m3, UShort i4, UChar i2),
1363 UChar r1, UChar m3, UShort i4, UChar i2)
1365 HChar *mnm = irgen(r1, m3, i4, i2);
1367 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1368 s390_disasm(ENC5(XMNM, GPR, INT, CABM, PCREL), S390_XMNM_CAB, mnm, m3, r1,
1369 (Int)(Char)i2, m3, (Int)(Short)i4);
1373 s390_format_RIL(HChar *(*irgen)(UChar r1, UInt i2),
1380 s390_format_RIL_RU(HChar *(*irgen)(UChar r1, UInt i2),
1383 HChar *mnm = irgen(r1, i2);
1385 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1386 s390_disasm(ENC3(MNM, GPR, UINT), mnm, r1, i2);
1390 s390_format_RIL_RI(HChar *(*irgen)(UChar r1, UInt i2),
1393 HChar *mnm = irgen(r1, i2);
1395 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1396 s390_disasm(ENC3(MNM, GPR, INT), mnm, r1, i2);
1400 s390_format_RIL_RP(HChar *(*irgen)(UChar r1, UInt i2),
1403 HChar *mnm = irgen(r1, i2);
1405 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1406 s390_disasm(ENC3(MNM, GPR, PCREL), mnm, r1, i2);
1410 s390_format_RIL_UP(HChar *(*irgen)(void),
1413 HChar *mnm = irgen();
1415 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1416 s390_disasm(ENC3(MNM, UINT, PCREL), mnm, r1, i2);
1420 s390_format_RIS_RURDI(HChar *(*irgen)(UChar r1, UChar m3, UChar i2,
1422 UChar r1, UChar m3, UChar b4, UShort d4, UChar i2)
1425 IRTemp op4addr = newTemp(Ity_I64);
1427 assign(op4addr, binop(Iop_Add64, mkU64(d4), b4 != 0 ? get_gpr_dw0(b4) :
1430 mnm = irgen(r1, m3, i2, op4addr);
1432 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1433 s390_disasm(ENC5(XMNM, GPR, INT, CABM, UDXB), S390_XMNM_CAB, mnm, m3, r1,
1434 (Int)(Char)i2, m3, d4, 0, b4);
1438 s390_format_RIS_RURDU(HChar *(*irgen)(UChar r1, UChar m3, UChar i2,
1440 UChar r1, UChar m3, UChar b4, UShort d4, UChar i2)
1443 IRTemp op4addr = newTemp(Ity_I64);
1445 assign(op4addr, binop(Iop_Add64, mkU64(d4), b4 != 0 ? get_gpr_dw0(b4) :
1448 mnm = irgen(r1, m3, i2, op4addr);
1450 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1451 s390_disasm(ENC5(XMNM, GPR, UINT, CABM, UDXB), S390_XMNM_CAB, mnm, m3, r1,
1456 s390_format_RR(HChar *(*irgen)(UChar r1, UChar r2),
1463 s390_format_RR_RR(HChar *(*irgen)(UChar r1, UChar r2),
1466 HChar *mnm = irgen(r1, r2);
1468 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1469 s390_disasm(ENC3(MNM, GPR, GPR), mnm, r1, r2);
1473 s390_format_RR_FF(HChar *(*irgen)(UChar r1, UChar r2),
1476 HChar *mnm = irgen(r1, r2);
1478 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1479 s390_disasm(ENC3(MNM, FPR, FPR), mnm, r1, r2);
1483 s390_format_RRE(HChar *(*irgen)(UChar r1, UChar r2),
1490 s390_format_RRE_RR(HChar *(*irgen)(UChar r1, UChar r2),
1493 HChar *mnm = irgen(r1, r2);
1495 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1496 s390_disasm(ENC3(MNM, GPR, GPR), mnm, r1, r2);
1500 s390_format_RRE_FF(HChar *(*irgen)(UChar r1, UChar r2),
1503 HChar *mnm = irgen(r1, r2);
1505 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1506 s390_disasm(ENC3(MNM, FPR, FPR), mnm, r1, r2);
1510 s390_format_RRE_RF(HChar *(*irgen)(UChar, UChar),
1513 HChar *mnm = irgen(r1, r2);
1515 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1516 s390_disasm(ENC3(MNM, GPR, FPR), mnm, r1, r2);
1520 s390_format_RRE_FR(HChar *(*irgen)(UChar r1, UChar r2),
1523 HChar *mnm = irgen(r1, r2);
1525 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1526 s390_disasm(ENC3(MNM, FPR, GPR), mnm, r1, r2);
1530 s390_format_RRE_R0(HChar *(*irgen)(UChar r1),
1533 HChar *mnm = irgen(r1);
1535 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1536 s390_disasm(ENC2(MNM, GPR), mnm, r1);
1540 s390_format_RRE_F0(HChar *(*irgen)(UChar r1),
1543 HChar *mnm = irgen(r1);
1545 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1546 s390_disasm(ENC2(MNM, FPR), mnm, r1);
1550 s390_format_RRF_F0FF(HChar *(*irgen)(UChar, UChar, UChar),
1551 UChar r1, UChar r3, UChar r2)
1553 HChar *mnm = irgen(r1, r3, r2);
1555 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1556 s390_disasm(ENC4(MNM, FPR, FPR, FPR), mnm, r1, r3, r2);
1560 s390_format_RRF_U0RR(HChar *(*irgen)(UChar m3, UChar r1, UChar r2),
1561 UChar m3, UChar r1, UChar r2, Int xmnm_kind)
1565 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1566 s390_disasm(ENC3(XMNM, GPR, GPR), xmnm_kind, m3, r1, r2);
1570 s390_format_RRF_U0RF(HChar *(*irgen)(UChar r3, UChar r1, UChar r2),
1571 UChar r3, UChar r1, UChar r2)
1573 HChar *mnm = irgen(r3, r1, r2);
1575 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1576 s390_disasm(ENC4(MNM, GPR, UINT, FPR), mnm, r1, r3, r2);
1580 s390_format_RRF_F0FF2(HChar *(*irgen)(UChar, UChar, UChar),
1581 UChar r3, UChar r1, UChar r2)
1583 HChar *mnm = irgen(r3, r1, r2);
1585 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1586 s390_disasm(ENC4(MNM, FPR, FPR, FPR), mnm, r1, r3, r2);
1590 s390_format_RRF_R0RR2(HChar *(*irgen)(UChar r3, UChar r1, UChar r2),
1591 UChar r3, UChar r1, UChar r2)
1593 HChar *mnm = irgen(r3, r1, r2);
1595 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1596 s390_disasm(ENC4(MNM, GPR, GPR, GPR), mnm, r1, r2, r3);
1600 s390_format_RRS(HChar *(*irgen)(UChar r1, UChar r2, UChar m3, IRTemp op4addr),
1601 UChar r1, UChar r2, UChar b4, UShort d4, UChar m3)
1604 IRTemp op4addr = newTemp(Ity_I64);
1606 assign(op4addr, binop(Iop_Add64, mkU64(d4), b4 != 0 ? get_gpr_dw0(b4) :
1609 mnm = irgen(r1, r2, m3, op4addr);
1611 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1612 s390_disasm(ENC5(XMNM, GPR, GPR, CABM, UDXB), S390_XMNM_CAB, mnm, m3, r1,
1617 s390_format_RS_R0RD(HChar *(*irgen)(UChar r1, IRTemp op2addr),
1618 UChar r1, UChar b2, UShort d2)
1621 IRTemp op2addr = newTemp(Ity_I64);
1623 assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
1626 mnm = irgen(r1, op2addr);
1628 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1629 s390_disasm(ENC3(MNM, GPR, UDXB), mnm, r1, d2, 0, b2);
1633 s390_format_RS_RRRD(HChar *(*irgen)(UChar r1, UChar r3, IRTemp op2addr),
1634 UChar r1, UChar r3, UChar b2, UShort d2)
1637 IRTemp op2addr = newTemp(Ity_I64);
1639 assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
1642 mnm = irgen(r1, r3, op2addr);
1644 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1645 s390_disasm(ENC4(MNM, GPR, GPR, UDXB), mnm, r1, r3, d2, 0, b2);
1649 s390_format_RS_RURD(HChar *(*irgen)(UChar r1, UChar r3, IRTemp op2addr),
1650 UChar r1, UChar r3, UChar b2, UShort d2)
1653 IRTemp op2addr = newTemp(Ity_I64);
1655 assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
1658 mnm = irgen(r1, r3, op2addr);
1660 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1661 s390_disasm(ENC4(MNM, GPR, UINT, UDXB), mnm, r1, r3, d2, 0, b2);
1665 s390_format_RS_AARD(HChar *(*irgen)(UChar, UChar, IRTemp),
1666 UChar r1, UChar r3, UChar b2, UShort d2)
1669 IRTemp op2addr = newTemp(Ity_I64);
1671 assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
1674 mnm = irgen(r1, r3, op2addr);
1676 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1677 s390_disasm(ENC4(MNM, AR, AR, UDXB), mnm, r1, r3, d2, 0, b2);
1681 s390_format_RSI_RRP(HChar *(*irgen)(UChar r1, UChar r3, UShort i2),
1682 UChar r1, UChar r3, UShort i2)
1684 HChar *mnm = irgen(r1, r3, i2);
1686 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1687 s390_disasm(ENC4(MNM, GPR, GPR, PCREL), mnm, r1, r3, (Int)(Short)i2);
1691 s390_format_RSY_RRRD(HChar *(*irgen)(UChar r1, UChar r3, IRTemp op2addr),
1692 UChar r1, UChar r3, UChar b2, UShort dl2, UChar dh2)
1695 IRTemp op2addr = newTemp(Ity_I64);
1696 IRTemp d2 = newTemp(Ity_I64);
1698 assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
1699 assign(op2addr, binop(Iop_Add64, mkexpr(d2), b2 != 0 ? get_gpr_dw0(b2) :
1702 mnm = irgen(r1, r3, op2addr);
1704 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1705 s390_disasm(ENC4(MNM, GPR, GPR, SDXB), mnm, r1, r3, dh2, dl2, 0, b2);
1709 s390_format_RSY_AARD(HChar *(*irgen)(UChar, UChar, IRTemp),
1710 UChar r1, UChar r3, UChar b2, UShort dl2, UChar dh2)
1713 IRTemp op2addr = newTemp(Ity_I64);
1714 IRTemp d2 = newTemp(Ity_I64);
1716 assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
1717 assign(op2addr, binop(Iop_Add64, mkexpr(d2), b2 != 0 ? get_gpr_dw0(b2) :
1720 mnm = irgen(r1, r3, op2addr);
1722 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1723 s390_disasm(ENC4(MNM, AR, AR, SDXB), mnm, r1, r3, dh2, dl2, 0, b2);
1727 s390_format_RSY_RURD(HChar *(*irgen)(UChar r1, UChar r3, IRTemp op2addr),
1728 UChar r1, UChar r3, UChar b2, UShort dl2, UChar dh2)
1731 IRTemp op2addr = newTemp(Ity_I64);
1732 IRTemp d2 = newTemp(Ity_I64);
1734 assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
1735 assign(op2addr, binop(Iop_Add64, mkexpr(d2), b2 != 0 ? get_gpr_dw0(b2) :
1738 mnm = irgen(r1, r3, op2addr);
1740 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1741 s390_disasm(ENC4(MNM, GPR, UINT, SDXB), mnm, r1, r3, dh2, dl2, 0, b2);
1745 s390_format_RSY_RDRM(HChar *(*irgen)(UChar r1, IRTemp op2addr),
1746 UChar r1, UChar m3, UChar b2, UShort dl2, UChar dh2,
1749 IRTemp op2addr = newTemp(Ity_I64);
1750 IRTemp d2 = newTemp(Ity_I64);
1752 if_condition_goto(binop(Iop_CmpEQ32, s390_call_calculate_cond(m3), mkU32(0)),
1753 guest_IA_next_instr);
1754 assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
1755 assign(op2addr, binop(Iop_Add64, mkexpr(d2), b2 != 0 ? get_gpr_dw0(b2) :
1760 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1761 s390_disasm(ENC3(XMNM, GPR, SDXB), xmnm_kind, m3, r1, dh2, dl2, 0, b2);
1765 s390_format_RX(HChar *(*irgen)(UChar r1, UChar x2, UChar b2, UShort d2,
1767 UChar r1, UChar x2, UChar b2, UShort d2)
1769 IRTemp op2addr = newTemp(Ity_I64);
1771 assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkU64(d2),
1772 b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
1775 irgen(r1, x2, b2, d2, op2addr);
1779 s390_format_RX_RRRD(HChar *(*irgen)(UChar r1, IRTemp op2addr),
1780 UChar r1, UChar x2, UChar b2, UShort d2)
1783 IRTemp op2addr = newTemp(Ity_I64);
1785 assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkU64(d2),
1786 b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
1789 mnm = irgen(r1, op2addr);
1791 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1792 s390_disasm(ENC3(MNM, GPR, UDXB), mnm, r1, d2, x2, b2);
1796 s390_format_RX_FRRD(HChar *(*irgen)(UChar r1, IRTemp op2addr),
1797 UChar r1, UChar x2, UChar b2, UShort d2)
1800 IRTemp op2addr = newTemp(Ity_I64);
1802 assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkU64(d2),
1803 b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
1806 mnm = irgen(r1, op2addr);
1808 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1809 s390_disasm(ENC3(MNM, FPR, UDXB), mnm, r1, d2, x2, b2);
1813 s390_format_RXE_FRRD(HChar *(*irgen)(UChar r1, IRTemp op2addr),
1814 UChar r1, UChar x2, UChar b2, UShort d2)
1817 IRTemp op2addr = newTemp(Ity_I64);
1819 assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkU64(d2),
1820 b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
1823 mnm = irgen(r1, op2addr);
1825 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1826 s390_disasm(ENC3(MNM, FPR, UDXB), mnm, r1, d2, x2, b2);
1830 s390_format_RXF_FRRDF(HChar *(*irgen)(UChar, IRTemp, UChar),
1831 UChar r3, UChar x2, UChar b2, UShort d2, UChar r1)
1834 IRTemp op2addr = newTemp(Ity_I64);
1836 assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkU64(d2),
1837 b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
1840 mnm = irgen(r3, op2addr, r1);
1842 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1843 s390_disasm(ENC4(MNM, FPR, FPR, UDXB), mnm, r1, r3, d2, x2, b2);
1847 s390_format_RXY_RRRD(HChar *(*irgen)(UChar r1, IRTemp op2addr),
1848 UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
1851 IRTemp op2addr = newTemp(Ity_I64);
1852 IRTemp d2 = newTemp(Ity_I64);
1854 assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
1855 assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkexpr(d2),
1856 b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
1859 mnm = irgen(r1, op2addr);
1861 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1862 s390_disasm(ENC3(MNM, GPR, SDXB), mnm, r1, dh2, dl2, x2, b2);
1866 s390_format_RXY_FRRD(HChar *(*irgen)(UChar r1, IRTemp op2addr),
1867 UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
1870 IRTemp op2addr = newTemp(Ity_I64);
1871 IRTemp d2 = newTemp(Ity_I64);
1873 assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
1874 assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkexpr(d2),
1875 b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
1878 mnm = irgen(r1, op2addr);
1880 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1881 s390_disasm(ENC3(MNM, FPR, SDXB), mnm, r1, dh2, dl2, x2, b2);
1885 s390_format_RXY_URRD(HChar *(*irgen)(void),
1886 UChar r1, UChar x2, UChar b2, UShort dl2, UChar dh2)
1889 IRTemp op2addr = newTemp(Ity_I64);
1890 IRTemp d2 = newTemp(Ity_I64);
1892 assign(d2, mkU64(((ULong)(Long)(Char)dh2 << 12) | ((ULong)dl2)));
1893 assign(op2addr, binop(Iop_Add64, binop(Iop_Add64, mkexpr(d2),
1894 b2 != 0 ? get_gpr_dw0(b2) : mkU64(0)), x2 != 0 ? get_gpr_dw0(x2) :
1899 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1900 s390_disasm(ENC3(MNM, UINT, SDXB), mnm, r1, dh2, dl2, x2, b2);
1904 s390_format_S_RD(HChar *(*irgen)(IRTemp op2addr),
1905 UChar b2, UShort d2)
1908 IRTemp op2addr = newTemp(Ity_I64);
1910 assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
1913 mnm = irgen(op2addr);
1915 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1916 s390_disasm(ENC2(MNM, UDXB), mnm, d2, 0, b2);
1920 s390_format_SI_URD(HChar *(*irgen)(UChar i2, IRTemp op1addr),
1921 UChar i2, UChar b1, UShort d1)
1924 IRTemp op1addr = newTemp(Ity_I64);
1926 assign(op1addr, binop(Iop_Add64, mkU64(d1), b1 != 0 ? get_gpr_dw0(b1) :
1929 mnm = irgen(i2, op1addr);
1931 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1932 s390_disasm(ENC3(MNM, UDXB, UINT), mnm, d1, 0, b1, i2);
1936 s390_format_SIY_URD(HChar *(*irgen)(UChar i2, IRTemp op1addr),
1937 UChar i2, UChar b1, UShort dl1, UChar dh1)
1940 IRTemp op1addr = newTemp(Ity_I64);
1941 IRTemp d1 = newTemp(Ity_I64);
1943 assign(d1, mkU64(((ULong)(Long)(Char)dh1 << 12) | ((ULong)dl1)));
1944 assign(op1addr, binop(Iop_Add64, mkexpr(d1), b1 != 0 ? get_gpr_dw0(b1) :
1947 mnm = irgen(i2, op1addr);
1949 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1950 s390_disasm(ENC3(MNM, SDXB, UINT), mnm, dh1, dl1, 0, b1, i2);
1954 s390_format_SIY_IRD(HChar *(*irgen)(UChar i2, IRTemp op1addr),
1955 UChar i2, UChar b1, UShort dl1, UChar dh1)
1958 IRTemp op1addr = newTemp(Ity_I64);
1959 IRTemp d1 = newTemp(Ity_I64);
1961 assign(d1, mkU64(((ULong)(Long)(Char)dh1 << 12) | ((ULong)dl1)));
1962 assign(op1addr, binop(Iop_Add64, mkexpr(d1), b1 != 0 ? get_gpr_dw0(b1) :
1965 mnm = irgen(i2, op1addr);
1967 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1968 s390_disasm(ENC3(MNM, SDXB, INT), mnm, dh1, dl1, 0, b1, (Int)(Char)i2);
1972 s390_format_SS_L0RDRD(HChar *(*irgen)(UChar, IRTemp, IRTemp),
1973 UChar l, UChar b1, UShort d1, UChar b2, UShort d2)
1976 IRTemp op1addr = newTemp(Ity_I64);
1977 IRTemp op2addr = newTemp(Ity_I64);
1979 assign(op1addr, binop(Iop_Add64, mkU64(d1), b1 != 0 ? get_gpr_dw0(b1) :
1981 assign(op2addr, binop(Iop_Add64, mkU64(d2), b2 != 0 ? get_gpr_dw0(b2) :
1984 mnm = irgen(l, op1addr, op2addr);
1986 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
1987 s390_disasm(ENC3(MNM, UDLB, UDXB), mnm, d1, l, b1, d2, 0, b2);
1991 s390_format_SIL_RDI(HChar *(*irgen)(UShort i2, IRTemp op1addr),
1992 UChar b1, UShort d1, UShort i2)
1995 IRTemp op1addr = newTemp(Ity_I64);
1997 assign(op1addr, binop(Iop_Add64, mkU64(d1), b1 != 0 ? get_gpr_dw0(b1) :
2000 mnm = irgen(i2, op1addr);
2002 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2003 s390_disasm(ENC3(MNM, UDXB, INT), mnm, d1, 0, b1, (Int)(Short)i2);
2007 s390_format_SIL_RDU(HChar *(*irgen)(UShort i2, IRTemp op1addr),
2008 UChar b1, UShort d1, UShort i2)
2011 IRTemp op1addr = newTemp(Ity_I64);
2013 assign(op1addr, binop(Iop_Add64, mkU64(d1), b1 != 0 ? get_gpr_dw0(b1) :
2016 mnm = irgen(i2, op1addr);
2018 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
2019 s390_disasm(ENC3(MNM, UDXB, UINT), mnm, d1, 0, b1, i2);
2024 /*------------------------------------------------------------*/
2025 /*--- Build IR for opcodes ---*/
2026 /*------------------------------------------------------------*/
2029 s390_irgen_AR(UChar r1, UChar r2)
2031 IRTemp op1 = newTemp(Ity_I32);
2032 IRTemp op2 = newTemp(Ity_I32);
2033 IRTemp result = newTemp(Ity_I32);
2035 assign(op1, get_gpr_w1(r1));
2036 assign(op2, get_gpr_w1(r2));
2037 assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2038 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, op2);
2039 put_gpr_w1(r1, mkexpr(result));
2045 s390_irgen_AGR(UChar r1, UChar r2)
2047 IRTemp op1 = newTemp(Ity_I64);
2048 IRTemp op2 = newTemp(Ity_I64);
2049 IRTemp result = newTemp(Ity_I64);
2051 assign(op1, get_gpr_dw0(r1));
2052 assign(op2, get_gpr_dw0(r2));
2053 assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2054 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, op2);
2055 put_gpr_dw0(r1, mkexpr(result));
2061 s390_irgen_AGFR(UChar r1, UChar r2)
2063 IRTemp op1 = newTemp(Ity_I64);
2064 IRTemp op2 = newTemp(Ity_I64);
2065 IRTemp result = newTemp(Ity_I64);
2067 assign(op1, get_gpr_dw0(r1));
2068 assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
2069 assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2070 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, op2);
2071 put_gpr_dw0(r1, mkexpr(result));
2077 s390_irgen_ARK(UChar r3, UChar r1, UChar r2)
2079 IRTemp op2 = newTemp(Ity_I32);
2080 IRTemp op3 = newTemp(Ity_I32);
2081 IRTemp result = newTemp(Ity_I32);
2083 assign(op2, get_gpr_w1(r2));
2084 assign(op3, get_gpr_w1(r3));
2085 assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
2086 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op2, op3);
2087 put_gpr_w1(r1, mkexpr(result));
2093 s390_irgen_AGRK(UChar r3, UChar r1, UChar r2)
2095 IRTemp op2 = newTemp(Ity_I64);
2096 IRTemp op3 = newTemp(Ity_I64);
2097 IRTemp result = newTemp(Ity_I64);
2099 assign(op2, get_gpr_dw0(r2));
2100 assign(op3, get_gpr_dw0(r3));
2101 assign(result, binop(Iop_Add64, mkexpr(op2), mkexpr(op3)));
2102 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op2, op3);
2103 put_gpr_dw0(r1, mkexpr(result));
2109 s390_irgen_A(UChar r1, IRTemp op2addr)
2111 IRTemp op1 = newTemp(Ity_I32);
2112 IRTemp op2 = newTemp(Ity_I32);
2113 IRTemp result = newTemp(Ity_I32);
2115 assign(op1, get_gpr_w1(r1));
2116 assign(op2, load(Ity_I32, mkexpr(op2addr)));
2117 assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2118 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, op2);
2119 put_gpr_w1(r1, mkexpr(result));
2125 s390_irgen_AY(UChar r1, IRTemp op2addr)
2127 IRTemp op1 = newTemp(Ity_I32);
2128 IRTemp op2 = newTemp(Ity_I32);
2129 IRTemp result = newTemp(Ity_I32);
2131 assign(op1, get_gpr_w1(r1));
2132 assign(op2, load(Ity_I32, mkexpr(op2addr)));
2133 assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2134 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, op2);
2135 put_gpr_w1(r1, mkexpr(result));
2141 s390_irgen_AG(UChar r1, IRTemp op2addr)
2143 IRTemp op1 = newTemp(Ity_I64);
2144 IRTemp op2 = newTemp(Ity_I64);
2145 IRTemp result = newTemp(Ity_I64);
2147 assign(op1, get_gpr_dw0(r1));
2148 assign(op2, load(Ity_I64, mkexpr(op2addr)));
2149 assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2150 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, op2);
2151 put_gpr_dw0(r1, mkexpr(result));
2157 s390_irgen_AGF(UChar r1, IRTemp op2addr)
2159 IRTemp op1 = newTemp(Ity_I64);
2160 IRTemp op2 = newTemp(Ity_I64);
2161 IRTemp result = newTemp(Ity_I64);
2163 assign(op1, get_gpr_dw0(r1));
2164 assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
2165 assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2166 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, op2);
2167 put_gpr_dw0(r1, mkexpr(result));
2173 s390_irgen_AFI(UChar r1, UInt i2)
2175 IRTemp op1 = newTemp(Ity_I32);
2177 IRTemp result = newTemp(Ity_I32);
2179 assign(op1, get_gpr_w1(r1));
2181 assign(result, binop(Iop_Add32, mkexpr(op1), mkU32((UInt)op2)));
2182 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, mktemp(Ity_I32,
2184 put_gpr_w1(r1, mkexpr(result));
2190 s390_irgen_AGFI(UChar r1, UInt i2)
2192 IRTemp op1 = newTemp(Ity_I64);
2194 IRTemp result = newTemp(Ity_I64);
2196 assign(op1, get_gpr_dw0(r1));
2197 op2 = (Long)(Int)i2;
2198 assign(result, binop(Iop_Add64, mkexpr(op1), mkU64((ULong)op2)));
2199 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, mktemp(Ity_I64,
2200 mkU64((ULong)op2)));
2201 put_gpr_dw0(r1, mkexpr(result));
2207 s390_irgen_AHIK(UChar r1, UChar r3, UShort i2)
2210 IRTemp op3 = newTemp(Ity_I32);
2211 IRTemp result = newTemp(Ity_I32);
2213 op2 = (Int)(Short)i2;
2214 assign(op3, get_gpr_w1(r3));
2215 assign(result, binop(Iop_Add32, mkU32((UInt)op2), mkexpr(op3)));
2216 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, mktemp(Ity_I32, mkU32((UInt)
2218 put_gpr_w1(r1, mkexpr(result));
2224 s390_irgen_AGHIK(UChar r1, UChar r3, UShort i2)
2227 IRTemp op3 = newTemp(Ity_I64);
2228 IRTemp result = newTemp(Ity_I64);
2230 op2 = (Long)(Short)i2;
2231 assign(op3, get_gpr_dw0(r3));
2232 assign(result, binop(Iop_Add64, mkU64((ULong)op2), mkexpr(op3)));
2233 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, mktemp(Ity_I64, mkU64((ULong)
2235 put_gpr_dw0(r1, mkexpr(result));
2241 s390_irgen_ASI(UChar i2, IRTemp op1addr)
2243 IRTemp op1 = newTemp(Ity_I32);
2245 IRTemp result = newTemp(Ity_I32);
2247 assign(op1, load(Ity_I32, mkexpr(op1addr)));
2248 op2 = (Int)(Char)i2;
2249 assign(result, binop(Iop_Add32, mkexpr(op1), mkU32((UInt)op2)));
2250 store(mkexpr(op1addr), mkexpr(result));
2251 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, mktemp(Ity_I32,
2258 s390_irgen_AGSI(UChar i2, IRTemp op1addr)
2260 IRTemp op1 = newTemp(Ity_I64);
2262 IRTemp result = newTemp(Ity_I64);
2264 assign(op1, load(Ity_I64, mkexpr(op1addr)));
2265 op2 = (Long)(Char)i2;
2266 assign(result, binop(Iop_Add64, mkexpr(op1), mkU64((ULong)op2)));
2267 store(mkexpr(op1addr), mkexpr(result));
2268 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, mktemp(Ity_I64,
2269 mkU64((ULong)op2)));
2275 s390_irgen_AH(UChar r1, IRTemp op2addr)
2277 IRTemp op1 = newTemp(Ity_I32);
2278 IRTemp op2 = newTemp(Ity_I32);
2279 IRTemp result = newTemp(Ity_I32);
2281 assign(op1, get_gpr_w1(r1));
2282 assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
2283 assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2284 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, op2);
2285 put_gpr_w1(r1, mkexpr(result));
2291 s390_irgen_AHY(UChar r1, IRTemp op2addr)
2293 IRTemp op1 = newTemp(Ity_I32);
2294 IRTemp op2 = newTemp(Ity_I32);
2295 IRTemp result = newTemp(Ity_I32);
2297 assign(op1, get_gpr_w1(r1));
2298 assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
2299 assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2300 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, op2);
2301 put_gpr_w1(r1, mkexpr(result));
2307 s390_irgen_AHI(UChar r1, UShort i2)
2309 IRTemp op1 = newTemp(Ity_I32);
2311 IRTemp result = newTemp(Ity_I32);
2313 assign(op1, get_gpr_w1(r1));
2314 op2 = (Int)(Short)i2;
2315 assign(result, binop(Iop_Add32, mkexpr(op1), mkU32((UInt)op2)));
2316 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, mktemp(Ity_I32,
2318 put_gpr_w1(r1, mkexpr(result));
2324 s390_irgen_AGHI(UChar r1, UShort i2)
2326 IRTemp op1 = newTemp(Ity_I64);
2328 IRTemp result = newTemp(Ity_I64);
2330 assign(op1, get_gpr_dw0(r1));
2331 op2 = (Long)(Short)i2;
2332 assign(result, binop(Iop_Add64, mkexpr(op1), mkU64((ULong)op2)));
2333 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op1, mktemp(Ity_I64,
2334 mkU64((ULong)op2)));
2335 put_gpr_dw0(r1, mkexpr(result));
2341 s390_irgen_AHHHR(UChar r3, UChar r1, UChar r2)
2343 IRTemp op2 = newTemp(Ity_I32);
2344 IRTemp op3 = newTemp(Ity_I32);
2345 IRTemp result = newTemp(Ity_I32);
2347 assign(op2, get_gpr_w0(r2));
2348 assign(op3, get_gpr_w0(r3));
2349 assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
2350 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op2, op3);
2351 put_gpr_w0(r1, mkexpr(result));
2357 s390_irgen_AHHLR(UChar r3, UChar r1, UChar r2)
2359 IRTemp op2 = newTemp(Ity_I32);
2360 IRTemp op3 = newTemp(Ity_I32);
2361 IRTemp result = newTemp(Ity_I32);
2363 assign(op2, get_gpr_w0(r2));
2364 assign(op3, get_gpr_w1(r3));
2365 assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
2366 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op2, op3);
2367 put_gpr_w0(r1, mkexpr(result));
2373 s390_irgen_AIH(UChar r1, UInt i2)
2375 IRTemp op1 = newTemp(Ity_I32);
2377 IRTemp result = newTemp(Ity_I32);
2379 assign(op1, get_gpr_w0(r1));
2381 assign(result, binop(Iop_Add32, mkexpr(op1), mkU32((UInt)op2)));
2382 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op1, mktemp(Ity_I32,
2384 put_gpr_w0(r1, mkexpr(result));
2390 s390_irgen_ALR(UChar r1, UChar r2)
2392 IRTemp op1 = newTemp(Ity_I32);
2393 IRTemp op2 = newTemp(Ity_I32);
2394 IRTemp result = newTemp(Ity_I32);
2396 assign(op1, get_gpr_w1(r1));
2397 assign(op2, get_gpr_w1(r2));
2398 assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2399 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, op2);
2400 put_gpr_w1(r1, mkexpr(result));
2406 s390_irgen_ALGR(UChar r1, UChar r2)
2408 IRTemp op1 = newTemp(Ity_I64);
2409 IRTemp op2 = newTemp(Ity_I64);
2410 IRTemp result = newTemp(Ity_I64);
2412 assign(op1, get_gpr_dw0(r1));
2413 assign(op2, get_gpr_dw0(r2));
2414 assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2415 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, op2);
2416 put_gpr_dw0(r1, mkexpr(result));
2422 s390_irgen_ALGFR(UChar r1, UChar r2)
2424 IRTemp op1 = newTemp(Ity_I64);
2425 IRTemp op2 = newTemp(Ity_I64);
2426 IRTemp result = newTemp(Ity_I64);
2428 assign(op1, get_gpr_dw0(r1));
2429 assign(op2, unop(Iop_32Uto64, get_gpr_w1(r2)));
2430 assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2431 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, op2);
2432 put_gpr_dw0(r1, mkexpr(result));
2438 s390_irgen_ALRK(UChar r3, UChar r1, UChar r2)
2440 IRTemp op2 = newTemp(Ity_I32);
2441 IRTemp op3 = newTemp(Ity_I32);
2442 IRTemp result = newTemp(Ity_I32);
2444 assign(op2, get_gpr_w1(r2));
2445 assign(op3, get_gpr_w1(r3));
2446 assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
2447 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op2, op3);
2448 put_gpr_w1(r1, mkexpr(result));
2454 s390_irgen_ALGRK(UChar r3, UChar r1, UChar r2)
2456 IRTemp op2 = newTemp(Ity_I64);
2457 IRTemp op3 = newTemp(Ity_I64);
2458 IRTemp result = newTemp(Ity_I64);
2460 assign(op2, get_gpr_dw0(r2));
2461 assign(op3, get_gpr_dw0(r3));
2462 assign(result, binop(Iop_Add64, mkexpr(op2), mkexpr(op3)));
2463 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op2, op3);
2464 put_gpr_dw0(r1, mkexpr(result));
2470 s390_irgen_AL(UChar r1, IRTemp op2addr)
2472 IRTemp op1 = newTemp(Ity_I32);
2473 IRTemp op2 = newTemp(Ity_I32);
2474 IRTemp result = newTemp(Ity_I32);
2476 assign(op1, get_gpr_w1(r1));
2477 assign(op2, load(Ity_I32, mkexpr(op2addr)));
2478 assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2479 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, op2);
2480 put_gpr_w1(r1, mkexpr(result));
2486 s390_irgen_ALY(UChar r1, IRTemp op2addr)
2488 IRTemp op1 = newTemp(Ity_I32);
2489 IRTemp op2 = newTemp(Ity_I32);
2490 IRTemp result = newTemp(Ity_I32);
2492 assign(op1, get_gpr_w1(r1));
2493 assign(op2, load(Ity_I32, mkexpr(op2addr)));
2494 assign(result, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)));
2495 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, op2);
2496 put_gpr_w1(r1, mkexpr(result));
2502 s390_irgen_ALG(UChar r1, IRTemp op2addr)
2504 IRTemp op1 = newTemp(Ity_I64);
2505 IRTemp op2 = newTemp(Ity_I64);
2506 IRTemp result = newTemp(Ity_I64);
2508 assign(op1, get_gpr_dw0(r1));
2509 assign(op2, load(Ity_I64, mkexpr(op2addr)));
2510 assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2511 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, op2);
2512 put_gpr_dw0(r1, mkexpr(result));
2518 s390_irgen_ALGF(UChar r1, IRTemp op2addr)
2520 IRTemp op1 = newTemp(Ity_I64);
2521 IRTemp op2 = newTemp(Ity_I64);
2522 IRTemp result = newTemp(Ity_I64);
2524 assign(op1, get_gpr_dw0(r1));
2525 assign(op2, unop(Iop_32Uto64, load(Ity_I32, mkexpr(op2addr))));
2526 assign(result, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)));
2527 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, op2);
2528 put_gpr_dw0(r1, mkexpr(result));
2534 s390_irgen_ALFI(UChar r1, UInt i2)
2536 IRTemp op1 = newTemp(Ity_I32);
2538 IRTemp result = newTemp(Ity_I32);
2540 assign(op1, get_gpr_w1(r1));
2542 assign(result, binop(Iop_Add32, mkexpr(op1), mkU32(op2)));
2543 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, mktemp(Ity_I32,
2545 put_gpr_w1(r1, mkexpr(result));
2551 s390_irgen_ALGFI(UChar r1, UInt i2)
2553 IRTemp op1 = newTemp(Ity_I64);
2555 IRTemp result = newTemp(Ity_I64);
2557 assign(op1, get_gpr_dw0(r1));
2559 assign(result, binop(Iop_Add64, mkexpr(op1), mkU64(op2)));
2560 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, mktemp(Ity_I64,
2562 put_gpr_dw0(r1, mkexpr(result));
2568 s390_irgen_ALHHHR(UChar r3, UChar r1, UChar r2)
2570 IRTemp op2 = newTemp(Ity_I32);
2571 IRTemp op3 = newTemp(Ity_I32);
2572 IRTemp result = newTemp(Ity_I32);
2574 assign(op2, get_gpr_w0(r2));
2575 assign(op3, get_gpr_w0(r3));
2576 assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
2577 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op2, op3);
2578 put_gpr_w0(r1, mkexpr(result));
2584 s390_irgen_ALHHLR(UChar r3, UChar r1, UChar r2)
2586 IRTemp op2 = newTemp(Ity_I32);
2587 IRTemp op3 = newTemp(Ity_I32);
2588 IRTemp result = newTemp(Ity_I32);
2590 assign(op2, get_gpr_w0(r2));
2591 assign(op3, get_gpr_w1(r3));
2592 assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
2593 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op2, op3);
2594 put_gpr_w0(r1, mkexpr(result));
2600 s390_irgen_ALCR(UChar r1, UChar r2)
2602 IRTemp op1 = newTemp(Ity_I32);
2603 IRTemp op2 = newTemp(Ity_I32);
2604 IRTemp result = newTemp(Ity_I32);
2605 IRTemp carry_in = newTemp(Ity_I32);
2607 assign(op1, get_gpr_w1(r1));
2608 assign(op2, get_gpr_w1(r2));
2609 assign(carry_in, binop(Iop_Shr32, s390_call_calculate_cc(), mkU8(1)));
2610 assign(result, binop(Iop_Add32, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)),
2612 s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_ADDC_32, op1, op2, carry_in);
2613 put_gpr_w1(r1, mkexpr(result));
2619 s390_irgen_ALCGR(UChar r1, UChar r2)
2621 IRTemp op1 = newTemp(Ity_I64);
2622 IRTemp op2 = newTemp(Ity_I64);
2623 IRTemp result = newTemp(Ity_I64);
2624 IRTemp carry_in = newTemp(Ity_I64);
2626 assign(op1, get_gpr_dw0(r1));
2627 assign(op2, get_gpr_dw0(r2));
2628 assign(carry_in, unop(Iop_32Uto64, binop(Iop_Shr32, s390_call_calculate_cc(),
2630 assign(result, binop(Iop_Add64, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)),
2632 s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_ADDC_64, op1, op2, carry_in);
2633 put_gpr_dw0(r1, mkexpr(result));
2639 s390_irgen_ALC(UChar r1, IRTemp op2addr)
2641 IRTemp op1 = newTemp(Ity_I32);
2642 IRTemp op2 = newTemp(Ity_I32);
2643 IRTemp result = newTemp(Ity_I32);
2644 IRTemp carry_in = newTemp(Ity_I32);
2646 assign(op1, get_gpr_w1(r1));
2647 assign(op2, load(Ity_I32, mkexpr(op2addr)));
2648 assign(carry_in, binop(Iop_Shr32, s390_call_calculate_cc(), mkU8(1)));
2649 assign(result, binop(Iop_Add32, binop(Iop_Add32, mkexpr(op1), mkexpr(op2)),
2651 s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_ADDC_32, op1, op2, carry_in);
2652 put_gpr_w1(r1, mkexpr(result));
2658 s390_irgen_ALCG(UChar r1, IRTemp op2addr)
2660 IRTemp op1 = newTemp(Ity_I64);
2661 IRTemp op2 = newTemp(Ity_I64);
2662 IRTemp result = newTemp(Ity_I64);
2663 IRTemp carry_in = newTemp(Ity_I64);
2665 assign(op1, get_gpr_dw0(r1));
2666 assign(op2, load(Ity_I64, mkexpr(op2addr)));
2667 assign(carry_in, unop(Iop_32Uto64, binop(Iop_Shr32, s390_call_calculate_cc(),
2669 assign(result, binop(Iop_Add64, binop(Iop_Add64, mkexpr(op1), mkexpr(op2)),
2671 s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_ADDC_64, op1, op2, carry_in);
2672 put_gpr_dw0(r1, mkexpr(result));
2678 s390_irgen_ALSI(UChar i2, IRTemp op1addr)
2680 IRTemp op1 = newTemp(Ity_I32);
2682 IRTemp result = newTemp(Ity_I32);
2684 assign(op1, load(Ity_I32, mkexpr(op1addr)));
2685 op2 = (UInt)(Int)(Char)i2;
2686 assign(result, binop(Iop_Add32, mkexpr(op1), mkU32(op2)));
2687 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, mktemp(Ity_I32,
2689 store(mkexpr(op1addr), mkexpr(result));
2695 s390_irgen_ALGSI(UChar i2, IRTemp op1addr)
2697 IRTemp op1 = newTemp(Ity_I64);
2699 IRTemp result = newTemp(Ity_I64);
2701 assign(op1, load(Ity_I64, mkexpr(op1addr)));
2702 op2 = (ULong)(Long)(Char)i2;
2703 assign(result, binop(Iop_Add64, mkexpr(op1), mkU64(op2)));
2704 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op1, mktemp(Ity_I64,
2706 store(mkexpr(op1addr), mkexpr(result));
2712 s390_irgen_ALHSIK(UChar r1, UChar r3, UShort i2)
2715 IRTemp op3 = newTemp(Ity_I32);
2716 IRTemp result = newTemp(Ity_I32);
2718 op2 = (UInt)(Int)(Short)i2;
2719 assign(op3, get_gpr_w1(r3));
2720 assign(result, binop(Iop_Add32, mkU32(op2), mkexpr(op3)));
2721 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, mktemp(Ity_I32, mkU32(op2)),
2723 put_gpr_w1(r1, mkexpr(result));
2729 s390_irgen_ALGHSIK(UChar r1, UChar r3, UShort i2)
2732 IRTemp op3 = newTemp(Ity_I64);
2733 IRTemp result = newTemp(Ity_I64);
2735 op2 = (ULong)(Long)(Short)i2;
2736 assign(op3, get_gpr_dw0(r3));
2737 assign(result, binop(Iop_Add64, mkU64(op2), mkexpr(op3)));
2738 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, mktemp(Ity_I64, mkU64(op2)),
2740 put_gpr_dw0(r1, mkexpr(result));
2746 s390_irgen_ALSIH(UChar r1, UInt i2)
2748 IRTemp op1 = newTemp(Ity_I32);
2750 IRTemp result = newTemp(Ity_I32);
2752 assign(op1, get_gpr_w0(r1));
2754 assign(result, binop(Iop_Add32, mkexpr(op1), mkU32(op2)));
2755 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op1, mktemp(Ity_I32,
2757 put_gpr_w0(r1, mkexpr(result));
2763 s390_irgen_ALSIHN(UChar r1, UInt i2)
2765 IRTemp op1 = newTemp(Ity_I32);
2767 IRTemp result = newTemp(Ity_I32);
2769 assign(op1, get_gpr_w0(r1));
2771 assign(result, binop(Iop_Add32, mkexpr(op1), mkU32(op2)));
2772 put_gpr_w0(r1, mkexpr(result));
2778 s390_irgen_NR(UChar r1, UChar r2)
2780 IRTemp op1 = newTemp(Ity_I32);
2781 IRTemp op2 = newTemp(Ity_I32);
2782 IRTemp result = newTemp(Ity_I32);
2784 assign(op1, get_gpr_w1(r1));
2785 assign(op2, get_gpr_w1(r2));
2786 assign(result, binop(Iop_And32, mkexpr(op1), mkexpr(op2)));
2787 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2788 put_gpr_w1(r1, mkexpr(result));
2794 s390_irgen_NGR(UChar r1, UChar r2)
2796 IRTemp op1 = newTemp(Ity_I64);
2797 IRTemp op2 = newTemp(Ity_I64);
2798 IRTemp result = newTemp(Ity_I64);
2800 assign(op1, get_gpr_dw0(r1));
2801 assign(op2, get_gpr_dw0(r2));
2802 assign(result, binop(Iop_And64, mkexpr(op1), mkexpr(op2)));
2803 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2804 put_gpr_dw0(r1, mkexpr(result));
2810 s390_irgen_NRK(UChar r3, UChar r1, UChar r2)
2812 IRTemp op2 = newTemp(Ity_I32);
2813 IRTemp op3 = newTemp(Ity_I32);
2814 IRTemp result = newTemp(Ity_I32);
2816 assign(op2, get_gpr_w1(r2));
2817 assign(op3, get_gpr_w1(r3));
2818 assign(result, binop(Iop_And32, mkexpr(op2), mkexpr(op3)));
2819 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2820 put_gpr_w1(r1, mkexpr(result));
2826 s390_irgen_NGRK(UChar r3, UChar r1, UChar r2)
2828 IRTemp op2 = newTemp(Ity_I64);
2829 IRTemp op3 = newTemp(Ity_I64);
2830 IRTemp result = newTemp(Ity_I64);
2832 assign(op2, get_gpr_dw0(r2));
2833 assign(op3, get_gpr_dw0(r3));
2834 assign(result, binop(Iop_And64, mkexpr(op2), mkexpr(op3)));
2835 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2836 put_gpr_dw0(r1, mkexpr(result));
2842 s390_irgen_N(UChar r1, IRTemp op2addr)
2844 IRTemp op1 = newTemp(Ity_I32);
2845 IRTemp op2 = newTemp(Ity_I32);
2846 IRTemp result = newTemp(Ity_I32);
2848 assign(op1, get_gpr_w1(r1));
2849 assign(op2, load(Ity_I32, mkexpr(op2addr)));
2850 assign(result, binop(Iop_And32, mkexpr(op1), mkexpr(op2)));
2851 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2852 put_gpr_w1(r1, mkexpr(result));
2858 s390_irgen_NY(UChar r1, IRTemp op2addr)
2860 IRTemp op1 = newTemp(Ity_I32);
2861 IRTemp op2 = newTemp(Ity_I32);
2862 IRTemp result = newTemp(Ity_I32);
2864 assign(op1, get_gpr_w1(r1));
2865 assign(op2, load(Ity_I32, mkexpr(op2addr)));
2866 assign(result, binop(Iop_And32, mkexpr(op1), mkexpr(op2)));
2867 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2868 put_gpr_w1(r1, mkexpr(result));
2874 s390_irgen_NG(UChar r1, IRTemp op2addr)
2876 IRTemp op1 = newTemp(Ity_I64);
2877 IRTemp op2 = newTemp(Ity_I64);
2878 IRTemp result = newTemp(Ity_I64);
2880 assign(op1, get_gpr_dw0(r1));
2881 assign(op2, load(Ity_I64, mkexpr(op2addr)));
2882 assign(result, binop(Iop_And64, mkexpr(op1), mkexpr(op2)));
2883 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2884 put_gpr_dw0(r1, mkexpr(result));
2890 s390_irgen_NI(UChar i2, IRTemp op1addr)
2892 IRTemp op1 = newTemp(Ity_I8);
2894 IRTemp result = newTemp(Ity_I8);
2896 assign(op1, load(Ity_I8, mkexpr(op1addr)));
2898 assign(result, binop(Iop_And8, mkexpr(op1), mkU8(op2)));
2899 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2900 store(mkexpr(op1addr), mkexpr(result));
2906 s390_irgen_NIY(UChar i2, IRTemp op1addr)
2908 IRTemp op1 = newTemp(Ity_I8);
2910 IRTemp result = newTemp(Ity_I8);
2912 assign(op1, load(Ity_I8, mkexpr(op1addr)));
2914 assign(result, binop(Iop_And8, mkexpr(op1), mkU8(op2)));
2915 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2916 store(mkexpr(op1addr), mkexpr(result));
2922 s390_irgen_NIHF(UChar r1, UInt i2)
2924 IRTemp op1 = newTemp(Ity_I32);
2926 IRTemp result = newTemp(Ity_I32);
2928 assign(op1, get_gpr_w0(r1));
2930 assign(result, binop(Iop_And32, mkexpr(op1), mkU32(op2)));
2931 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2932 put_gpr_w0(r1, mkexpr(result));
2938 s390_irgen_NIHH(UChar r1, UShort i2)
2940 IRTemp op1 = newTemp(Ity_I16);
2942 IRTemp result = newTemp(Ity_I16);
2944 assign(op1, get_gpr_hw0(r1));
2946 assign(result, binop(Iop_And16, mkexpr(op1), mkU16(op2)));
2947 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2948 put_gpr_hw0(r1, mkexpr(result));
2954 s390_irgen_NIHL(UChar r1, UShort i2)
2956 IRTemp op1 = newTemp(Ity_I16);
2958 IRTemp result = newTemp(Ity_I16);
2960 assign(op1, get_gpr_hw1(r1));
2962 assign(result, binop(Iop_And16, mkexpr(op1), mkU16(op2)));
2963 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2964 put_gpr_hw1(r1, mkexpr(result));
2970 s390_irgen_NILF(UChar r1, UInt i2)
2972 IRTemp op1 = newTemp(Ity_I32);
2974 IRTemp result = newTemp(Ity_I32);
2976 assign(op1, get_gpr_w1(r1));
2978 assign(result, binop(Iop_And32, mkexpr(op1), mkU32(op2)));
2979 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2980 put_gpr_w1(r1, mkexpr(result));
2986 s390_irgen_NILH(UChar r1, UShort i2)
2988 IRTemp op1 = newTemp(Ity_I16);
2990 IRTemp result = newTemp(Ity_I16);
2992 assign(op1, get_gpr_hw2(r1));
2994 assign(result, binop(Iop_And16, mkexpr(op1), mkU16(op2)));
2995 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
2996 put_gpr_hw2(r1, mkexpr(result));
3002 s390_irgen_NILL(UChar r1, UShort i2)
3004 IRTemp op1 = newTemp(Ity_I16);
3006 IRTemp result = newTemp(Ity_I16);
3008 assign(op1, get_gpr_hw3(r1));
3010 assign(result, binop(Iop_And16, mkexpr(op1), mkU16(op2)));
3011 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
3012 put_gpr_hw3(r1, mkexpr(result));
3018 s390_irgen_BASR(UChar r1, UChar r2)
3020 IRTemp target = newTemp(Ity_I64);
3023 put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 2ULL));
3026 put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 2ULL));
3027 call_function(get_gpr_dw0(r2));
3029 assign(target, get_gpr_dw0(r2));
3030 put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 2ULL));
3031 call_function(mkexpr(target));
3039 s390_irgen_BAS(UChar r1, IRTemp op2addr)
3041 IRTemp target = newTemp(Ity_I64);
3043 put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 4ULL));
3044 assign(target, mkexpr(op2addr));
3045 call_function(mkexpr(target));
3051 s390_irgen_BCR(UChar r1, UChar r2)
3053 IRTemp cond = newTemp(Ity_I32);
3055 if (r2 == 0 && (r1 >= 14)) { /* serialization */
3056 stmt(IRStmt_MBE(Imbe_Fence));
3059 if ((r2 == 0) || (r1 == 0)) {
3062 return_from_function(get_gpr_dw0(r2));
3064 assign(cond, s390_call_calculate_cond(r1));
3065 if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
3066 mkU32(0)), get_gpr_dw0(r2));
3069 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
3070 s390_disasm(ENC2(XMNM, GPR), S390_XMNM_BCR, r1, r2);
3076 s390_irgen_BC(UChar r1, UChar x2, UChar b2, UShort d2, IRTemp op2addr)
3078 IRTemp cond = newTemp(Ity_I32);
3083 always_goto(mkexpr(op2addr));
3085 assign(cond, s390_call_calculate_cond(r1));
3086 if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
3087 mkU32(0)), mkexpr(op2addr));
3090 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
3091 s390_disasm(ENC2(XMNM, UDXB), S390_XMNM_BC, r1, d2, x2, b2);
3097 s390_irgen_BCTR(UChar r1, UChar r2)
3099 put_gpr_w1(r1, binop(Iop_Sub32, get_gpr_w1(r1), mkU32(1)));
3101 if_not_condition_goto_computed(binop(Iop_CmpEQ32, get_gpr_w1(r1), mkU32(0)
3102 ), get_gpr_dw0(r2));
3109 s390_irgen_BCTGR(UChar r1, UChar r2)
3111 put_gpr_dw0(r1, binop(Iop_Sub64, get_gpr_dw0(r1), mkU64(1)));
3113 if_not_condition_goto_computed(binop(Iop_CmpEQ64, get_gpr_dw0(r1),
3114 mkU64(0)), get_gpr_dw0(r2));
3121 s390_irgen_BCT(UChar r1, IRTemp op2addr)
3123 put_gpr_w1(r1, binop(Iop_Sub32, get_gpr_w1(r1), mkU32(1)));
3124 if_not_condition_goto_computed(binop(Iop_CmpEQ32, get_gpr_w1(r1), mkU32(0)),
3131 s390_irgen_BCTG(UChar r1, IRTemp op2addr)
3133 put_gpr_dw0(r1, binop(Iop_Sub64, get_gpr_dw0(r1), mkU64(1)));
3134 if_not_condition_goto_computed(binop(Iop_CmpEQ64, get_gpr_dw0(r1), mkU64(0)),
3141 s390_irgen_BXH(UChar r1, UChar r3, IRTemp op2addr)
3143 IRTemp value = newTemp(Ity_I32);
3145 assign(value, get_gpr_w1(r3 | 1));
3146 put_gpr_w1(r1, binop(Iop_Add32, get_gpr_w1(r1), get_gpr_w1(r3)));
3147 if_not_condition_goto_computed(binop(Iop_CmpLE32S, get_gpr_w1(r1),
3148 mkexpr(value)), mkexpr(op2addr));
3154 s390_irgen_BXHG(UChar r1, UChar r3, IRTemp op2addr)
3156 IRTemp value = newTemp(Ity_I64);
3158 assign(value, get_gpr_dw0(r3 | 1));
3159 put_gpr_dw0(r1, binop(Iop_Add64, get_gpr_dw0(r1), get_gpr_dw0(r3)));
3160 if_not_condition_goto_computed(binop(Iop_CmpLE64S, get_gpr_dw0(r1),
3161 mkexpr(value)), mkexpr(op2addr));
3167 s390_irgen_BXLE(UChar r1, UChar r3, IRTemp op2addr)
3169 IRTemp value = newTemp(Ity_I32);
3171 assign(value, get_gpr_w1(r3 | 1));
3172 put_gpr_w1(r1, binop(Iop_Add32, get_gpr_w1(r1), get_gpr_w1(r3)));
3173 if_not_condition_goto_computed(binop(Iop_CmpLT32S, mkexpr(value),
3174 get_gpr_w1(r1)), mkexpr(op2addr));
3180 s390_irgen_BXLEG(UChar r1, UChar r3, IRTemp op2addr)
3182 IRTemp value = newTemp(Ity_I64);
3184 assign(value, get_gpr_dw0(r3 | 1));
3185 put_gpr_dw0(r1, binop(Iop_Add64, get_gpr_dw0(r1), get_gpr_dw0(r3)));
3186 if_not_condition_goto_computed(binop(Iop_CmpLT64S, mkexpr(value),
3187 get_gpr_dw0(r1)), mkexpr(op2addr));
3193 s390_irgen_BRAS(UChar r1, UShort i2)
3195 put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 4ULL));
3196 call_function(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1)));
3202 s390_irgen_BRASL(UChar r1, UInt i2)
3204 put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + 6ULL));
3205 call_function(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1)));
3211 s390_irgen_BRC(UChar r1, UShort i2)
3213 IRTemp cond = newTemp(Ity_I32);
3218 always_goto(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1))
3221 assign(cond, s390_call_calculate_cond(r1));
3222 if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3223 guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3227 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
3228 s390_disasm(ENC2(XMNM, PCREL), S390_XMNM_BRC, r1, (Int)(Short)i2);
3234 s390_irgen_BRCL(UChar r1, UInt i2)
3236 IRTemp cond = newTemp(Ity_I32);
3241 always_goto(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1)));
3243 assign(cond, s390_call_calculate_cond(r1));
3244 if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3245 guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1));
3248 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
3249 s390_disasm(ENC2(XMNM, PCREL), S390_XMNM_BRCL, r1, i2);
3255 s390_irgen_BRCT(UChar r1, UShort i2)
3257 put_gpr_w1(r1, binop(Iop_Sub32, get_gpr_w1(r1), mkU32(1)));
3258 if_condition_goto(binop(Iop_CmpNE32, get_gpr_w1(r1), mkU32(0)),
3259 guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3265 s390_irgen_BRCTG(UChar r1, UShort i2)
3267 put_gpr_dw0(r1, binop(Iop_Sub64, get_gpr_dw0(r1), mkU64(1)));
3268 if_condition_goto(binop(Iop_CmpNE64, get_gpr_dw0(r1), mkU64(0)),
3269 guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3275 s390_irgen_BRXH(UChar r1, UChar r3, UShort i2)
3277 IRTemp value = newTemp(Ity_I32);
3279 assign(value, get_gpr_w1(r3 | 1));
3280 put_gpr_w1(r1, binop(Iop_Add32, get_gpr_w1(r1), get_gpr_w1(r3)));
3281 if_condition_goto(binop(Iop_CmpLT32S, mkexpr(value), get_gpr_w1(r1)),
3282 guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3288 s390_irgen_BRXHG(UChar r1, UChar r3, UShort i2)
3290 IRTemp value = newTemp(Ity_I64);
3292 assign(value, get_gpr_dw0(r3 | 1));
3293 put_gpr_dw0(r1, binop(Iop_Add64, get_gpr_dw0(r1), get_gpr_dw0(r3)));
3294 if_condition_goto(binop(Iop_CmpLT64S, mkexpr(value), get_gpr_dw0(r1)),
3295 guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3301 s390_irgen_BRXLE(UChar r1, UChar r3, UShort i2)
3303 IRTemp value = newTemp(Ity_I32);
3305 assign(value, get_gpr_w1(r3 | 1));
3306 put_gpr_w1(r1, binop(Iop_Add32, get_gpr_w1(r1), get_gpr_w1(r3)));
3307 if_condition_goto(binop(Iop_CmpLE32S, get_gpr_w1(r1), mkexpr(value)),
3308 guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3314 s390_irgen_BRXLG(UChar r1, UChar r3, UShort i2)
3316 IRTemp value = newTemp(Ity_I64);
3318 assign(value, get_gpr_dw0(r3 | 1));
3319 put_gpr_dw0(r1, binop(Iop_Add64, get_gpr_dw0(r1), get_gpr_dw0(r3)));
3320 if_condition_goto(binop(Iop_CmpLE64S, get_gpr_dw0(r1), mkexpr(value)),
3321 guest_IA_curr_instr + ((ULong)(Long)(Short)i2 << 1));
3327 s390_irgen_CR(UChar r1, UChar r2)
3329 IRTemp op1 = newTemp(Ity_I32);
3330 IRTemp op2 = newTemp(Ity_I32);
3332 assign(op1, get_gpr_w1(r1));
3333 assign(op2, get_gpr_w1(r2));
3334 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3340 s390_irgen_CGR(UChar r1, UChar r2)
3342 IRTemp op1 = newTemp(Ity_I64);
3343 IRTemp op2 = newTemp(Ity_I64);
3345 assign(op1, get_gpr_dw0(r1));
3346 assign(op2, get_gpr_dw0(r2));
3347 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3353 s390_irgen_CGFR(UChar r1, UChar r2)
3355 IRTemp op1 = newTemp(Ity_I64);
3356 IRTemp op2 = newTemp(Ity_I64);
3358 assign(op1, get_gpr_dw0(r1));
3359 assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
3360 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3366 s390_irgen_C(UChar r1, IRTemp op2addr)
3368 IRTemp op1 = newTemp(Ity_I32);
3369 IRTemp op2 = newTemp(Ity_I32);
3371 assign(op1, get_gpr_w1(r1));
3372 assign(op2, load(Ity_I32, mkexpr(op2addr)));
3373 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3379 s390_irgen_CY(UChar r1, IRTemp op2addr)
3381 IRTemp op1 = newTemp(Ity_I32);
3382 IRTemp op2 = newTemp(Ity_I32);
3384 assign(op1, get_gpr_w1(r1));
3385 assign(op2, load(Ity_I32, mkexpr(op2addr)));
3386 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3392 s390_irgen_CG(UChar r1, IRTemp op2addr)
3394 IRTemp op1 = newTemp(Ity_I64);
3395 IRTemp op2 = newTemp(Ity_I64);
3397 assign(op1, get_gpr_dw0(r1));
3398 assign(op2, load(Ity_I64, mkexpr(op2addr)));
3399 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3405 s390_irgen_CGF(UChar r1, IRTemp op2addr)
3407 IRTemp op1 = newTemp(Ity_I64);
3408 IRTemp op2 = newTemp(Ity_I64);
3410 assign(op1, get_gpr_dw0(r1));
3411 assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
3412 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3418 s390_irgen_CFI(UChar r1, UInt i2)
3420 IRTemp op1 = newTemp(Ity_I32);
3423 assign(op1, get_gpr_w1(r1));
3425 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I32,
3432 s390_irgen_CGFI(UChar r1, UInt i2)
3434 IRTemp op1 = newTemp(Ity_I64);
3437 assign(op1, get_gpr_dw0(r1));
3438 op2 = (Long)(Int)i2;
3439 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I64,
3440 mkU64((ULong)op2)));
3446 s390_irgen_CRL(UChar r1, UInt i2)
3448 IRTemp op1 = newTemp(Ity_I32);
3449 IRTemp op2 = newTemp(Ity_I32);
3451 assign(op1, get_gpr_w1(r1));
3452 assign(op2, load(Ity_I32, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
3454 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3460 s390_irgen_CGRL(UChar r1, UInt i2)
3462 IRTemp op1 = newTemp(Ity_I64);
3463 IRTemp op2 = newTemp(Ity_I64);
3465 assign(op1, get_gpr_dw0(r1));
3466 assign(op2, load(Ity_I64, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
3468 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3474 s390_irgen_CGFRL(UChar r1, UInt i2)
3476 IRTemp op1 = newTemp(Ity_I64);
3477 IRTemp op2 = newTemp(Ity_I64);
3479 assign(op1, get_gpr_dw0(r1));
3480 assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkU64(guest_IA_curr_instr +
3481 ((ULong)(Long)(Int)i2 << 1)))));
3482 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3488 s390_irgen_CRB(UChar r1, UChar r2, UChar m3, IRTemp op4addr)
3490 IRTemp op1 = newTemp(Ity_I32);
3491 IRTemp op2 = newTemp(Ity_I32);
3492 IRTemp icc = newTemp(Ity_I32);
3493 IRTemp cond = newTemp(Ity_I32);
3498 always_goto(mkexpr(op4addr));
3500 assign(op1, get_gpr_w1(r1));
3501 assign(op2, get_gpr_w1(r2));
3502 assign(icc, s390_call_calculate_iccSS(S390_CC_OP_SIGNED_COMPARE, op1,
3504 assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
3505 unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
3506 if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
3507 mkU32(0)), mkexpr(op4addr));
3515 s390_irgen_CGRB(UChar r1, UChar r2, UChar m3, IRTemp op4addr)
3517 IRTemp op1 = newTemp(Ity_I64);
3518 IRTemp op2 = newTemp(Ity_I64);
3519 IRTemp icc = newTemp(Ity_I32);
3520 IRTemp cond = newTemp(Ity_I32);
3525 always_goto(mkexpr(op4addr));
3527 assign(op1, get_gpr_dw0(r1));
3528 assign(op2, get_gpr_dw0(r2));
3529 assign(icc, s390_call_calculate_iccSS(S390_CC_OP_SIGNED_COMPARE, op1,
3531 assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
3532 unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
3533 if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
3534 mkU32(0)), mkexpr(op4addr));
3542 s390_irgen_CRJ(UChar r1, UChar r2, UShort i4, UChar m3)
3544 IRTemp op1 = newTemp(Ity_I32);
3545 IRTemp op2 = newTemp(Ity_I32);
3546 IRTemp icc = newTemp(Ity_I32);
3547 IRTemp cond = newTemp(Ity_I32);
3552 always_goto(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1))
3555 assign(op1, get_gpr_w1(r1));
3556 assign(op2, get_gpr_w1(r2));
3557 assign(icc, s390_call_calculate_iccSS(S390_CC_OP_SIGNED_COMPARE, op1,
3559 assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
3560 unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
3561 if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3562 guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
3571 s390_irgen_CGRJ(UChar r1, UChar r2, UShort i4, UChar m3)
3573 IRTemp op1 = newTemp(Ity_I64);
3574 IRTemp op2 = newTemp(Ity_I64);
3575 IRTemp icc = newTemp(Ity_I32);
3576 IRTemp cond = newTemp(Ity_I32);
3581 always_goto(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1))
3584 assign(op1, get_gpr_dw0(r1));
3585 assign(op2, get_gpr_dw0(r2));
3586 assign(icc, s390_call_calculate_iccSS(S390_CC_OP_SIGNED_COMPARE, op1,
3588 assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
3589 unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
3590 if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3591 guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
3600 s390_irgen_CIB(UChar r1, UChar m3, UChar i2, IRTemp op4addr)
3602 IRTemp op1 = newTemp(Ity_I32);
3604 IRTemp icc = newTemp(Ity_I32);
3605 IRTemp cond = newTemp(Ity_I32);
3610 always_goto(mkexpr(op4addr));
3612 assign(op1, get_gpr_w1(r1));
3613 op2 = (Int)(Char)i2;
3614 assign(icc, s390_call_calculate_iccSS(S390_CC_OP_SIGNED_COMPARE, op1,
3615 mktemp(Ity_I32, mkU32((UInt)op2))));
3616 assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
3617 unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
3618 if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
3619 mkU32(0)), mkexpr(op4addr));
3627 s390_irgen_CGIB(UChar r1, UChar m3, UChar i2, IRTemp op4addr)
3629 IRTemp op1 = newTemp(Ity_I64);
3631 IRTemp icc = newTemp(Ity_I32);
3632 IRTemp cond = newTemp(Ity_I32);
3637 always_goto(mkexpr(op4addr));
3639 assign(op1, get_gpr_dw0(r1));
3640 op2 = (Long)(Char)i2;
3641 assign(icc, s390_call_calculate_iccSS(S390_CC_OP_SIGNED_COMPARE, op1,
3642 mktemp(Ity_I64, mkU64((ULong)op2))));
3643 assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
3644 unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
3645 if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
3646 mkU32(0)), mkexpr(op4addr));
3654 s390_irgen_CIJ(UChar r1, UChar m3, UShort i4, UChar i2)
3656 IRTemp op1 = newTemp(Ity_I32);
3658 IRTemp icc = newTemp(Ity_I32);
3659 IRTemp cond = newTemp(Ity_I32);
3664 always_goto(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1))
3667 assign(op1, get_gpr_w1(r1));
3668 op2 = (Int)(Char)i2;
3669 assign(icc, s390_call_calculate_iccSS(S390_CC_OP_SIGNED_COMPARE, op1,
3670 mktemp(Ity_I32, mkU32((UInt)op2))));
3671 assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
3672 unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
3673 if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3674 guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
3683 s390_irgen_CGIJ(UChar r1, UChar m3, UShort i4, UChar i2)
3685 IRTemp op1 = newTemp(Ity_I64);
3687 IRTemp icc = newTemp(Ity_I32);
3688 IRTemp cond = newTemp(Ity_I32);
3693 always_goto(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1))
3696 assign(op1, get_gpr_dw0(r1));
3697 op2 = (Long)(Char)i2;
3698 assign(icc, s390_call_calculate_iccSS(S390_CC_OP_SIGNED_COMPARE, op1,
3699 mktemp(Ity_I64, mkU64((ULong)op2))));
3700 assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
3701 unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
3702 if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
3703 guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
3712 s390_irgen_CH(UChar r1, IRTemp op2addr)
3714 IRTemp op1 = newTemp(Ity_I32);
3715 IRTemp op2 = newTemp(Ity_I32);
3717 assign(op1, get_gpr_w1(r1));
3718 assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
3719 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3725 s390_irgen_CHY(UChar r1, IRTemp op2addr)
3727 IRTemp op1 = newTemp(Ity_I32);
3728 IRTemp op2 = newTemp(Ity_I32);
3730 assign(op1, get_gpr_w1(r1));
3731 assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
3732 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3738 s390_irgen_CGH(UChar r1, IRTemp op2addr)
3740 IRTemp op1 = newTemp(Ity_I64);
3741 IRTemp op2 = newTemp(Ity_I64);
3743 assign(op1, get_gpr_dw0(r1));
3744 assign(op2, unop(Iop_16Sto64, load(Ity_I16, mkexpr(op2addr))));
3745 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3751 s390_irgen_CHI(UChar r1, UShort i2)
3753 IRTemp op1 = newTemp(Ity_I32);
3756 assign(op1, get_gpr_w1(r1));
3757 op2 = (Int)(Short)i2;
3758 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I32,
3765 s390_irgen_CGHI(UChar r1, UShort i2)
3767 IRTemp op1 = newTemp(Ity_I64);
3770 assign(op1, get_gpr_dw0(r1));
3771 op2 = (Long)(Short)i2;
3772 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I64,
3773 mkU64((ULong)op2)));
3779 s390_irgen_CHHSI(UShort i2, IRTemp op1addr)
3781 IRTemp op1 = newTemp(Ity_I16);
3784 assign(op1, load(Ity_I16, mkexpr(op1addr)));
3786 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I16,
3787 mkU16((UShort)op2)));
3793 s390_irgen_CHSI(UShort i2, IRTemp op1addr)
3795 IRTemp op1 = newTemp(Ity_I32);
3798 assign(op1, load(Ity_I32, mkexpr(op1addr)));
3799 op2 = (Int)(Short)i2;
3800 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I32,
3807 s390_irgen_CGHSI(UShort i2, IRTemp op1addr)
3809 IRTemp op1 = newTemp(Ity_I64);
3812 assign(op1, load(Ity_I64, mkexpr(op1addr)));
3813 op2 = (Long)(Short)i2;
3814 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I64,
3815 mkU64((ULong)op2)));
3821 s390_irgen_CHRL(UChar r1, UInt i2)
3823 IRTemp op1 = newTemp(Ity_I32);
3824 IRTemp op2 = newTemp(Ity_I32);
3826 assign(op1, get_gpr_w1(r1));
3827 assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkU64(guest_IA_curr_instr +
3828 ((ULong)(Long)(Int)i2 << 1)))));
3829 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3835 s390_irgen_CGHRL(UChar r1, UInt i2)
3837 IRTemp op1 = newTemp(Ity_I64);
3838 IRTemp op2 = newTemp(Ity_I64);
3840 assign(op1, get_gpr_dw0(r1));
3841 assign(op2, unop(Iop_16Sto64, load(Ity_I16, mkU64(guest_IA_curr_instr +
3842 ((ULong)(Long)(Int)i2 << 1)))));
3843 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3849 s390_irgen_CHHR(UChar r1, UChar r2)
3851 IRTemp op1 = newTemp(Ity_I32);
3852 IRTemp op2 = newTemp(Ity_I32);
3854 assign(op1, get_gpr_w0(r1));
3855 assign(op2, get_gpr_w0(r2));
3856 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3862 s390_irgen_CHLR(UChar r1, UChar r2)
3864 IRTemp op1 = newTemp(Ity_I32);
3865 IRTemp op2 = newTemp(Ity_I32);
3867 assign(op1, get_gpr_w0(r1));
3868 assign(op2, get_gpr_w1(r2));
3869 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3875 s390_irgen_CHF(UChar r1, IRTemp op2addr)
3877 IRTemp op1 = newTemp(Ity_I32);
3878 IRTemp op2 = newTemp(Ity_I32);
3880 assign(op1, get_gpr_w0(r1));
3881 assign(op2, load(Ity_I32, mkexpr(op2addr)));
3882 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, op2);
3888 s390_irgen_CIH(UChar r1, UInt i2)
3890 IRTemp op1 = newTemp(Ity_I32);
3893 assign(op1, get_gpr_w0(r1));
3895 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_COMPARE, op1, mktemp(Ity_I32,
3902 s390_irgen_CLR(UChar r1, UChar r2)
3904 IRTemp op1 = newTemp(Ity_I32);
3905 IRTemp op2 = newTemp(Ity_I32);
3907 assign(op1, get_gpr_w1(r1));
3908 assign(op2, get_gpr_w1(r2));
3909 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
3915 s390_irgen_CLGR(UChar r1, UChar r2)
3917 IRTemp op1 = newTemp(Ity_I64);
3918 IRTemp op2 = newTemp(Ity_I64);
3920 assign(op1, get_gpr_dw0(r1));
3921 assign(op2, get_gpr_dw0(r2));
3922 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
3928 s390_irgen_CLGFR(UChar r1, UChar r2)
3930 IRTemp op1 = newTemp(Ity_I64);
3931 IRTemp op2 = newTemp(Ity_I64);
3933 assign(op1, get_gpr_dw0(r1));
3934 assign(op2, unop(Iop_32Uto64, get_gpr_w1(r2)));
3935 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
3941 s390_irgen_CL(UChar r1, IRTemp op2addr)
3943 IRTemp op1 = newTemp(Ity_I32);
3944 IRTemp op2 = newTemp(Ity_I32);
3946 assign(op1, get_gpr_w1(r1));
3947 assign(op2, load(Ity_I32, mkexpr(op2addr)));
3948 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
3954 s390_irgen_CLY(UChar r1, IRTemp op2addr)
3956 IRTemp op1 = newTemp(Ity_I32);
3957 IRTemp op2 = newTemp(Ity_I32);
3959 assign(op1, get_gpr_w1(r1));
3960 assign(op2, load(Ity_I32, mkexpr(op2addr)));
3961 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
3967 s390_irgen_CLG(UChar r1, IRTemp op2addr)
3969 IRTemp op1 = newTemp(Ity_I64);
3970 IRTemp op2 = newTemp(Ity_I64);
3972 assign(op1, get_gpr_dw0(r1));
3973 assign(op2, load(Ity_I64, mkexpr(op2addr)));
3974 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
3980 s390_irgen_CLGF(UChar r1, IRTemp op2addr)
3982 IRTemp op1 = newTemp(Ity_I64);
3983 IRTemp op2 = newTemp(Ity_I64);
3985 assign(op1, get_gpr_dw0(r1));
3986 assign(op2, unop(Iop_32Uto64, load(Ity_I32, mkexpr(op2addr))));
3987 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
3993 s390_irgen_CLFI(UChar r1, UInt i2)
3995 IRTemp op1 = newTemp(Ity_I32);
3998 assign(op1, get_gpr_w1(r1));
4000 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I32,
4007 s390_irgen_CLGFI(UChar r1, UInt i2)
4009 IRTemp op1 = newTemp(Ity_I64);
4012 assign(op1, get_gpr_dw0(r1));
4014 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I64,
4021 s390_irgen_CLI(UChar i2, IRTemp op1addr)
4023 IRTemp op1 = newTemp(Ity_I8);
4026 assign(op1, load(Ity_I8, mkexpr(op1addr)));
4028 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I8,
4035 s390_irgen_CLIY(UChar i2, IRTemp op1addr)
4037 IRTemp op1 = newTemp(Ity_I8);
4040 assign(op1, load(Ity_I8, mkexpr(op1addr)));
4042 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I8,
4049 s390_irgen_CLFHSI(UShort i2, IRTemp op1addr)
4051 IRTemp op1 = newTemp(Ity_I32);
4054 assign(op1, load(Ity_I32, mkexpr(op1addr)));
4056 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I32,
4063 s390_irgen_CLGHSI(UShort i2, IRTemp op1addr)
4065 IRTemp op1 = newTemp(Ity_I64);
4068 assign(op1, load(Ity_I64, mkexpr(op1addr)));
4070 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I64,
4077 s390_irgen_CLHHSI(UShort i2, IRTemp op1addr)
4079 IRTemp op1 = newTemp(Ity_I16);
4082 assign(op1, load(Ity_I16, mkexpr(op1addr)));
4084 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I16,
4091 s390_irgen_CLRL(UChar r1, UInt i2)
4093 IRTemp op1 = newTemp(Ity_I32);
4094 IRTemp op2 = newTemp(Ity_I32);
4096 assign(op1, get_gpr_w1(r1));
4097 assign(op2, load(Ity_I32, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
4099 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4105 s390_irgen_CLGRL(UChar r1, UInt i2)
4107 IRTemp op1 = newTemp(Ity_I64);
4108 IRTemp op2 = newTemp(Ity_I64);
4110 assign(op1, get_gpr_dw0(r1));
4111 assign(op2, load(Ity_I64, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
4113 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4119 s390_irgen_CLGFRL(UChar r1, UInt i2)
4121 IRTemp op1 = newTemp(Ity_I64);
4122 IRTemp op2 = newTemp(Ity_I64);
4124 assign(op1, get_gpr_dw0(r1));
4125 assign(op2, unop(Iop_32Uto64, load(Ity_I32, mkU64(guest_IA_curr_instr +
4126 ((ULong)(Long)(Int)i2 << 1)))));
4127 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4133 s390_irgen_CLHRL(UChar r1, UInt i2)
4135 IRTemp op1 = newTemp(Ity_I32);
4136 IRTemp op2 = newTemp(Ity_I32);
4138 assign(op1, get_gpr_w1(r1));
4139 assign(op2, unop(Iop_16Uto32, load(Ity_I16, mkU64(guest_IA_curr_instr +
4140 ((ULong)(Long)(Int)i2 << 1)))));
4141 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4147 s390_irgen_CLGHRL(UChar r1, UInt i2)
4149 IRTemp op1 = newTemp(Ity_I64);
4150 IRTemp op2 = newTemp(Ity_I64);
4152 assign(op1, get_gpr_dw0(r1));
4153 assign(op2, unop(Iop_16Uto64, load(Ity_I16, mkU64(guest_IA_curr_instr +
4154 ((ULong)(Long)(Int)i2 << 1)))));
4155 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4161 s390_irgen_CLRB(UChar r1, UChar r2, UChar m3, IRTemp op4addr)
4163 IRTemp op1 = newTemp(Ity_I32);
4164 IRTemp op2 = newTemp(Ity_I32);
4165 IRTemp icc = newTemp(Ity_I32);
4166 IRTemp cond = newTemp(Ity_I32);
4171 always_goto(mkexpr(op4addr));
4173 assign(op1, get_gpr_w1(r1));
4174 assign(op2, get_gpr_w1(r2));
4175 assign(icc, s390_call_calculate_iccZZ(S390_CC_OP_UNSIGNED_COMPARE, op1,
4177 assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
4178 unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
4179 if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
4180 mkU32(0)), mkexpr(op4addr));
4188 s390_irgen_CLGRB(UChar r1, UChar r2, UChar m3, IRTemp op4addr)
4190 IRTemp op1 = newTemp(Ity_I64);
4191 IRTemp op2 = newTemp(Ity_I64);
4192 IRTemp icc = newTemp(Ity_I32);
4193 IRTemp cond = newTemp(Ity_I32);
4198 always_goto(mkexpr(op4addr));
4200 assign(op1, get_gpr_dw0(r1));
4201 assign(op2, get_gpr_dw0(r2));
4202 assign(icc, s390_call_calculate_iccZZ(S390_CC_OP_UNSIGNED_COMPARE, op1,
4204 assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
4205 unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
4206 if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
4207 mkU32(0)), mkexpr(op4addr));
4215 s390_irgen_CLRJ(UChar r1, UChar r2, UShort i4, UChar m3)
4217 IRTemp op1 = newTemp(Ity_I32);
4218 IRTemp op2 = newTemp(Ity_I32);
4219 IRTemp icc = newTemp(Ity_I32);
4220 IRTemp cond = newTemp(Ity_I32);
4225 always_goto(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1))
4228 assign(op1, get_gpr_w1(r1));
4229 assign(op2, get_gpr_w1(r2));
4230 assign(icc, s390_call_calculate_iccZZ(S390_CC_OP_UNSIGNED_COMPARE, op1,
4232 assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
4233 unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
4234 if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4235 guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4244 s390_irgen_CLGRJ(UChar r1, UChar r2, UShort i4, UChar m3)
4246 IRTemp op1 = newTemp(Ity_I64);
4247 IRTemp op2 = newTemp(Ity_I64);
4248 IRTemp icc = newTemp(Ity_I32);
4249 IRTemp cond = newTemp(Ity_I32);
4254 always_goto(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1))
4257 assign(op1, get_gpr_dw0(r1));
4258 assign(op2, get_gpr_dw0(r2));
4259 assign(icc, s390_call_calculate_iccZZ(S390_CC_OP_UNSIGNED_COMPARE, op1,
4261 assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
4262 unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
4263 if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4264 guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4273 s390_irgen_CLIB(UChar r1, UChar m3, UChar i2, IRTemp op4addr)
4275 IRTemp op1 = newTemp(Ity_I32);
4277 IRTemp icc = newTemp(Ity_I32);
4278 IRTemp cond = newTemp(Ity_I32);
4283 always_goto(mkexpr(op4addr));
4285 assign(op1, get_gpr_w1(r1));
4287 assign(icc, s390_call_calculate_iccZZ(S390_CC_OP_UNSIGNED_COMPARE, op1,
4288 mktemp(Ity_I32, mkU32(op2))));
4289 assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
4290 unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
4291 if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
4292 mkU32(0)), mkexpr(op4addr));
4300 s390_irgen_CLGIB(UChar r1, UChar m3, UChar i2, IRTemp op4addr)
4302 IRTemp op1 = newTemp(Ity_I64);
4304 IRTemp icc = newTemp(Ity_I32);
4305 IRTemp cond = newTemp(Ity_I32);
4310 always_goto(mkexpr(op4addr));
4312 assign(op1, get_gpr_dw0(r1));
4314 assign(icc, s390_call_calculate_iccZZ(S390_CC_OP_UNSIGNED_COMPARE, op1,
4315 mktemp(Ity_I64, mkU64(op2))));
4316 assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
4317 unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
4318 if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
4319 mkU32(0)), mkexpr(op4addr));
4327 s390_irgen_CLIJ(UChar r1, UChar m3, UShort i4, UChar i2)
4329 IRTemp op1 = newTemp(Ity_I32);
4331 IRTemp icc = newTemp(Ity_I32);
4332 IRTemp cond = newTemp(Ity_I32);
4337 always_goto(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1))
4340 assign(op1, get_gpr_w1(r1));
4342 assign(icc, s390_call_calculate_iccZZ(S390_CC_OP_UNSIGNED_COMPARE, op1,
4343 mktemp(Ity_I32, mkU32(op2))));
4344 assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
4345 unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
4346 if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4347 guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4356 s390_irgen_CLGIJ(UChar r1, UChar m3, UShort i4, UChar i2)
4358 IRTemp op1 = newTemp(Ity_I64);
4360 IRTemp icc = newTemp(Ity_I32);
4361 IRTemp cond = newTemp(Ity_I32);
4366 always_goto(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1))
4369 assign(op1, get_gpr_dw0(r1));
4371 assign(icc, s390_call_calculate_iccZZ(S390_CC_OP_UNSIGNED_COMPARE, op1,
4372 mktemp(Ity_I64, mkU64(op2))));
4373 assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
4374 unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
4375 if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
4376 guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
4385 s390_irgen_CLM(UChar r1, UChar r3, IRTemp op2addr)
4387 IRTemp op1 = newTemp(Ity_I32);
4388 IRTemp op2 = newTemp(Ity_I32);
4389 IRTemp b0 = newTemp(Ity_I32);
4390 IRTemp b1 = newTemp(Ity_I32);
4391 IRTemp b2 = newTemp(Ity_I32);
4392 IRTemp b3 = newTemp(Ity_I32);
4393 IRTemp c0 = newTemp(Ity_I32);
4394 IRTemp c1 = newTemp(Ity_I32);
4395 IRTemp c2 = newTemp(Ity_I32);
4396 IRTemp c3 = newTemp(Ity_I32);
4400 if ((r3 & 8) != 0) {
4401 assign(b0, unop(Iop_8Uto32, get_gpr_b4(r1)));
4402 assign(c0, unop(Iop_8Uto32, load(Ity_I8, mkexpr(op2addr))));
4405 assign(b0, mkU32(0));
4406 assign(c0, mkU32(0));
4408 if ((r3 & 4) != 0) {
4409 assign(b1, unop(Iop_8Uto32, get_gpr_b5(r1)));
4410 assign(c1, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4414 assign(b1, mkU32(0));
4415 assign(c1, mkU32(0));
4417 if ((r3 & 2) != 0) {
4418 assign(b2, unop(Iop_8Uto32, get_gpr_b6(r1)));
4419 assign(c2, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4423 assign(b2, mkU32(0));
4424 assign(c2, mkU32(0));
4426 if ((r3 & 1) != 0) {
4427 assign(b3, unop(Iop_8Uto32, get_gpr_b7(r1)));
4428 assign(c3, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4432 assign(b3, mkU32(0));
4433 assign(c3, mkU32(0));
4435 assign(op1, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
4436 mkexpr(b0), mkU8(24)), binop(Iop_Shl32, mkexpr(b1), mkU8(16))),
4437 binop(Iop_Shl32, mkexpr(b2), mkU8(8))), mkexpr(b3)));
4438 assign(op2, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
4439 mkexpr(c0), mkU8(24)), binop(Iop_Shl32, mkexpr(c1), mkU8(16))),
4440 binop(Iop_Shl32, mkexpr(c2), mkU8(8))), mkexpr(c3)));
4441 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4447 s390_irgen_CLMY(UChar r1, UChar r3, IRTemp op2addr)
4449 IRTemp op1 = newTemp(Ity_I32);
4450 IRTemp op2 = newTemp(Ity_I32);
4451 IRTemp b0 = newTemp(Ity_I32);
4452 IRTemp b1 = newTemp(Ity_I32);
4453 IRTemp b2 = newTemp(Ity_I32);
4454 IRTemp b3 = newTemp(Ity_I32);
4455 IRTemp c0 = newTemp(Ity_I32);
4456 IRTemp c1 = newTemp(Ity_I32);
4457 IRTemp c2 = newTemp(Ity_I32);
4458 IRTemp c3 = newTemp(Ity_I32);
4462 if ((r3 & 8) != 0) {
4463 assign(b0, unop(Iop_8Uto32, get_gpr_b4(r1)));
4464 assign(c0, unop(Iop_8Uto32, load(Ity_I8, mkexpr(op2addr))));
4467 assign(b0, mkU32(0));
4468 assign(c0, mkU32(0));
4470 if ((r3 & 4) != 0) {
4471 assign(b1, unop(Iop_8Uto32, get_gpr_b5(r1)));
4472 assign(c1, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4476 assign(b1, mkU32(0));
4477 assign(c1, mkU32(0));
4479 if ((r3 & 2) != 0) {
4480 assign(b2, unop(Iop_8Uto32, get_gpr_b6(r1)));
4481 assign(c2, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4485 assign(b2, mkU32(0));
4486 assign(c2, mkU32(0));
4488 if ((r3 & 1) != 0) {
4489 assign(b3, unop(Iop_8Uto32, get_gpr_b7(r1)));
4490 assign(c3, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4494 assign(b3, mkU32(0));
4495 assign(c3, mkU32(0));
4497 assign(op1, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
4498 mkexpr(b0), mkU8(24)), binop(Iop_Shl32, mkexpr(b1), mkU8(16))),
4499 binop(Iop_Shl32, mkexpr(b2), mkU8(8))), mkexpr(b3)));
4500 assign(op2, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
4501 mkexpr(c0), mkU8(24)), binop(Iop_Shl32, mkexpr(c1), mkU8(16))),
4502 binop(Iop_Shl32, mkexpr(c2), mkU8(8))), mkexpr(c3)));
4503 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4509 s390_irgen_CLMH(UChar r1, UChar r3, IRTemp op2addr)
4511 IRTemp op1 = newTemp(Ity_I32);
4512 IRTemp op2 = newTemp(Ity_I32);
4513 IRTemp b0 = newTemp(Ity_I32);
4514 IRTemp b1 = newTemp(Ity_I32);
4515 IRTemp b2 = newTemp(Ity_I32);
4516 IRTemp b3 = newTemp(Ity_I32);
4517 IRTemp c0 = newTemp(Ity_I32);
4518 IRTemp c1 = newTemp(Ity_I32);
4519 IRTemp c2 = newTemp(Ity_I32);
4520 IRTemp c3 = newTemp(Ity_I32);
4524 if ((r3 & 8) != 0) {
4525 assign(b0, unop(Iop_8Uto32, get_gpr_b0(r1)));
4526 assign(c0, unop(Iop_8Uto32, load(Ity_I8, mkexpr(op2addr))));
4529 assign(b0, mkU32(0));
4530 assign(c0, mkU32(0));
4532 if ((r3 & 4) != 0) {
4533 assign(b1, unop(Iop_8Uto32, get_gpr_b1(r1)));
4534 assign(c1, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4538 assign(b1, mkU32(0));
4539 assign(c1, mkU32(0));
4541 if ((r3 & 2) != 0) {
4542 assign(b2, unop(Iop_8Uto32, get_gpr_b2(r1)));
4543 assign(c2, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4547 assign(b2, mkU32(0));
4548 assign(c2, mkU32(0));
4550 if ((r3 & 1) != 0) {
4551 assign(b3, unop(Iop_8Uto32, get_gpr_b3(r1)));
4552 assign(c3, unop(Iop_8Uto32, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr),
4556 assign(b3, mkU32(0));
4557 assign(c3, mkU32(0));
4559 assign(op1, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
4560 mkexpr(b0), mkU8(24)), binop(Iop_Shl32, mkexpr(b1), mkU8(16))),
4561 binop(Iop_Shl32, mkexpr(b2), mkU8(8))), mkexpr(b3)));
4562 assign(op2, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Shl32,
4563 mkexpr(c0), mkU8(24)), binop(Iop_Shl32, mkexpr(c1), mkU8(16))),
4564 binop(Iop_Shl32, mkexpr(c2), mkU8(8))), mkexpr(c3)));
4565 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4571 s390_irgen_CLHHR(UChar r1, UChar r2)
4573 IRTemp op1 = newTemp(Ity_I32);
4574 IRTemp op2 = newTemp(Ity_I32);
4576 assign(op1, get_gpr_w0(r1));
4577 assign(op2, get_gpr_w0(r2));
4578 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4584 s390_irgen_CLHLR(UChar r1, UChar r2)
4586 IRTemp op1 = newTemp(Ity_I32);
4587 IRTemp op2 = newTemp(Ity_I32);
4589 assign(op1, get_gpr_w0(r1));
4590 assign(op2, get_gpr_w1(r2));
4591 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4597 s390_irgen_CLHF(UChar r1, IRTemp op2addr)
4599 IRTemp op1 = newTemp(Ity_I32);
4600 IRTemp op2 = newTemp(Ity_I32);
4602 assign(op1, get_gpr_w0(r1));
4603 assign(op2, load(Ity_I32, mkexpr(op2addr)));
4604 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, op2);
4610 s390_irgen_CLIH(UChar r1, UInt i2)
4612 IRTemp op1 = newTemp(Ity_I32);
4615 assign(op1, get_gpr_w0(r1));
4617 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_COMPARE, op1, mktemp(Ity_I32,
4624 s390_irgen_CPYA(UChar r1, UChar r2)
4626 put_ar_w0(r1, get_ar_w0(r2));
4627 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
4628 s390_disasm(ENC3(MNM, AR, AR), "cpya", r1, r2);
4634 s390_irgen_XR(UChar r1, UChar r2)
4636 IRTemp op1 = newTemp(Ity_I32);
4637 IRTemp op2 = newTemp(Ity_I32);
4638 IRTemp result = newTemp(Ity_I32);
4641 assign(result, mkU32(0));
4643 assign(op1, get_gpr_w1(r1));
4644 assign(op2, get_gpr_w1(r2));
4645 assign(result, binop(Iop_Xor32, mkexpr(op1), mkexpr(op2)));
4647 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4648 put_gpr_w1(r1, mkexpr(result));
4654 s390_irgen_XGR(UChar r1, UChar r2)
4656 IRTemp op1 = newTemp(Ity_I64);
4657 IRTemp op2 = newTemp(Ity_I64);
4658 IRTemp result = newTemp(Ity_I64);
4661 assign(result, mkU64(0));
4663 assign(op1, get_gpr_dw0(r1));
4664 assign(op2, get_gpr_dw0(r2));
4665 assign(result, binop(Iop_Xor64, mkexpr(op1), mkexpr(op2)));
4667 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4668 put_gpr_dw0(r1, mkexpr(result));
4674 s390_irgen_XRK(UChar r3, UChar r1, UChar r2)
4676 IRTemp op2 = newTemp(Ity_I32);
4677 IRTemp op3 = newTemp(Ity_I32);
4678 IRTemp result = newTemp(Ity_I32);
4680 assign(op2, get_gpr_w1(r2));
4681 assign(op3, get_gpr_w1(r3));
4682 assign(result, binop(Iop_Xor32, mkexpr(op2), mkexpr(op3)));
4683 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4684 put_gpr_w1(r1, mkexpr(result));
4690 s390_irgen_XGRK(UChar r3, UChar r1, UChar r2)
4692 IRTemp op2 = newTemp(Ity_I64);
4693 IRTemp op3 = newTemp(Ity_I64);
4694 IRTemp result = newTemp(Ity_I64);
4696 assign(op2, get_gpr_dw0(r2));
4697 assign(op3, get_gpr_dw0(r3));
4698 assign(result, binop(Iop_Xor64, mkexpr(op2), mkexpr(op3)));
4699 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4700 put_gpr_dw0(r1, mkexpr(result));
4706 s390_irgen_X(UChar r1, IRTemp op2addr)
4708 IRTemp op1 = newTemp(Ity_I32);
4709 IRTemp op2 = newTemp(Ity_I32);
4710 IRTemp result = newTemp(Ity_I32);
4712 assign(op1, get_gpr_w1(r1));
4713 assign(op2, load(Ity_I32, mkexpr(op2addr)));
4714 assign(result, binop(Iop_Xor32, mkexpr(op1), mkexpr(op2)));
4715 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4716 put_gpr_w1(r1, mkexpr(result));
4722 s390_irgen_XY(UChar r1, IRTemp op2addr)
4724 IRTemp op1 = newTemp(Ity_I32);
4725 IRTemp op2 = newTemp(Ity_I32);
4726 IRTemp result = newTemp(Ity_I32);
4728 assign(op1, get_gpr_w1(r1));
4729 assign(op2, load(Ity_I32, mkexpr(op2addr)));
4730 assign(result, binop(Iop_Xor32, mkexpr(op1), mkexpr(op2)));
4731 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4732 put_gpr_w1(r1, mkexpr(result));
4738 s390_irgen_XG(UChar r1, IRTemp op2addr)
4740 IRTemp op1 = newTemp(Ity_I64);
4741 IRTemp op2 = newTemp(Ity_I64);
4742 IRTemp result = newTemp(Ity_I64);
4744 assign(op1, get_gpr_dw0(r1));
4745 assign(op2, load(Ity_I64, mkexpr(op2addr)));
4746 assign(result, binop(Iop_Xor64, mkexpr(op1), mkexpr(op2)));
4747 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4748 put_gpr_dw0(r1, mkexpr(result));
4754 s390_irgen_XI(UChar i2, IRTemp op1addr)
4756 IRTemp op1 = newTemp(Ity_I8);
4758 IRTemp result = newTemp(Ity_I8);
4760 assign(op1, load(Ity_I8, mkexpr(op1addr)));
4762 assign(result, binop(Iop_Xor8, mkexpr(op1), mkU8(op2)));
4763 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4764 store(mkexpr(op1addr), mkexpr(result));
4770 s390_irgen_XIY(UChar i2, IRTemp op1addr)
4772 IRTemp op1 = newTemp(Ity_I8);
4774 IRTemp result = newTemp(Ity_I8);
4776 assign(op1, load(Ity_I8, mkexpr(op1addr)));
4778 assign(result, binop(Iop_Xor8, mkexpr(op1), mkU8(op2)));
4779 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4780 store(mkexpr(op1addr), mkexpr(result));
4786 s390_irgen_XIHF(UChar r1, UInt i2)
4788 IRTemp op1 = newTemp(Ity_I32);
4790 IRTemp result = newTemp(Ity_I32);
4792 assign(op1, get_gpr_w0(r1));
4794 assign(result, binop(Iop_Xor32, mkexpr(op1), mkU32(op2)));
4795 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4796 put_gpr_w0(r1, mkexpr(result));
4802 s390_irgen_XILF(UChar r1, UInt i2)
4804 IRTemp op1 = newTemp(Ity_I32);
4806 IRTemp result = newTemp(Ity_I32);
4808 assign(op1, get_gpr_w1(r1));
4810 assign(result, binop(Iop_Xor32, mkexpr(op1), mkU32(op2)));
4811 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
4812 put_gpr_w1(r1, mkexpr(result));
4818 s390_irgen_EAR(UChar r1, UChar r2)
4820 put_gpr_w1(r1, get_ar_w0(r2));
4821 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
4822 s390_disasm(ENC3(MNM, GPR, AR), "ear", r1, r2);
4828 s390_irgen_IC(UChar r1, IRTemp op2addr)
4830 put_gpr_b7(r1, load(Ity_I8, mkexpr(op2addr)));
4836 s390_irgen_ICY(UChar r1, IRTemp op2addr)
4838 put_gpr_b7(r1, load(Ity_I8, mkexpr(op2addr)));
4844 s390_irgen_ICM(UChar r1, UChar r3, IRTemp op2addr)
4847 IRTemp result = newTemp(Ity_I32);
4852 if ((mask & 8) != 0) {
4853 put_gpr_b4(r1, load(Ity_I8, mkexpr(op2addr)));
4856 if ((mask & 4) != 0) {
4857 put_gpr_b5(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
4861 if ((mask & 2) != 0) {
4862 put_gpr_b6(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
4866 if ((mask & 1) != 0) {
4867 put_gpr_b7(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
4871 assign(result, get_gpr_w1(r1));
4872 s390_cc_thunk_putZZ(S390_CC_OP_INSERT_CHAR_MASK_32, result, mktemp(Ity_I32,
4879 s390_irgen_ICMY(UChar r1, UChar r3, IRTemp op2addr)
4882 IRTemp result = newTemp(Ity_I32);
4887 if ((mask & 8) != 0) {
4888 put_gpr_b4(r1, load(Ity_I8, mkexpr(op2addr)));
4891 if ((mask & 4) != 0) {
4892 put_gpr_b5(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
4896 if ((mask & 2) != 0) {
4897 put_gpr_b6(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
4901 if ((mask & 1) != 0) {
4902 put_gpr_b7(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
4906 assign(result, get_gpr_w1(r1));
4907 s390_cc_thunk_putZZ(S390_CC_OP_INSERT_CHAR_MASK_32, result, mktemp(Ity_I32,
4914 s390_irgen_ICMH(UChar r1, UChar r3, IRTemp op2addr)
4917 IRTemp result = newTemp(Ity_I32);
4922 if ((mask & 8) != 0) {
4923 put_gpr_b0(r1, load(Ity_I8, mkexpr(op2addr)));
4926 if ((mask & 4) != 0) {
4927 put_gpr_b1(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
4931 if ((mask & 2) != 0) {
4932 put_gpr_b2(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
4936 if ((mask & 1) != 0) {
4937 put_gpr_b3(r1, load(Ity_I8, binop(Iop_Add64, mkexpr(op2addr), mkU64(n))));
4941 assign(result, get_gpr_w0(r1));
4942 s390_cc_thunk_putZZ(S390_CC_OP_INSERT_CHAR_MASK_32, result, mktemp(Ity_I32,
4949 s390_irgen_IIHF(UChar r1, UInt i2)
4951 put_gpr_w0(r1, mkU32(i2));
4957 s390_irgen_IIHH(UChar r1, UShort i2)
4959 put_gpr_hw0(r1, mkU16(i2));
4965 s390_irgen_IIHL(UChar r1, UShort i2)
4967 put_gpr_hw1(r1, mkU16(i2));
4973 s390_irgen_IILF(UChar r1, UInt i2)
4975 put_gpr_w1(r1, mkU32(i2));
4981 s390_irgen_IILH(UChar r1, UShort i2)
4983 put_gpr_hw2(r1, mkU16(i2));
4989 s390_irgen_IILL(UChar r1, UShort i2)
4991 put_gpr_hw3(r1, mkU16(i2));
4997 s390_irgen_LR(UChar r1, UChar r2)
4999 put_gpr_w1(r1, get_gpr_w1(r2));
5005 s390_irgen_LGR(UChar r1, UChar r2)
5007 put_gpr_dw0(r1, get_gpr_dw0(r2));
5013 s390_irgen_LGFR(UChar r1, UChar r2)
5015 put_gpr_dw0(r1, unop(Iop_32Sto64, get_gpr_w1(r2)));
5021 s390_irgen_L(UChar r1, IRTemp op2addr)
5023 put_gpr_w1(r1, load(Ity_I32, mkexpr(op2addr)));
5029 s390_irgen_LY(UChar r1, IRTemp op2addr)
5031 put_gpr_w1(r1, load(Ity_I32, mkexpr(op2addr)));
5037 s390_irgen_LG(UChar r1, IRTemp op2addr)
5039 put_gpr_dw0(r1, load(Ity_I64, mkexpr(op2addr)));
5045 s390_irgen_LGF(UChar r1, IRTemp op2addr)
5047 put_gpr_dw0(r1, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
5053 s390_irgen_LGFI(UChar r1, UInt i2)
5055 put_gpr_dw0(r1, mkU64((ULong)(Long)(Int)i2));
5061 s390_irgen_LRL(UChar r1, UInt i2)
5063 put_gpr_w1(r1, load(Ity_I32, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
5070 s390_irgen_LGRL(UChar r1, UInt i2)
5072 put_gpr_dw0(r1, load(Ity_I64, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)
5079 s390_irgen_LGFRL(UChar r1, UInt i2)
5081 put_gpr_dw0(r1, unop(Iop_32Sto64, load(Ity_I32, mkU64(guest_IA_curr_instr +
5082 ((ULong)(Long)(Int)i2 << 1)))));
5088 s390_irgen_LA(UChar r1, IRTemp op2addr)
5090 put_gpr_dw0(r1, mkexpr(op2addr));
5096 s390_irgen_LAY(UChar r1, IRTemp op2addr)
5098 put_gpr_dw0(r1, mkexpr(op2addr));
5104 s390_irgen_LAE(UChar r1, IRTemp op2addr)
5106 put_gpr_dw0(r1, mkexpr(op2addr));
5112 s390_irgen_LAEY(UChar r1, IRTemp op2addr)
5114 put_gpr_dw0(r1, mkexpr(op2addr));
5120 s390_irgen_LARL(UChar r1, UInt i2)
5122 put_gpr_dw0(r1, mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1)));
5128 s390_irgen_LAA(UChar r1, UChar r3, IRTemp op2addr)
5130 IRTemp op2 = newTemp(Ity_I32);
5131 IRTemp op3 = newTemp(Ity_I32);
5132 IRTemp result = newTemp(Ity_I32);
5134 assign(op2, load(Ity_I32, mkexpr(op2addr)));
5135 assign(op3, get_gpr_w1(r3));
5136 assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
5137 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_32, op2, op3);
5138 store(mkexpr(op2addr), mkexpr(result));
5139 put_gpr_w1(r1, mkexpr(op2));
5145 s390_irgen_LAAG(UChar r1, UChar r3, IRTemp op2addr)
5147 IRTemp op2 = newTemp(Ity_I64);
5148 IRTemp op3 = newTemp(Ity_I64);
5149 IRTemp result = newTemp(Ity_I64);
5151 assign(op2, load(Ity_I64, mkexpr(op2addr)));
5152 assign(op3, get_gpr_dw0(r3));
5153 assign(result, binop(Iop_Add64, mkexpr(op2), mkexpr(op3)));
5154 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_ADD_64, op2, op3);
5155 store(mkexpr(op2addr), mkexpr(result));
5156 put_gpr_dw0(r1, mkexpr(op2));
5162 s390_irgen_LAAL(UChar r1, UChar r3, IRTemp op2addr)
5164 IRTemp op2 = newTemp(Ity_I32);
5165 IRTemp op3 = newTemp(Ity_I32);
5166 IRTemp result = newTemp(Ity_I32);
5168 assign(op2, load(Ity_I32, mkexpr(op2addr)));
5169 assign(op3, get_gpr_w1(r3));
5170 assign(result, binop(Iop_Add32, mkexpr(op2), mkexpr(op3)));
5171 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_32, op2, op3);
5172 store(mkexpr(op2addr), mkexpr(result));
5173 put_gpr_w1(r1, mkexpr(op2));
5179 s390_irgen_LAALG(UChar r1, UChar r3, IRTemp op2addr)
5181 IRTemp op2 = newTemp(Ity_I64);
5182 IRTemp op3 = newTemp(Ity_I64);
5183 IRTemp result = newTemp(Ity_I64);
5185 assign(op2, load(Ity_I64, mkexpr(op2addr)));
5186 assign(op3, get_gpr_dw0(r3));
5187 assign(result, binop(Iop_Add64, mkexpr(op2), mkexpr(op3)));
5188 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_ADD_64, op2, op3);
5189 store(mkexpr(op2addr), mkexpr(result));
5190 put_gpr_dw0(r1, mkexpr(op2));
5196 s390_irgen_LAN(UChar r1, UChar r3, IRTemp op2addr)
5198 IRTemp op2 = newTemp(Ity_I32);
5199 IRTemp op3 = newTemp(Ity_I32);
5200 IRTemp result = newTemp(Ity_I32);
5202 assign(op2, load(Ity_I32, mkexpr(op2addr)));
5203 assign(op3, get_gpr_w1(r3));
5204 assign(result, binop(Iop_And32, mkexpr(op2), mkexpr(op3)));
5205 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5206 store(mkexpr(op2addr), mkexpr(result));
5207 put_gpr_w1(r1, mkexpr(op2));
5213 s390_irgen_LANG(UChar r1, UChar r3, IRTemp op2addr)
5215 IRTemp op2 = newTemp(Ity_I64);
5216 IRTemp op3 = newTemp(Ity_I64);
5217 IRTemp result = newTemp(Ity_I64);
5219 assign(op2, load(Ity_I64, mkexpr(op2addr)));
5220 assign(op3, get_gpr_dw0(r3));
5221 assign(result, binop(Iop_And64, mkexpr(op2), mkexpr(op3)));
5222 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5223 store(mkexpr(op2addr), mkexpr(result));
5224 put_gpr_dw0(r1, mkexpr(op2));
5230 s390_irgen_LAX(UChar r1, UChar r3, IRTemp op2addr)
5232 IRTemp op2 = newTemp(Ity_I32);
5233 IRTemp op3 = newTemp(Ity_I32);
5234 IRTemp result = newTemp(Ity_I32);
5236 assign(op2, load(Ity_I32, mkexpr(op2addr)));
5237 assign(op3, get_gpr_w1(r3));
5238 assign(result, binop(Iop_Xor32, mkexpr(op2), mkexpr(op3)));
5239 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5240 store(mkexpr(op2addr), mkexpr(result));
5241 put_gpr_w1(r1, mkexpr(op2));
5247 s390_irgen_LAXG(UChar r1, UChar r3, IRTemp op2addr)
5249 IRTemp op2 = newTemp(Ity_I64);
5250 IRTemp op3 = newTemp(Ity_I64);
5251 IRTemp result = newTemp(Ity_I64);
5253 assign(op2, load(Ity_I64, mkexpr(op2addr)));
5254 assign(op3, get_gpr_dw0(r3));
5255 assign(result, binop(Iop_Xor64, mkexpr(op2), mkexpr(op3)));
5256 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5257 store(mkexpr(op2addr), mkexpr(result));
5258 put_gpr_dw0(r1, mkexpr(op2));
5264 s390_irgen_LAO(UChar r1, UChar r3, IRTemp op2addr)
5266 IRTemp op2 = newTemp(Ity_I32);
5267 IRTemp op3 = newTemp(Ity_I32);
5268 IRTemp result = newTemp(Ity_I32);
5270 assign(op2, load(Ity_I32, mkexpr(op2addr)));
5271 assign(op3, get_gpr_w1(r3));
5272 assign(result, binop(Iop_Or32, mkexpr(op2), mkexpr(op3)));
5273 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5274 store(mkexpr(op2addr), mkexpr(result));
5275 put_gpr_w1(r1, mkexpr(op2));
5281 s390_irgen_LAOG(UChar r1, UChar r3, IRTemp op2addr)
5283 IRTemp op2 = newTemp(Ity_I64);
5284 IRTemp op3 = newTemp(Ity_I64);
5285 IRTemp result = newTemp(Ity_I64);
5287 assign(op2, load(Ity_I64, mkexpr(op2addr)));
5288 assign(op3, get_gpr_dw0(r3));
5289 assign(result, binop(Iop_Or64, mkexpr(op2), mkexpr(op3)));
5290 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
5291 store(mkexpr(op2addr), mkexpr(result));
5292 put_gpr_dw0(r1, mkexpr(op2));
5298 s390_irgen_LTR(UChar r1, UChar r2)
5300 IRTemp op2 = newTemp(Ity_I32);
5302 assign(op2, get_gpr_w1(r2));
5303 put_gpr_w1(r1, mkexpr(op2));
5304 s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5310 s390_irgen_LTGR(UChar r1, UChar r2)
5312 IRTemp op2 = newTemp(Ity_I64);
5314 assign(op2, get_gpr_dw0(r2));
5315 put_gpr_dw0(r1, mkexpr(op2));
5316 s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5322 s390_irgen_LTGFR(UChar r1, UChar r2)
5324 IRTemp op2 = newTemp(Ity_I64);
5326 assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
5327 put_gpr_dw0(r1, mkexpr(op2));
5328 s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5334 s390_irgen_LT(UChar r1, IRTemp op2addr)
5336 IRTemp op2 = newTemp(Ity_I32);
5338 assign(op2, load(Ity_I32, mkexpr(op2addr)));
5339 put_gpr_w1(r1, mkexpr(op2));
5340 s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5346 s390_irgen_LTG(UChar r1, IRTemp op2addr)
5348 IRTemp op2 = newTemp(Ity_I64);
5350 assign(op2, load(Ity_I64, mkexpr(op2addr)));
5351 put_gpr_dw0(r1, mkexpr(op2));
5352 s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5358 s390_irgen_LTGF(UChar r1, IRTemp op2addr)
5360 IRTemp op2 = newTemp(Ity_I64);
5362 assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
5363 put_gpr_dw0(r1, mkexpr(op2));
5364 s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
5370 s390_irgen_LBR(UChar r1, UChar r2)
5372 put_gpr_w1(r1, unop(Iop_8Sto32, get_gpr_b7(r2)));
5378 s390_irgen_LGBR(UChar r1, UChar r2)
5380 put_gpr_dw0(r1, unop(Iop_8Sto64, get_gpr_b7(r2)));
5386 s390_irgen_LB(UChar r1, IRTemp op2addr)
5388 put_gpr_w1(r1, unop(Iop_8Sto32, load(Ity_I8, mkexpr(op2addr))));
5394 s390_irgen_LGB(UChar r1, IRTemp op2addr)
5396 put_gpr_dw0(r1, unop(Iop_8Sto64, load(Ity_I8, mkexpr(op2addr))));
5402 s390_irgen_LBH(UChar r1, IRTemp op2addr)
5404 put_gpr_w0(r1, unop(Iop_8Sto32, load(Ity_I8, mkexpr(op2addr))));
5410 s390_irgen_LCR(UChar r1, UChar r2)
5413 IRTemp op2 = newTemp(Ity_I32);
5414 IRTemp result = newTemp(Ity_I32);
5417 assign(op2, get_gpr_w1(r2));
5418 assign(result, binop(Iop_Sub32, mkU32((UInt)op1), mkexpr(op2)));
5419 put_gpr_w1(r1, mkexpr(result));
5420 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, mktemp(Ity_I32, mkU32((UInt)
5427 s390_irgen_LCGR(UChar r1, UChar r2)
5430 IRTemp op2 = newTemp(Ity_I64);
5431 IRTemp result = newTemp(Ity_I64);
5434 assign(op2, get_gpr_dw0(r2));
5435 assign(result, binop(Iop_Sub64, mkU64((ULong)op1), mkexpr(op2)));
5436 put_gpr_dw0(r1, mkexpr(result));
5437 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, mktemp(Ity_I64, mkU64((ULong)
5444 s390_irgen_LCGFR(UChar r1, UChar r2)
5447 IRTemp op2 = newTemp(Ity_I64);
5448 IRTemp result = newTemp(Ity_I64);
5451 assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
5452 assign(result, binop(Iop_Sub64, mkU64((ULong)op1), mkexpr(op2)));
5453 put_gpr_dw0(r1, mkexpr(result));
5454 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, mktemp(Ity_I64, mkU64((ULong)
5461 s390_irgen_LHR(UChar r1, UChar r2)
5463 put_gpr_w1(r1, unop(Iop_16Sto32, get_gpr_hw3(r2)));
5469 s390_irgen_LGHR(UChar r1, UChar r2)
5471 put_gpr_dw0(r1, unop(Iop_16Sto64, get_gpr_hw3(r2)));
5477 s390_irgen_LH(UChar r1, IRTemp op2addr)
5479 put_gpr_w1(r1, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
5485 s390_irgen_LHY(UChar r1, IRTemp op2addr)
5487 put_gpr_w1(r1, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
5493 s390_irgen_LGH(UChar r1, IRTemp op2addr)
5495 put_gpr_dw0(r1, unop(Iop_16Sto64, load(Ity_I16, mkexpr(op2addr))));
5501 s390_irgen_LHI(UChar r1, UShort i2)
5503 put_gpr_w1(r1, mkU32((UInt)(Int)(Short)i2));
5509 s390_irgen_LGHI(UChar r1, UShort i2)
5511 put_gpr_dw0(r1, mkU64((ULong)(Long)(Short)i2));
5517 s390_irgen_LHRL(UChar r1, UInt i2)
5519 put_gpr_w1(r1, unop(Iop_16Sto32, load(Ity_I16, mkU64(guest_IA_curr_instr +
5520 ((ULong)(Long)(Int)i2 << 1)))));
5526 s390_irgen_LGHRL(UChar r1, UInt i2)
5528 put_gpr_dw0(r1, unop(Iop_16Sto64, load(Ity_I16, mkU64(guest_IA_curr_instr +
5529 ((ULong)(Long)(Int)i2 << 1)))));
5535 s390_irgen_LHH(UChar r1, IRTemp op2addr)
5537 put_gpr_w0(r1, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
5543 s390_irgen_LFH(UChar r1, IRTemp op2addr)
5545 put_gpr_w0(r1, load(Ity_I32, mkexpr(op2addr)));
5551 s390_irgen_LLGFR(UChar r1, UChar r2)
5553 put_gpr_dw0(r1, unop(Iop_32Uto64, get_gpr_w1(r2)));
5559 s390_irgen_LLGF(UChar r1, IRTemp op2addr)
5561 put_gpr_dw0(r1, unop(Iop_32Uto64, load(Ity_I32, mkexpr(op2addr))));
5567 s390_irgen_LLGFRL(UChar r1, UInt i2)
5569 put_gpr_dw0(r1, unop(Iop_32Uto64, load(Ity_I32, mkU64(guest_IA_curr_instr +
5570 ((ULong)(Long)(Int)i2 << 1)))));
5576 s390_irgen_LLCR(UChar r1, UChar r2)
5578 put_gpr_w1(r1, unop(Iop_8Uto32, get_gpr_b7(r2)));
5584 s390_irgen_LLGCR(UChar r1, UChar r2)
5586 put_gpr_dw0(r1, unop(Iop_8Uto64, get_gpr_b7(r2)));
5592 s390_irgen_LLC(UChar r1, IRTemp op2addr)
5594 put_gpr_w1(r1, unop(Iop_8Uto32, load(Ity_I8, mkexpr(op2addr))));
5600 s390_irgen_LLGC(UChar r1, IRTemp op2addr)
5602 put_gpr_dw0(r1, unop(Iop_8Uto64, load(Ity_I8, mkexpr(op2addr))));
5608 s390_irgen_LLCH(UChar r1, IRTemp op2addr)
5610 put_gpr_w0(r1, unop(Iop_8Uto32, load(Ity_I8, mkexpr(op2addr))));
5616 s390_irgen_LLHR(UChar r1, UChar r2)
5618 put_gpr_w1(r1, unop(Iop_16Uto32, get_gpr_hw3(r2)));
5624 s390_irgen_LLGHR(UChar r1, UChar r2)
5626 put_gpr_dw0(r1, unop(Iop_16Uto64, get_gpr_hw3(r2)));
5632 s390_irgen_LLH(UChar r1, IRTemp op2addr)
5634 put_gpr_w1(r1, unop(Iop_16Uto32, load(Ity_I16, mkexpr(op2addr))));
5640 s390_irgen_LLGH(UChar r1, IRTemp op2addr)
5642 put_gpr_dw0(r1, unop(Iop_16Uto64, load(Ity_I16, mkexpr(op2addr))));
5648 s390_irgen_LLHRL(UChar r1, UInt i2)
5650 put_gpr_w1(r1, unop(Iop_16Uto32, load(Ity_I16, mkU64(guest_IA_curr_instr +
5651 ((ULong)(Long)(Int)i2 << 1)))));
5657 s390_irgen_LLGHRL(UChar r1, UInt i2)
5659 put_gpr_dw0(r1, unop(Iop_16Uto64, load(Ity_I16, mkU64(guest_IA_curr_instr +
5660 ((ULong)(Long)(Int)i2 << 1)))));
5666 s390_irgen_LLHH(UChar r1, IRTemp op2addr)
5668 put_gpr_w0(r1, unop(Iop_16Uto32, load(Ity_I16, mkexpr(op2addr))));
5674 s390_irgen_LLIHF(UChar r1, UInt i2)
5676 put_gpr_dw0(r1, mkU64(((ULong)i2) << 32));
5682 s390_irgen_LLIHH(UChar r1, UShort i2)
5684 put_gpr_dw0(r1, mkU64(((ULong)i2) << 48));
5690 s390_irgen_LLIHL(UChar r1, UShort i2)
5692 put_gpr_dw0(r1, mkU64(((ULong)i2) << 32));
5698 s390_irgen_LLILF(UChar r1, UInt i2)
5700 put_gpr_dw0(r1, mkU64(i2));
5706 s390_irgen_LLILH(UChar r1, UShort i2)
5708 put_gpr_dw0(r1, mkU64(((ULong)i2) << 16));
5714 s390_irgen_LLILL(UChar r1, UShort i2)
5716 put_gpr_dw0(r1, mkU64(i2));
5722 s390_irgen_LLGTR(UChar r1, UChar r2)
5724 put_gpr_dw0(r1, unop(Iop_32Uto64, binop(Iop_And32, get_gpr_w1(r2),
5725 mkU32(2147483647))));
5731 s390_irgen_LLGT(UChar r1, IRTemp op2addr)
5733 put_gpr_dw0(r1, unop(Iop_32Uto64, binop(Iop_And32, load(Ity_I32,
5734 mkexpr(op2addr)), mkU32(2147483647))));
5740 s390_irgen_LNR(UChar r1, UChar r2)
5742 IRTemp op2 = newTemp(Ity_I32);
5743 IRTemp result = newTemp(Ity_I32);
5745 assign(op2, get_gpr_w1(r2));
5746 assign(result, mkite(binop(Iop_CmpLE32S, mkexpr(op2), mkU32(0)), mkexpr(op2),
5747 binop(Iop_Sub32, mkU32(0), mkexpr(op2))));
5748 put_gpr_w1(r1, mkexpr(result));
5749 s390_cc_thunk_putS(S390_CC_OP_BITWISE, result);
5755 s390_irgen_LNGR(UChar r1, UChar r2)
5757 IRTemp op2 = newTemp(Ity_I64);
5758 IRTemp result = newTemp(Ity_I64);
5760 assign(op2, get_gpr_dw0(r2));
5761 assign(result, mkite(binop(Iop_CmpLE64S, mkexpr(op2), mkU64(0)), mkexpr(op2),
5762 binop(Iop_Sub64, mkU64(0), mkexpr(op2))));
5763 put_gpr_dw0(r1, mkexpr(result));
5764 s390_cc_thunk_putS(S390_CC_OP_BITWISE, result);
5770 s390_irgen_LNGFR(UChar r1, UChar r2 __attribute__((unused)))
5772 IRTemp op2 = newTemp(Ity_I64);
5773 IRTemp result = newTemp(Ity_I64);
5775 assign(op2, unop(Iop_32Sto64, get_gpr_w1(r1)));
5776 assign(result, mkite(binop(Iop_CmpLE64S, mkexpr(op2), mkU64(0)), mkexpr(op2),
5777 binop(Iop_Sub64, mkU64(0), mkexpr(op2))));
5778 put_gpr_dw0(r1, mkexpr(result));
5779 s390_cc_thunk_putS(S390_CC_OP_BITWISE, result);
5785 s390_irgen_LOCR(UChar m3, UChar r1, UChar r2)
5787 if_condition_goto(binop(Iop_CmpEQ32, s390_call_calculate_cond(m3), mkU32(0)),
5788 guest_IA_next_instr);
5789 put_gpr_w1(r1, get_gpr_w1(r2));
5795 s390_irgen_LOCGR(UChar m3, UChar r1, UChar r2)
5797 if_condition_goto(binop(Iop_CmpEQ32, s390_call_calculate_cond(m3), mkU32(0)),
5798 guest_IA_next_instr);
5799 put_gpr_dw0(r1, get_gpr_dw0(r2));
5805 s390_irgen_LOC(UChar r1, IRTemp op2addr)
5807 /* condition is checked in format handler */
5808 put_gpr_w1(r1, load(Ity_I32, mkexpr(op2addr)));
5814 s390_irgen_LOCG(UChar r1, IRTemp op2addr)
5816 /* condition is checked in format handler */
5817 put_gpr_dw0(r1, load(Ity_I64, mkexpr(op2addr)));
5823 s390_irgen_LPQ(UChar r1, IRTemp op2addr)
5825 put_gpr_dw0(r1, load(Ity_I64, mkexpr(op2addr)));
5826 put_gpr_dw0(r1 + 1, load(Ity_I64, binop(Iop_Add64, mkexpr(op2addr), mkU64(8))
5833 s390_irgen_LPR(UChar r1, UChar r2)
5835 IRTemp op2 = newTemp(Ity_I32);
5836 IRTemp result = newTemp(Ity_I32);
5838 assign(op2, get_gpr_w1(r2));
5839 assign(result, mkite(binop(Iop_CmpLT32S, mkexpr(op2), mkU32(0)),
5840 binop(Iop_Sub32, mkU32(0), mkexpr(op2)), mkexpr(op2)));
5841 put_gpr_w1(r1, mkexpr(result));
5842 s390_cc_thunk_putS(S390_CC_OP_LOAD_POSITIVE_32, op2);
5848 s390_irgen_LPGR(UChar r1, UChar r2)
5850 IRTemp op2 = newTemp(Ity_I64);
5851 IRTemp result = newTemp(Ity_I64);
5853 assign(op2, get_gpr_dw0(r2));
5854 assign(result, mkite(binop(Iop_CmpLT64S, mkexpr(op2), mkU64(0)),
5855 binop(Iop_Sub64, mkU64(0), mkexpr(op2)), mkexpr(op2)));
5856 put_gpr_dw0(r1, mkexpr(result));
5857 s390_cc_thunk_putS(S390_CC_OP_LOAD_POSITIVE_64, op2);
5863 s390_irgen_LPGFR(UChar r1, UChar r2)
5865 IRTemp op2 = newTemp(Ity_I64);
5866 IRTemp result = newTemp(Ity_I64);
5868 assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
5869 assign(result, mkite(binop(Iop_CmpLT64S, mkexpr(op2), mkU64(0)),
5870 binop(Iop_Sub64, mkU64(0), mkexpr(op2)), mkexpr(op2)));
5871 put_gpr_dw0(r1, mkexpr(result));
5872 s390_cc_thunk_putS(S390_CC_OP_LOAD_POSITIVE_64, op2);
5878 s390_irgen_LRVR(UChar r1, UChar r2)
5880 IRTemp b0 = newTemp(Ity_I8);
5881 IRTemp b1 = newTemp(Ity_I8);
5882 IRTemp b2 = newTemp(Ity_I8);
5883 IRTemp b3 = newTemp(Ity_I8);
5885 assign(b3, get_gpr_b7(r2));
5886 assign(b2, get_gpr_b6(r2));
5887 assign(b1, get_gpr_b5(r2));
5888 assign(b0, get_gpr_b4(r2));
5889 put_gpr_b4(r1, mkexpr(b3));
5890 put_gpr_b5(r1, mkexpr(b2));
5891 put_gpr_b6(r1, mkexpr(b1));
5892 put_gpr_b7(r1, mkexpr(b0));
5898 s390_irgen_LRVGR(UChar r1, UChar r2)
5900 IRTemp b0 = newTemp(Ity_I8);
5901 IRTemp b1 = newTemp(Ity_I8);
5902 IRTemp b2 = newTemp(Ity_I8);
5903 IRTemp b3 = newTemp(Ity_I8);
5904 IRTemp b4 = newTemp(Ity_I8);
5905 IRTemp b5 = newTemp(Ity_I8);
5906 IRTemp b6 = newTemp(Ity_I8);
5907 IRTemp b7 = newTemp(Ity_I8);
5909 assign(b7, get_gpr_b7(r2));
5910 assign(b6, get_gpr_b6(r2));
5911 assign(b5, get_gpr_b5(r2));
5912 assign(b4, get_gpr_b4(r2));
5913 assign(b3, get_gpr_b3(r2));
5914 assign(b2, get_gpr_b2(r2));
5915 assign(b1, get_gpr_b1(r2));
5916 assign(b0, get_gpr_b0(r2));
5917 put_gpr_b0(r1, mkexpr(b7));
5918 put_gpr_b1(r1, mkexpr(b6));
5919 put_gpr_b2(r1, mkexpr(b5));
5920 put_gpr_b3(r1, mkexpr(b4));
5921 put_gpr_b4(r1, mkexpr(b3));
5922 put_gpr_b5(r1, mkexpr(b2));
5923 put_gpr_b6(r1, mkexpr(b1));
5924 put_gpr_b7(r1, mkexpr(b0));
5930 s390_irgen_LRVH(UChar r1, IRTemp op2addr)
5932 IRTemp op2 = newTemp(Ity_I16);
5934 assign(op2, load(Ity_I16, mkexpr(op2addr)));
5935 put_gpr_b6(r1, unop(Iop_16to8, mkexpr(op2)));
5936 put_gpr_b7(r1, unop(Iop_16HIto8, mkexpr(op2)));
5942 s390_irgen_LRV(UChar r1, IRTemp op2addr)
5944 IRTemp op2 = newTemp(Ity_I32);
5946 assign(op2, load(Ity_I32, mkexpr(op2addr)));
5947 put_gpr_b4(r1, unop(Iop_32to8, binop(Iop_And32, mkexpr(op2), mkU32(255))));
5948 put_gpr_b5(r1, unop(Iop_32to8, binop(Iop_And32, binop(Iop_Shr32, mkexpr(op2),
5949 mkU8(8)), mkU32(255))));
5950 put_gpr_b6(r1, unop(Iop_32to8, binop(Iop_And32, binop(Iop_Shr32, mkexpr(op2),
5951 mkU8(16)), mkU32(255))));
5952 put_gpr_b7(r1, unop(Iop_32to8, binop(Iop_And32, binop(Iop_Shr32, mkexpr(op2),
5953 mkU8(24)), mkU32(255))));
5959 s390_irgen_LRVG(UChar r1, IRTemp op2addr)
5961 IRTemp op2 = newTemp(Ity_I64);
5963 assign(op2, load(Ity_I64, mkexpr(op2addr)));
5964 put_gpr_b0(r1, unop(Iop_64to8, binop(Iop_And64, mkexpr(op2), mkU64(255))));
5965 put_gpr_b1(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
5966 mkU8(8)), mkU64(255))));
5967 put_gpr_b2(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
5968 mkU8(16)), mkU64(255))));
5969 put_gpr_b3(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
5970 mkU8(24)), mkU64(255))));
5971 put_gpr_b4(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
5972 mkU8(32)), mkU64(255))));
5973 put_gpr_b5(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
5974 mkU8(40)), mkU64(255))));
5975 put_gpr_b6(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
5976 mkU8(48)), mkU64(255))));
5977 put_gpr_b7(r1, unop(Iop_64to8, binop(Iop_And64, binop(Iop_Shr64, mkexpr(op2),
5978 mkU8(56)), mkU64(255))));
5984 s390_irgen_MVHHI(UShort i2, IRTemp op1addr)
5986 store(mkexpr(op1addr), mkU16(i2));
5992 s390_irgen_MVHI(UShort i2, IRTemp op1addr)
5994 store(mkexpr(op1addr), mkU32((UInt)(Int)(Short)i2));
6000 s390_irgen_MVGHI(UShort i2, IRTemp op1addr)
6002 store(mkexpr(op1addr), mkU64((ULong)(Long)(Short)i2));
6008 s390_irgen_MVI(UChar i2, IRTemp op1addr)
6010 store(mkexpr(op1addr), mkU8(i2));
6016 s390_irgen_MVIY(UChar i2, IRTemp op1addr)
6018 store(mkexpr(op1addr), mkU8(i2));
6024 s390_irgen_MR(UChar r1, UChar r2)
6026 IRTemp op1 = newTemp(Ity_I32);
6027 IRTemp op2 = newTemp(Ity_I32);
6028 IRTemp result = newTemp(Ity_I64);
6030 assign(op1, get_gpr_w1(r1 + 1));
6031 assign(op2, get_gpr_w1(r2));
6032 assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6033 put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6034 put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6040 s390_irgen_M(UChar r1, IRTemp op2addr)
6042 IRTemp op1 = newTemp(Ity_I32);
6043 IRTemp op2 = newTemp(Ity_I32);
6044 IRTemp result = newTemp(Ity_I64);
6046 assign(op1, get_gpr_w1(r1 + 1));
6047 assign(op2, load(Ity_I32, mkexpr(op2addr)));
6048 assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6049 put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6050 put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6056 s390_irgen_MFY(UChar r1, IRTemp op2addr)
6058 IRTemp op1 = newTemp(Ity_I32);
6059 IRTemp op2 = newTemp(Ity_I32);
6060 IRTemp result = newTemp(Ity_I64);
6062 assign(op1, get_gpr_w1(r1 + 1));
6063 assign(op2, load(Ity_I32, mkexpr(op2addr)));
6064 assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6065 put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6066 put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6072 s390_irgen_MH(UChar r1, IRTemp op2addr)
6074 IRTemp op1 = newTemp(Ity_I32);
6075 IRTemp op2 = newTemp(Ity_I16);
6076 IRTemp result = newTemp(Ity_I64);
6078 assign(op1, get_gpr_w1(r1));
6079 assign(op2, load(Ity_I16, mkexpr(op2addr)));
6080 assign(result, binop(Iop_MullS32, mkexpr(op1), unop(Iop_16Sto32, mkexpr(op2))
6082 put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6088 s390_irgen_MHY(UChar r1, IRTemp op2addr)
6090 IRTemp op1 = newTemp(Ity_I32);
6091 IRTemp op2 = newTemp(Ity_I16);
6092 IRTemp result = newTemp(Ity_I64);
6094 assign(op1, get_gpr_w1(r1));
6095 assign(op2, load(Ity_I16, mkexpr(op2addr)));
6096 assign(result, binop(Iop_MullS32, mkexpr(op1), unop(Iop_16Sto32, mkexpr(op2))
6098 put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6104 s390_irgen_MHI(UChar r1, UShort i2)
6106 IRTemp op1 = newTemp(Ity_I32);
6108 IRTemp result = newTemp(Ity_I64);
6110 assign(op1, get_gpr_w1(r1));
6112 assign(result, binop(Iop_MullS32, mkexpr(op1), unop(Iop_16Sto32,
6113 mkU16((UShort)op2))));
6114 put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6120 s390_irgen_MGHI(UChar r1, UShort i2)
6122 IRTemp op1 = newTemp(Ity_I64);
6124 IRTemp result = newTemp(Ity_I128);
6126 assign(op1, get_gpr_dw0(r1));
6128 assign(result, binop(Iop_MullS64, mkexpr(op1), unop(Iop_16Sto64,
6129 mkU16((UShort)op2))));
6130 put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6136 s390_irgen_MLR(UChar r1, UChar r2)
6138 IRTemp op1 = newTemp(Ity_I32);
6139 IRTemp op2 = newTemp(Ity_I32);
6140 IRTemp result = newTemp(Ity_I64);
6142 assign(op1, get_gpr_w1(r1 + 1));
6143 assign(op2, get_gpr_w1(r2));
6144 assign(result, binop(Iop_MullU32, mkexpr(op1), mkexpr(op2)));
6145 put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6146 put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6152 s390_irgen_MLGR(UChar r1, UChar r2)
6154 IRTemp op1 = newTemp(Ity_I64);
6155 IRTemp op2 = newTemp(Ity_I64);
6156 IRTemp result = newTemp(Ity_I128);
6158 assign(op1, get_gpr_dw0(r1 + 1));
6159 assign(op2, get_gpr_dw0(r2));
6160 assign(result, binop(Iop_MullU64, mkexpr(op1), mkexpr(op2)));
6161 put_gpr_dw0(r1, unop(Iop_128HIto64, mkexpr(result)));
6162 put_gpr_dw0(r1 + 1, unop(Iop_128to64, mkexpr(result)));
6168 s390_irgen_ML(UChar r1, IRTemp op2addr)
6170 IRTemp op1 = newTemp(Ity_I32);
6171 IRTemp op2 = newTemp(Ity_I32);
6172 IRTemp result = newTemp(Ity_I64);
6174 assign(op1, get_gpr_w1(r1 + 1));
6175 assign(op2, load(Ity_I32, mkexpr(op2addr)));
6176 assign(result, binop(Iop_MullU32, mkexpr(op1), mkexpr(op2)));
6177 put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6178 put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6184 s390_irgen_MLG(UChar r1, IRTemp op2addr)
6186 IRTemp op1 = newTemp(Ity_I64);
6187 IRTemp op2 = newTemp(Ity_I64);
6188 IRTemp result = newTemp(Ity_I128);
6190 assign(op1, get_gpr_dw0(r1 + 1));
6191 assign(op2, load(Ity_I64, mkexpr(op2addr)));
6192 assign(result, binop(Iop_MullU64, mkexpr(op1), mkexpr(op2)));
6193 put_gpr_dw0(r1, unop(Iop_128HIto64, mkexpr(result)));
6194 put_gpr_dw0(r1 + 1, unop(Iop_128to64, mkexpr(result)));
6200 s390_irgen_MSR(UChar r1, UChar r2)
6202 IRTemp op1 = newTemp(Ity_I32);
6203 IRTemp op2 = newTemp(Ity_I32);
6204 IRTemp result = newTemp(Ity_I64);
6206 assign(op1, get_gpr_w1(r1));
6207 assign(op2, get_gpr_w1(r2));
6208 assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6209 put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6215 s390_irgen_MSGR(UChar r1, UChar r2)
6217 IRTemp op1 = newTemp(Ity_I64);
6218 IRTemp op2 = newTemp(Ity_I64);
6219 IRTemp result = newTemp(Ity_I128);
6221 assign(op1, get_gpr_dw0(r1));
6222 assign(op2, get_gpr_dw0(r2));
6223 assign(result, binop(Iop_MullS64, mkexpr(op1), mkexpr(op2)));
6224 put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6230 s390_irgen_MSGFR(UChar r1, UChar r2)
6232 IRTemp op1 = newTemp(Ity_I64);
6233 IRTemp op2 = newTemp(Ity_I32);
6234 IRTemp result = newTemp(Ity_I128);
6236 assign(op1, get_gpr_dw0(r1));
6237 assign(op2, get_gpr_w1(r2));
6238 assign(result, binop(Iop_MullS64, mkexpr(op1), unop(Iop_32Sto64, mkexpr(op2))
6240 put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6246 s390_irgen_MS(UChar r1, IRTemp op2addr)
6248 IRTemp op1 = newTemp(Ity_I32);
6249 IRTemp op2 = newTemp(Ity_I32);
6250 IRTemp result = newTemp(Ity_I64);
6252 assign(op1, get_gpr_w1(r1));
6253 assign(op2, load(Ity_I32, mkexpr(op2addr)));
6254 assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6255 put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6261 s390_irgen_MSY(UChar r1, IRTemp op2addr)
6263 IRTemp op1 = newTemp(Ity_I32);
6264 IRTemp op2 = newTemp(Ity_I32);
6265 IRTemp result = newTemp(Ity_I64);
6267 assign(op1, get_gpr_w1(r1));
6268 assign(op2, load(Ity_I32, mkexpr(op2addr)));
6269 assign(result, binop(Iop_MullS32, mkexpr(op1), mkexpr(op2)));
6270 put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6276 s390_irgen_MSG(UChar r1, IRTemp op2addr)
6278 IRTemp op1 = newTemp(Ity_I64);
6279 IRTemp op2 = newTemp(Ity_I64);
6280 IRTemp result = newTemp(Ity_I128);
6282 assign(op1, get_gpr_dw0(r1));
6283 assign(op2, load(Ity_I64, mkexpr(op2addr)));
6284 assign(result, binop(Iop_MullS64, mkexpr(op1), mkexpr(op2)));
6285 put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6291 s390_irgen_MSGF(UChar r1, IRTemp op2addr)
6293 IRTemp op1 = newTemp(Ity_I64);
6294 IRTemp op2 = newTemp(Ity_I32);
6295 IRTemp result = newTemp(Ity_I128);
6297 assign(op1, get_gpr_dw0(r1));
6298 assign(op2, load(Ity_I32, mkexpr(op2addr)));
6299 assign(result, binop(Iop_MullS64, mkexpr(op1), unop(Iop_32Sto64, mkexpr(op2))
6301 put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6307 s390_irgen_MSFI(UChar r1, UInt i2)
6309 IRTemp op1 = newTemp(Ity_I32);
6311 IRTemp result = newTemp(Ity_I64);
6313 assign(op1, get_gpr_w1(r1));
6315 assign(result, binop(Iop_MullS32, mkexpr(op1), mkU32((UInt)op2)));
6316 put_gpr_w1(r1, unop(Iop_64to32, mkexpr(result)));
6322 s390_irgen_MSGFI(UChar r1, UInt i2)
6324 IRTemp op1 = newTemp(Ity_I64);
6326 IRTemp result = newTemp(Ity_I128);
6328 assign(op1, get_gpr_dw0(r1));
6330 assign(result, binop(Iop_MullS64, mkexpr(op1), unop(Iop_32Sto64, mkU32((UInt)
6332 put_gpr_dw0(r1, unop(Iop_128to64, mkexpr(result)));
6338 s390_irgen_OR(UChar r1, UChar r2)
6340 IRTemp op1 = newTemp(Ity_I32);
6341 IRTemp op2 = newTemp(Ity_I32);
6342 IRTemp result = newTemp(Ity_I32);
6344 assign(op1, get_gpr_w1(r1));
6345 assign(op2, get_gpr_w1(r2));
6346 assign(result, binop(Iop_Or32, mkexpr(op1), mkexpr(op2)));
6347 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6348 put_gpr_w1(r1, mkexpr(result));
6354 s390_irgen_OGR(UChar r1, UChar r2)
6356 IRTemp op1 = newTemp(Ity_I64);
6357 IRTemp op2 = newTemp(Ity_I64);
6358 IRTemp result = newTemp(Ity_I64);
6360 assign(op1, get_gpr_dw0(r1));
6361 assign(op2, get_gpr_dw0(r2));
6362 assign(result, binop(Iop_Or64, mkexpr(op1), mkexpr(op2)));
6363 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6364 put_gpr_dw0(r1, mkexpr(result));
6370 s390_irgen_ORK(UChar r3, UChar r1, UChar r2)
6372 IRTemp op2 = newTemp(Ity_I32);
6373 IRTemp op3 = newTemp(Ity_I32);
6374 IRTemp result = newTemp(Ity_I32);
6376 assign(op2, get_gpr_w1(r2));
6377 assign(op3, get_gpr_w1(r3));
6378 assign(result, binop(Iop_Or32, mkexpr(op2), mkexpr(op3)));
6379 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6380 put_gpr_w1(r1, mkexpr(result));
6386 s390_irgen_OGRK(UChar r3, UChar r1, UChar r2)
6388 IRTemp op2 = newTemp(Ity_I64);
6389 IRTemp op3 = newTemp(Ity_I64);
6390 IRTemp result = newTemp(Ity_I64);
6392 assign(op2, get_gpr_dw0(r2));
6393 assign(op3, get_gpr_dw0(r3));
6394 assign(result, binop(Iop_Or64, mkexpr(op2), mkexpr(op3)));
6395 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6396 put_gpr_dw0(r1, mkexpr(result));
6402 s390_irgen_O(UChar r1, IRTemp op2addr)
6404 IRTemp op1 = newTemp(Ity_I32);
6405 IRTemp op2 = newTemp(Ity_I32);
6406 IRTemp result = newTemp(Ity_I32);
6408 assign(op1, get_gpr_w1(r1));
6409 assign(op2, load(Ity_I32, mkexpr(op2addr)));
6410 assign(result, binop(Iop_Or32, mkexpr(op1), mkexpr(op2)));
6411 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6412 put_gpr_w1(r1, mkexpr(result));
6418 s390_irgen_OY(UChar r1, IRTemp op2addr)
6420 IRTemp op1 = newTemp(Ity_I32);
6421 IRTemp op2 = newTemp(Ity_I32);
6422 IRTemp result = newTemp(Ity_I32);
6424 assign(op1, get_gpr_w1(r1));
6425 assign(op2, load(Ity_I32, mkexpr(op2addr)));
6426 assign(result, binop(Iop_Or32, mkexpr(op1), mkexpr(op2)));
6427 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6428 put_gpr_w1(r1, mkexpr(result));
6434 s390_irgen_OG(UChar r1, IRTemp op2addr)
6436 IRTemp op1 = newTemp(Ity_I64);
6437 IRTemp op2 = newTemp(Ity_I64);
6438 IRTemp result = newTemp(Ity_I64);
6440 assign(op1, get_gpr_dw0(r1));
6441 assign(op2, load(Ity_I64, mkexpr(op2addr)));
6442 assign(result, binop(Iop_Or64, mkexpr(op1), mkexpr(op2)));
6443 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6444 put_gpr_dw0(r1, mkexpr(result));
6450 s390_irgen_OI(UChar i2, IRTemp op1addr)
6452 IRTemp op1 = newTemp(Ity_I8);
6454 IRTemp result = newTemp(Ity_I8);
6456 assign(op1, load(Ity_I8, mkexpr(op1addr)));
6458 assign(result, binop(Iop_Or8, mkexpr(op1), mkU8(op2)));
6459 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6460 store(mkexpr(op1addr), mkexpr(result));
6466 s390_irgen_OIY(UChar i2, IRTemp op1addr)
6468 IRTemp op1 = newTemp(Ity_I8);
6470 IRTemp result = newTemp(Ity_I8);
6472 assign(op1, load(Ity_I8, mkexpr(op1addr)));
6474 assign(result, binop(Iop_Or8, mkexpr(op1), mkU8(op2)));
6475 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6476 store(mkexpr(op1addr), mkexpr(result));
6482 s390_irgen_OIHF(UChar r1, UInt i2)
6484 IRTemp op1 = newTemp(Ity_I32);
6486 IRTemp result = newTemp(Ity_I32);
6488 assign(op1, get_gpr_w0(r1));
6490 assign(result, binop(Iop_Or32, mkexpr(op1), mkU32(op2)));
6491 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6492 put_gpr_w0(r1, mkexpr(result));
6498 s390_irgen_OIHH(UChar r1, UShort i2)
6500 IRTemp op1 = newTemp(Ity_I16);
6502 IRTemp result = newTemp(Ity_I16);
6504 assign(op1, get_gpr_hw0(r1));
6506 assign(result, binop(Iop_Or16, mkexpr(op1), mkU16(op2)));
6507 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6508 put_gpr_hw0(r1, mkexpr(result));
6514 s390_irgen_OIHL(UChar r1, UShort i2)
6516 IRTemp op1 = newTemp(Ity_I16);
6518 IRTemp result = newTemp(Ity_I16);
6520 assign(op1, get_gpr_hw1(r1));
6522 assign(result, binop(Iop_Or16, mkexpr(op1), mkU16(op2)));
6523 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6524 put_gpr_hw1(r1, mkexpr(result));
6530 s390_irgen_OILF(UChar r1, UInt i2)
6532 IRTemp op1 = newTemp(Ity_I32);
6534 IRTemp result = newTemp(Ity_I32);
6536 assign(op1, get_gpr_w1(r1));
6538 assign(result, binop(Iop_Or32, mkexpr(op1), mkU32(op2)));
6539 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6540 put_gpr_w1(r1, mkexpr(result));
6546 s390_irgen_OILH(UChar r1, UShort i2)
6548 IRTemp op1 = newTemp(Ity_I16);
6550 IRTemp result = newTemp(Ity_I16);
6552 assign(op1, get_gpr_hw2(r1));
6554 assign(result, binop(Iop_Or16, mkexpr(op1), mkU16(op2)));
6555 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6556 put_gpr_hw2(r1, mkexpr(result));
6562 s390_irgen_OILL(UChar r1, UShort i2)
6564 IRTemp op1 = newTemp(Ity_I16);
6566 IRTemp result = newTemp(Ity_I16);
6568 assign(op1, get_gpr_hw3(r1));
6570 assign(result, binop(Iop_Or16, mkexpr(op1), mkU16(op2)));
6571 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6572 put_gpr_hw3(r1, mkexpr(result));
6578 s390_irgen_PFD(void)
6585 s390_irgen_PFDRL(void)
6592 s390_irgen_RLL(UChar r1, UChar r3, IRTemp op2addr)
6594 IRTemp amount = newTemp(Ity_I64);
6595 IRTemp op = newTemp(Ity_I32);
6597 assign(amount, binop(Iop_And64, mkexpr(op2addr), mkU64(31)));
6598 assign(op, get_gpr_w1(r3));
6599 put_gpr_w1(r1, binop(Iop_Or32, binop(Iop_Shl32, mkexpr(op), unop(Iop_64to8,
6600 mkexpr(amount))), binop(Iop_Shr32, mkexpr(op), unop(Iop_64to8,
6601 binop(Iop_Sub64, mkU64(32), mkexpr(amount))))));
6607 s390_irgen_RLLG(UChar r1, UChar r3, IRTemp op2addr)
6609 IRTemp amount = newTemp(Ity_I64);
6610 IRTemp op = newTemp(Ity_I64);
6612 assign(amount, binop(Iop_And64, mkexpr(op2addr), mkU64(63)));
6613 assign(op, get_gpr_dw0(r3));
6614 put_gpr_dw0(r1, binop(Iop_Or64, binop(Iop_Shl64, mkexpr(op), unop(Iop_64to8,
6615 mkexpr(amount))), binop(Iop_Shr64, mkexpr(op), unop(Iop_64to8,
6616 binop(Iop_Sub64, mkU64(64), mkexpr(amount))))));
6622 s390_irgen_RNSBG(UChar r1, UChar r2, UChar i3, UChar i4, UChar i5)
6630 IRTemp result = newTemp(Ity_I64);
6631 IRTemp op2 = newTemp(Ity_I64);
6637 assign(op2, rot == 0 ? get_gpr_dw0(r2) : binop(Iop_Or64, binop(Iop_Shl64,
6638 get_gpr_dw0(r2), mkU8(rot)), binop(Iop_Shr64, get_gpr_dw0(r2),
6642 mask = (mask >> from) & (mask << (63 - to));
6646 maskc = (maskc >> (to + 1)) & (maskc << (64 - from));
6649 assign(result, binop(Iop_And64, binop(Iop_And64, get_gpr_dw0(r1), mkexpr(op2)
6652 put_gpr_dw0(r1, binop(Iop_Or64, binop(Iop_And64, get_gpr_dw0(r1),
6653 mkU64(maskc)), mkexpr(result)));
6655 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6661 s390_irgen_RXSBG(UChar r1, UChar r2, UChar i3, UChar i4, UChar i5)
6669 IRTemp result = newTemp(Ity_I64);
6670 IRTemp op2 = newTemp(Ity_I64);
6676 assign(op2, rot == 0 ? get_gpr_dw0(r2) : binop(Iop_Or64, binop(Iop_Shl64,
6677 get_gpr_dw0(r2), mkU8(rot)), binop(Iop_Shr64, get_gpr_dw0(r2),
6681 mask = (mask >> from) & (mask << (63 - to));
6685 maskc = (maskc >> (to + 1)) & (maskc << (64 - from));
6688 assign(result, binop(Iop_And64, binop(Iop_Xor64, get_gpr_dw0(r1), mkexpr(op2)
6691 put_gpr_dw0(r1, binop(Iop_Or64, binop(Iop_And64, get_gpr_dw0(r1),
6692 mkU64(maskc)), mkexpr(result)));
6694 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6700 s390_irgen_ROSBG(UChar r1, UChar r2, UChar i3, UChar i4, UChar i5)
6708 IRTemp result = newTemp(Ity_I64);
6709 IRTemp op2 = newTemp(Ity_I64);
6715 assign(op2, rot == 0 ? get_gpr_dw0(r2) : binop(Iop_Or64, binop(Iop_Shl64,
6716 get_gpr_dw0(r2), mkU8(rot)), binop(Iop_Shr64, get_gpr_dw0(r2),
6720 mask = (mask >> from) & (mask << (63 - to));
6724 maskc = (maskc >> (to + 1)) & (maskc << (64 - from));
6727 assign(result, binop(Iop_And64, binop(Iop_Or64, get_gpr_dw0(r1), mkexpr(op2)
6730 put_gpr_dw0(r1, binop(Iop_Or64, binop(Iop_And64, get_gpr_dw0(r1),
6731 mkU64(maskc)), mkexpr(result)));
6733 s390_cc_thunk_putZ(S390_CC_OP_BITWISE, result);
6739 s390_irgen_RISBG(UChar r1, UChar r2, UChar i3, UChar i4, UChar i5)
6747 IRTemp op2 = newTemp(Ity_I64);
6748 IRTemp result = newTemp(Ity_I64);
6754 assign(op2, rot == 0 ? get_gpr_dw0(r2) : binop(Iop_Or64, binop(Iop_Shl64,
6755 get_gpr_dw0(r2), mkU8(rot)), binop(Iop_Shr64, get_gpr_dw0(r2),
6759 mask = (mask >> from) & (mask << (63 - to));
6763 maskc = (maskc >> (to + 1)) & (maskc << (64 - from));
6767 put_gpr_dw0(r1, binop(Iop_Or64, binop(Iop_And64, get_gpr_dw0(r1),
6768 mkU64(maskc)), binop(Iop_And64, mkexpr(op2), mkU64(mask))));
6770 put_gpr_dw0(r1, binop(Iop_And64, mkexpr(op2), mkU64(mask)));
6772 assign(result, get_gpr_dw0(r1));
6773 s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, op2);
6779 s390_irgen_SAR(UChar r1, UChar r2)
6781 put_ar_w0(r1, get_gpr_w1(r2));
6782 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
6783 s390_disasm(ENC3(MNM, AR, GPR), "sar", r1, r2);
6789 s390_irgen_SLDA(UChar r1, IRTemp op2addr)
6791 IRTemp p1 = newTemp(Ity_I64);
6792 IRTemp p2 = newTemp(Ity_I64);
6793 IRTemp op = newTemp(Ity_I64);
6794 IRTemp result = newTemp(Ity_I64);
6796 IRTemp shift_amount = newTemp(Ity_I64);
6798 assign(p1, unop(Iop_32Uto64, get_gpr_w1(r1)));
6799 assign(p2, unop(Iop_32Uto64, get_gpr_w1(r1 + 1)));
6800 assign(op, binop(Iop_Or64, binop(Iop_Shl64, mkexpr(p1), mkU8(32)), mkexpr(p2)
6802 sign_mask = 1ULL << 63;
6803 assign(shift_amount, binop(Iop_And64, mkexpr(op2addr), mkU64(63)));
6804 assign(result, binop(Iop_Or64, binop(Iop_And64, binop(Iop_Shl64, mkexpr(op),
6805 unop(Iop_64to8, mkexpr(shift_amount))), mkU64((ULong)(~sign_mask))),
6806 binop(Iop_And64, mkexpr(op), mkU64((ULong)sign_mask))));
6807 put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6808 put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6809 s390_cc_thunk_putZZ(S390_CC_OP_SHIFT_LEFT_64, op, shift_amount);
6815 s390_irgen_SLDL(UChar r1, IRTemp op2addr)
6817 IRTemp p1 = newTemp(Ity_I64);
6818 IRTemp p2 = newTemp(Ity_I64);
6819 IRTemp result = newTemp(Ity_I64);
6821 assign(p1, unop(Iop_32Uto64, get_gpr_w1(r1)));
6822 assign(p2, unop(Iop_32Uto64, get_gpr_w1(r1 + 1)));
6823 assign(result, binop(Iop_Shl64, binop(Iop_Or64, binop(Iop_Shl64, mkexpr(p1),
6824 mkU8(32)), mkexpr(p2)), unop(Iop_64to8, binop(Iop_And64,
6825 mkexpr(op2addr), mkU64(63)))));
6826 put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6827 put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6833 s390_irgen_SLA(UChar r1, IRTemp op2addr)
6835 IRTemp uop = newTemp(Ity_I32);
6836 IRTemp result = newTemp(Ity_I32);
6838 IRTemp shift_amount = newTemp(Ity_I64);
6839 IRTemp op = newTemp(Ity_I32);
6841 assign(op, get_gpr_w1(r1));
6842 assign(uop, get_gpr_w1(r1));
6843 sign_mask = 2147483648U;
6844 assign(shift_amount, binop(Iop_And64, mkexpr(op2addr), mkU64(63)));
6845 assign(result, binop(Iop_Or32, binop(Iop_And32, binop(Iop_Shl32, mkexpr(uop),
6846 unop(Iop_64to8, mkexpr(shift_amount))), mkU32(~sign_mask)),
6847 binop(Iop_And32, mkexpr(uop), mkU32(sign_mask))));
6848 put_gpr_w1(r1, mkexpr(result));
6849 s390_cc_thunk_putZZ(S390_CC_OP_SHIFT_LEFT_32, op, shift_amount);
6855 s390_irgen_SLAK(UChar r1, UChar r3, IRTemp op2addr)
6857 IRTemp uop = newTemp(Ity_I32);
6858 IRTemp result = newTemp(Ity_I32);
6860 IRTemp shift_amount = newTemp(Ity_I64);
6861 IRTemp op = newTemp(Ity_I32);
6863 assign(op, get_gpr_w1(r3));
6864 assign(uop, get_gpr_w1(r3));
6865 sign_mask = 2147483648U;
6866 assign(shift_amount, binop(Iop_And64, mkexpr(op2addr), mkU64(63)));
6867 assign(result, binop(Iop_Or32, binop(Iop_And32, binop(Iop_Shl32, mkexpr(uop),
6868 unop(Iop_64to8, mkexpr(shift_amount))), mkU32(~sign_mask)),
6869 binop(Iop_And32, mkexpr(uop), mkU32(sign_mask))));
6870 put_gpr_w1(r1, mkexpr(result));
6871 s390_cc_thunk_putZZ(S390_CC_OP_SHIFT_LEFT_32, op, shift_amount);
6877 s390_irgen_SLAG(UChar r1, UChar r3, IRTemp op2addr)
6879 IRTemp uop = newTemp(Ity_I64);
6880 IRTemp result = newTemp(Ity_I64);
6882 IRTemp shift_amount = newTemp(Ity_I64);
6883 IRTemp op = newTemp(Ity_I64);
6885 assign(op, get_gpr_dw0(r3));
6886 assign(uop, get_gpr_dw0(r3));
6887 sign_mask = 9223372036854775808ULL;
6888 assign(shift_amount, binop(Iop_And64, mkexpr(op2addr), mkU64(63)));
6889 assign(result, binop(Iop_Or64, binop(Iop_And64, binop(Iop_Shl64, mkexpr(uop),
6890 unop(Iop_64to8, mkexpr(shift_amount))), mkU64(~sign_mask)),
6891 binop(Iop_And64, mkexpr(uop), mkU64(sign_mask))));
6892 put_gpr_dw0(r1, mkexpr(result));
6893 s390_cc_thunk_putZZ(S390_CC_OP_SHIFT_LEFT_64, op, shift_amount);
6899 s390_irgen_SLL(UChar r1, IRTemp op2addr)
6901 put_gpr_w1(r1, binop(Iop_Shl32, get_gpr_w1(r1), unop(Iop_64to8,
6902 binop(Iop_And64, mkexpr(op2addr), mkU64(63)))));
6908 s390_irgen_SLLK(UChar r1, UChar r3, IRTemp op2addr)
6910 put_gpr_w1(r1, binop(Iop_Shl32, get_gpr_w1(r3), unop(Iop_64to8,
6911 binop(Iop_And64, mkexpr(op2addr), mkU64(63)))));
6917 s390_irgen_SLLG(UChar r1, UChar r3, IRTemp op2addr)
6919 put_gpr_dw0(r1, binop(Iop_Shl64, get_gpr_dw0(r3), unop(Iop_64to8,
6920 binop(Iop_And64, mkexpr(op2addr), mkU64(63)))));
6926 s390_irgen_SRDA(UChar r1, IRTemp op2addr)
6928 IRTemp p1 = newTemp(Ity_I64);
6929 IRTemp p2 = newTemp(Ity_I64);
6930 IRTemp result = newTemp(Ity_I64);
6932 assign(p1, unop(Iop_32Uto64, get_gpr_w1(r1)));
6933 assign(p2, unop(Iop_32Uto64, get_gpr_w1(r1 + 1)));
6934 assign(result, binop(Iop_Sar64, binop(Iop_Or64, binop(Iop_Shl64, mkexpr(p1),
6935 mkU8(32)), mkexpr(p2)), unop(Iop_64to8, binop(Iop_And64,
6936 mkexpr(op2addr), mkU64(63)))));
6937 put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6938 put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6939 s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, result);
6945 s390_irgen_SRDL(UChar r1, IRTemp op2addr)
6947 IRTemp p1 = newTemp(Ity_I64);
6948 IRTemp p2 = newTemp(Ity_I64);
6949 IRTemp result = newTemp(Ity_I64);
6951 assign(p1, unop(Iop_32Uto64, get_gpr_w1(r1)));
6952 assign(p2, unop(Iop_32Uto64, get_gpr_w1(r1 + 1)));
6953 assign(result, binop(Iop_Shr64, binop(Iop_Or64, binop(Iop_Shl64, mkexpr(p1),
6954 mkU8(32)), mkexpr(p2)), unop(Iop_64to8, binop(Iop_And64,
6955 mkexpr(op2addr), mkU64(63)))));
6956 put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result)));
6957 put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result)));
6963 s390_irgen_SRA(UChar r1, IRTemp op2addr)
6965 IRTemp result = newTemp(Ity_I32);
6966 IRTemp op = newTemp(Ity_I32);
6968 assign(op, get_gpr_w1(r1));
6969 assign(result, binop(Iop_Sar32, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
6970 mkexpr(op2addr), mkU64(63)))));
6971 put_gpr_w1(r1, mkexpr(result));
6972 s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, result);
6978 s390_irgen_SRAK(UChar r1, UChar r3, IRTemp op2addr)
6980 IRTemp result = newTemp(Ity_I32);
6981 IRTemp op = newTemp(Ity_I32);
6983 assign(op, get_gpr_w1(r3));
6984 assign(result, binop(Iop_Sar32, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
6985 mkexpr(op2addr), mkU64(63)))));
6986 put_gpr_w1(r1, mkexpr(result));
6987 s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, result);
6993 s390_irgen_SRAG(UChar r1, UChar r3, IRTemp op2addr)
6995 IRTemp result = newTemp(Ity_I64);
6996 IRTemp op = newTemp(Ity_I64);
6998 assign(op, get_gpr_dw0(r3));
6999 assign(result, binop(Iop_Sar64, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
7000 mkexpr(op2addr), mkU64(63)))));
7001 put_gpr_dw0(r1, mkexpr(result));
7002 s390_cc_thunk_putS(S390_CC_OP_LOAD_AND_TEST, result);
7008 s390_irgen_SRL(UChar r1, IRTemp op2addr)
7010 IRTemp op = newTemp(Ity_I32);
7012 assign(op, get_gpr_w1(r1));
7013 put_gpr_w1(r1, binop(Iop_Shr32, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
7014 mkexpr(op2addr), mkU64(63)))));
7020 s390_irgen_SRLK(UChar r1, UChar r3, IRTemp op2addr)
7022 IRTemp op = newTemp(Ity_I32);
7024 assign(op, get_gpr_w1(r3));
7025 put_gpr_w1(r1, binop(Iop_Shr32, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
7026 mkexpr(op2addr), mkU64(63)))));
7032 s390_irgen_SRLG(UChar r1, UChar r3, IRTemp op2addr)
7034 IRTemp op = newTemp(Ity_I64);
7036 assign(op, get_gpr_dw0(r3));
7037 put_gpr_dw0(r1, binop(Iop_Shr64, mkexpr(op), unop(Iop_64to8, binop(Iop_And64,
7038 mkexpr(op2addr), mkU64(63)))));
7044 s390_irgen_ST(UChar r1, IRTemp op2addr)
7046 store(mkexpr(op2addr), get_gpr_w1(r1));
7052 s390_irgen_STY(UChar r1, IRTemp op2addr)
7054 store(mkexpr(op2addr), get_gpr_w1(r1));
7060 s390_irgen_STG(UChar r1, IRTemp op2addr)
7062 store(mkexpr(op2addr), get_gpr_dw0(r1));
7068 s390_irgen_STRL(UChar r1, UInt i2)
7070 store(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1)),
7077 s390_irgen_STGRL(UChar r1, UInt i2)
7079 store(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1)),
7086 s390_irgen_STC(UChar r1, IRTemp op2addr)
7088 store(mkexpr(op2addr), get_gpr_b7(r1));
7094 s390_irgen_STCY(UChar r1, IRTemp op2addr)
7096 store(mkexpr(op2addr), get_gpr_b7(r1));
7102 s390_irgen_STCH(UChar r1, IRTemp op2addr)
7104 store(mkexpr(op2addr), get_gpr_b3(r1));
7110 s390_irgen_STCM(UChar r1, UChar r3, IRTemp op2addr)
7117 if ((mask & 8) != 0) {
7118 store(mkexpr(op2addr), get_gpr_b4(r1));
7121 if ((mask & 4) != 0) {
7122 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b5(r1));
7125 if ((mask & 2) != 0) {
7126 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b6(r1));
7129 if ((mask & 1) != 0) {
7130 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b7(r1));
7137 s390_irgen_STCMY(UChar r1, UChar r3, IRTemp op2addr)
7144 if ((mask & 8) != 0) {
7145 store(mkexpr(op2addr), get_gpr_b4(r1));
7148 if ((mask & 4) != 0) {
7149 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b5(r1));
7152 if ((mask & 2) != 0) {
7153 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b6(r1));
7156 if ((mask & 1) != 0) {
7157 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b7(r1));
7164 s390_irgen_STCMH(UChar r1, UChar r3, IRTemp op2addr)
7171 if ((mask & 8) != 0) {
7172 store(mkexpr(op2addr), get_gpr_b0(r1));
7175 if ((mask & 4) != 0) {
7176 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b1(r1));
7179 if ((mask & 2) != 0) {
7180 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b2(r1));
7183 if ((mask & 1) != 0) {
7184 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(n)), get_gpr_b3(r1));
7191 s390_irgen_STH(UChar r1, IRTemp op2addr)
7193 store(mkexpr(op2addr), get_gpr_hw3(r1));
7199 s390_irgen_STHY(UChar r1, IRTemp op2addr)
7201 store(mkexpr(op2addr), get_gpr_hw3(r1));
7207 s390_irgen_STHRL(UChar r1, UInt i2)
7209 store(mkU64(guest_IA_curr_instr + ((ULong)(Long)(Int)i2 << 1)),
7216 s390_irgen_STHH(UChar r1, IRTemp op2addr)
7218 store(mkexpr(op2addr), get_gpr_hw1(r1));
7224 s390_irgen_STFH(UChar r1, IRTemp op2addr)
7226 store(mkexpr(op2addr), get_gpr_w0(r1));
7232 s390_irgen_STOC(UChar r1, IRTemp op2addr)
7234 /* condition is checked in format handler */
7235 store(mkexpr(op2addr), get_gpr_w1(r1));
7241 s390_irgen_STOCG(UChar r1, IRTemp op2addr)
7243 /* condition is checked in format handler */
7244 store(mkexpr(op2addr), get_gpr_dw0(r1));
7250 s390_irgen_STPQ(UChar r1, IRTemp op2addr)
7252 store(mkexpr(op2addr), get_gpr_dw0(r1));
7253 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(8)), get_gpr_dw0(r1 + 1));
7259 s390_irgen_STRVH(UChar r1, IRTemp op2addr)
7261 store(mkexpr(op2addr), get_gpr_b7(r1));
7262 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(1)), get_gpr_b6(r1));
7268 s390_irgen_STRV(UChar r1, IRTemp op2addr)
7270 store(mkexpr(op2addr), get_gpr_b7(r1));
7271 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(1)), get_gpr_b6(r1));
7272 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(2)), get_gpr_b5(r1));
7273 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(3)), get_gpr_b4(r1));
7279 s390_irgen_STRVG(UChar r1, IRTemp op2addr)
7281 store(mkexpr(op2addr), get_gpr_b7(r1));
7282 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(1)), get_gpr_b6(r1));
7283 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(2)), get_gpr_b5(r1));
7284 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(3)), get_gpr_b4(r1));
7285 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(4)), get_gpr_b3(r1));
7286 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(5)), get_gpr_b2(r1));
7287 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(6)), get_gpr_b1(r1));
7288 store(binop(Iop_Add64, mkexpr(op2addr), mkU64(7)), get_gpr_b0(r1));
7294 s390_irgen_SR(UChar r1, UChar r2)
7296 IRTemp op1 = newTemp(Ity_I32);
7297 IRTemp op2 = newTemp(Ity_I32);
7298 IRTemp result = newTemp(Ity_I32);
7300 assign(op1, get_gpr_w1(r1));
7301 assign(op2, get_gpr_w1(r2));
7302 assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
7303 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op1, op2);
7304 put_gpr_w1(r1, mkexpr(result));
7310 s390_irgen_SGR(UChar r1, UChar r2)
7312 IRTemp op1 = newTemp(Ity_I64);
7313 IRTemp op2 = newTemp(Ity_I64);
7314 IRTemp result = newTemp(Ity_I64);
7316 assign(op1, get_gpr_dw0(r1));
7317 assign(op2, get_gpr_dw0(r2));
7318 assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
7319 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, op1, op2);
7320 put_gpr_dw0(r1, mkexpr(result));
7326 s390_irgen_SGFR(UChar r1, UChar r2)
7328 IRTemp op1 = newTemp(Ity_I64);
7329 IRTemp op2 = newTemp(Ity_I64);
7330 IRTemp result = newTemp(Ity_I64);
7332 assign(op1, get_gpr_dw0(r1));
7333 assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
7334 assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
7335 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, op1, op2);
7336 put_gpr_dw0(r1, mkexpr(result));
7342 s390_irgen_SRK(UChar r3, UChar r1, UChar r2)
7344 IRTemp op2 = newTemp(Ity_I32);
7345 IRTemp op3 = newTemp(Ity_I32);
7346 IRTemp result = newTemp(Ity_I32);
7348 assign(op2, get_gpr_w1(r2));
7349 assign(op3, get_gpr_w1(r3));
7350 assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
7351 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op2, op3);
7352 put_gpr_w1(r1, mkexpr(result));
7358 s390_irgen_SGRK(UChar r3, UChar r1, UChar r2)
7360 IRTemp op2 = newTemp(Ity_I64);
7361 IRTemp op3 = newTemp(Ity_I64);
7362 IRTemp result = newTemp(Ity_I64);
7364 assign(op2, get_gpr_dw0(r2));
7365 assign(op3, get_gpr_dw0(r3));
7366 assign(result, binop(Iop_Sub64, mkexpr(op2), mkexpr(op3)));
7367 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, op2, op3);
7368 put_gpr_dw0(r1, mkexpr(result));
7374 s390_irgen_S(UChar r1, IRTemp op2addr)
7376 IRTemp op1 = newTemp(Ity_I32);
7377 IRTemp op2 = newTemp(Ity_I32);
7378 IRTemp result = newTemp(Ity_I32);
7380 assign(op1, get_gpr_w1(r1));
7381 assign(op2, load(Ity_I32, mkexpr(op2addr)));
7382 assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
7383 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op1, op2);
7384 put_gpr_w1(r1, mkexpr(result));
7390 s390_irgen_SY(UChar r1, IRTemp op2addr)
7392 IRTemp op1 = newTemp(Ity_I32);
7393 IRTemp op2 = newTemp(Ity_I32);
7394 IRTemp result = newTemp(Ity_I32);
7396 assign(op1, get_gpr_w1(r1));
7397 assign(op2, load(Ity_I32, mkexpr(op2addr)));
7398 assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
7399 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op1, op2);
7400 put_gpr_w1(r1, mkexpr(result));
7406 s390_irgen_SG(UChar r1, IRTemp op2addr)
7408 IRTemp op1 = newTemp(Ity_I64);
7409 IRTemp op2 = newTemp(Ity_I64);
7410 IRTemp result = newTemp(Ity_I64);
7412 assign(op1, get_gpr_dw0(r1));
7413 assign(op2, load(Ity_I64, mkexpr(op2addr)));
7414 assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
7415 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, op1, op2);
7416 put_gpr_dw0(r1, mkexpr(result));
7422 s390_irgen_SGF(UChar r1, IRTemp op2addr)
7424 IRTemp op1 = newTemp(Ity_I64);
7425 IRTemp op2 = newTemp(Ity_I64);
7426 IRTemp result = newTemp(Ity_I64);
7428 assign(op1, get_gpr_dw0(r1));
7429 assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
7430 assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
7431 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_64, op1, op2);
7432 put_gpr_dw0(r1, mkexpr(result));
7438 s390_irgen_SH(UChar r1, IRTemp op2addr)
7440 IRTemp op1 = newTemp(Ity_I32);
7441 IRTemp op2 = newTemp(Ity_I32);
7442 IRTemp result = newTemp(Ity_I32);
7444 assign(op1, get_gpr_w1(r1));
7445 assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
7446 assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
7447 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op1, op2);
7448 put_gpr_w1(r1, mkexpr(result));
7454 s390_irgen_SHY(UChar r1, IRTemp op2addr)
7456 IRTemp op1 = newTemp(Ity_I32);
7457 IRTemp op2 = newTemp(Ity_I32);
7458 IRTemp result = newTemp(Ity_I32);
7460 assign(op1, get_gpr_w1(r1));
7461 assign(op2, unop(Iop_16Sto32, load(Ity_I16, mkexpr(op2addr))));
7462 assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
7463 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op1, op2);
7464 put_gpr_w1(r1, mkexpr(result));
7470 s390_irgen_SHHHR(UChar r3 __attribute__((unused)), UChar r1, UChar r2)
7472 IRTemp op2 = newTemp(Ity_I32);
7473 IRTemp op3 = newTemp(Ity_I32);
7474 IRTemp result = newTemp(Ity_I32);
7476 assign(op2, get_gpr_w0(r1));
7477 assign(op3, get_gpr_w0(r2));
7478 assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
7479 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op2, op3);
7480 put_gpr_w0(r1, mkexpr(result));
7486 s390_irgen_SHHLR(UChar r3 __attribute__((unused)), UChar r1, UChar r2)
7488 IRTemp op2 = newTemp(Ity_I32);
7489 IRTemp op3 = newTemp(Ity_I32);
7490 IRTemp result = newTemp(Ity_I32);
7492 assign(op2, get_gpr_w0(r1));
7493 assign(op3, get_gpr_w1(r2));
7494 assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
7495 s390_cc_thunk_putSS(S390_CC_OP_SIGNED_SUB_32, op2, op3);
7496 put_gpr_w0(r1, mkexpr(result));
7502 s390_irgen_SLR(UChar r1, UChar r2)
7504 IRTemp op1 = newTemp(Ity_I32);
7505 IRTemp op2 = newTemp(Ity_I32);
7506 IRTemp result = newTemp(Ity_I32);
7508 assign(op1, get_gpr_w1(r1));
7509 assign(op2, get_gpr_w1(r2));
7510 assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
7511 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op1, op2);
7512 put_gpr_w1(r1, mkexpr(result));
7518 s390_irgen_SLGR(UChar r1, UChar r2)
7520 IRTemp op1 = newTemp(Ity_I64);
7521 IRTemp op2 = newTemp(Ity_I64);
7522 IRTemp result = newTemp(Ity_I64);
7524 assign(op1, get_gpr_dw0(r1));
7525 assign(op2, get_gpr_dw0(r2));
7526 assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
7527 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op1, op2);
7528 put_gpr_dw0(r1, mkexpr(result));
7534 s390_irgen_SLGFR(UChar r1, UChar r2)
7536 IRTemp op1 = newTemp(Ity_I64);
7537 IRTemp op2 = newTemp(Ity_I64);
7538 IRTemp result = newTemp(Ity_I64);
7540 assign(op1, get_gpr_dw0(r1));
7541 assign(op2, unop(Iop_32Uto64, get_gpr_w1(r2)));
7542 assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
7543 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op1, op2);
7544 put_gpr_dw0(r1, mkexpr(result));
7550 s390_irgen_SLRK(UChar r3, UChar r1, UChar r2)
7552 IRTemp op2 = newTemp(Ity_I32);
7553 IRTemp op3 = newTemp(Ity_I32);
7554 IRTemp result = newTemp(Ity_I32);
7556 assign(op2, get_gpr_w1(r2));
7557 assign(op3, get_gpr_w1(r3));
7558 assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
7559 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op2, op3);
7560 put_gpr_w1(r1, mkexpr(result));
7566 s390_irgen_SLGRK(UChar r3, UChar r1, UChar r2)
7568 IRTemp op2 = newTemp(Ity_I64);
7569 IRTemp op3 = newTemp(Ity_I64);
7570 IRTemp result = newTemp(Ity_I64);
7572 assign(op2, get_gpr_dw0(r2));
7573 assign(op3, get_gpr_dw0(r3));
7574 assign(result, binop(Iop_Sub64, mkexpr(op2), mkexpr(op3)));
7575 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op2, op3);
7576 put_gpr_dw0(r1, mkexpr(result));
7582 s390_irgen_SL(UChar r1, IRTemp op2addr)
7584 IRTemp op1 = newTemp(Ity_I32);
7585 IRTemp op2 = newTemp(Ity_I32);
7586 IRTemp result = newTemp(Ity_I32);
7588 assign(op1, get_gpr_w1(r1));
7589 assign(op2, load(Ity_I32, mkexpr(op2addr)));
7590 assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
7591 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op1, op2);
7592 put_gpr_w1(r1, mkexpr(result));
7598 s390_irgen_SLY(UChar r1, IRTemp op2addr)
7600 IRTemp op1 = newTemp(Ity_I32);
7601 IRTemp op2 = newTemp(Ity_I32);
7602 IRTemp result = newTemp(Ity_I32);
7604 assign(op1, get_gpr_w1(r1));
7605 assign(op2, load(Ity_I32, mkexpr(op2addr)));
7606 assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)));
7607 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op1, op2);
7608 put_gpr_w1(r1, mkexpr(result));
7614 s390_irgen_SLG(UChar r1, IRTemp op2addr)
7616 IRTemp op1 = newTemp(Ity_I64);
7617 IRTemp op2 = newTemp(Ity_I64);
7618 IRTemp result = newTemp(Ity_I64);
7620 assign(op1, get_gpr_dw0(r1));
7621 assign(op2, load(Ity_I64, mkexpr(op2addr)));
7622 assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
7623 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op1, op2);
7624 put_gpr_dw0(r1, mkexpr(result));
7630 s390_irgen_SLGF(UChar r1, IRTemp op2addr)
7632 IRTemp op1 = newTemp(Ity_I64);
7633 IRTemp op2 = newTemp(Ity_I64);
7634 IRTemp result = newTemp(Ity_I64);
7636 assign(op1, get_gpr_dw0(r1));
7637 assign(op2, unop(Iop_32Uto64, load(Ity_I32, mkexpr(op2addr))));
7638 assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)));
7639 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op1, op2);
7640 put_gpr_dw0(r1, mkexpr(result));
7646 s390_irgen_SLFI(UChar r1, UInt i2)
7648 IRTemp op1 = newTemp(Ity_I32);
7650 IRTemp result = newTemp(Ity_I32);
7652 assign(op1, get_gpr_w1(r1));
7654 assign(result, binop(Iop_Sub32, mkexpr(op1), mkU32(op2)));
7655 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op1, mktemp(Ity_I32,
7657 put_gpr_w1(r1, mkexpr(result));
7663 s390_irgen_SLGFI(UChar r1, UInt i2)
7665 IRTemp op1 = newTemp(Ity_I64);
7667 IRTemp result = newTemp(Ity_I64);
7669 assign(op1, get_gpr_dw0(r1));
7671 assign(result, binop(Iop_Sub64, mkexpr(op1), mkU64(op2)));
7672 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_64, op1, mktemp(Ity_I64,
7674 put_gpr_dw0(r1, mkexpr(result));
7680 s390_irgen_SLHHHR(UChar r3 __attribute__((unused)), UChar r1, UChar r2)
7682 IRTemp op2 = newTemp(Ity_I32);
7683 IRTemp op3 = newTemp(Ity_I32);
7684 IRTemp result = newTemp(Ity_I32);
7686 assign(op2, get_gpr_w0(r1));
7687 assign(op3, get_gpr_w0(r2));
7688 assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
7689 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op2, op3);
7690 put_gpr_w0(r1, mkexpr(result));
7696 s390_irgen_SLHHLR(UChar r3 __attribute__((unused)), UChar r1, UChar r2)
7698 IRTemp op2 = newTemp(Ity_I32);
7699 IRTemp op3 = newTemp(Ity_I32);
7700 IRTemp result = newTemp(Ity_I32);
7702 assign(op2, get_gpr_w0(r1));
7703 assign(op3, get_gpr_w1(r2));
7704 assign(result, binop(Iop_Sub32, mkexpr(op2), mkexpr(op3)));
7705 s390_cc_thunk_putZZ(S390_CC_OP_UNSIGNED_SUB_32, op2, op3);
7706 put_gpr_w0(r1, mkexpr(result));
7712 s390_irgen_SLBR(UChar r1, UChar r2)
7714 IRTemp op1 = newTemp(Ity_I32);
7715 IRTemp op2 = newTemp(Ity_I32);
7716 IRTemp result = newTemp(Ity_I32);
7717 IRTemp borrow_in = newTemp(Ity_I32);
7719 assign(op1, get_gpr_w1(r1));
7720 assign(op2, get_gpr_w1(r2));
7721 assign(borrow_in, binop(Iop_Sub32, mkU32(1), binop(Iop_Shr32,
7722 s390_call_calculate_cc(), mkU8(1))));
7723 assign(result, binop(Iop_Sub32, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)),
7724 mkexpr(borrow_in)));
7725 s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_SUBB_32, op1, op2, borrow_in);
7726 put_gpr_w1(r1, mkexpr(result));
7732 s390_irgen_SLBGR(UChar r1, UChar r2)
7734 IRTemp op1 = newTemp(Ity_I64);
7735 IRTemp op2 = newTemp(Ity_I64);
7736 IRTemp result = newTemp(Ity_I64);
7737 IRTemp borrow_in = newTemp(Ity_I64);
7739 assign(op1, get_gpr_dw0(r1));
7740 assign(op2, get_gpr_dw0(r2));
7741 assign(borrow_in, unop(Iop_32Uto64, binop(Iop_Sub32, mkU32(1),
7742 binop(Iop_Shr32, s390_call_calculate_cc(), mkU8(1)))));
7743 assign(result, binop(Iop_Sub64, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)),
7744 mkexpr(borrow_in)));
7745 s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_SUBB_64, op1, op2, borrow_in);
7746 put_gpr_dw0(r1, mkexpr(result));
7752 s390_irgen_SLB(UChar r1, IRTemp op2addr)
7754 IRTemp op1 = newTemp(Ity_I32);
7755 IRTemp op2 = newTemp(Ity_I32);
7756 IRTemp result = newTemp(Ity_I32);
7757 IRTemp borrow_in = newTemp(Ity_I32);
7759 assign(op1, get_gpr_w1(r1));
7760 assign(op2, load(Ity_I32, mkexpr(op2addr)));
7761 assign(borrow_in, binop(Iop_Sub32, mkU32(1), binop(Iop_Shr32,
7762 s390_call_calculate_cc(), mkU8(1))));
7763 assign(result, binop(Iop_Sub32, binop(Iop_Sub32, mkexpr(op1), mkexpr(op2)),
7764 mkexpr(borrow_in)));
7765 s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_SUBB_32, op1, op2, borrow_in);
7766 put_gpr_w1(r1, mkexpr(result));
7772 s390_irgen_SLBG(UChar r1, IRTemp op2addr)
7774 IRTemp op1 = newTemp(Ity_I64);
7775 IRTemp op2 = newTemp(Ity_I64);
7776 IRTemp result = newTemp(Ity_I64);
7777 IRTemp borrow_in = newTemp(Ity_I64);
7779 assign(op1, get_gpr_dw0(r1));
7780 assign(op2, load(Ity_I64, mkexpr(op2addr)));
7781 assign(borrow_in, unop(Iop_32Uto64, binop(Iop_Sub32, mkU32(1),
7782 binop(Iop_Shr32, s390_call_calculate_cc(), mkU8(1)))));
7783 assign(result, binop(Iop_Sub64, binop(Iop_Sub64, mkexpr(op1), mkexpr(op2)),
7784 mkexpr(borrow_in)));
7785 s390_cc_thunk_putZZZ(S390_CC_OP_UNSIGNED_SUBB_64, op1, op2, borrow_in);
7786 put_gpr_dw0(r1, mkexpr(result));
7792 s390_irgen_SVC(UChar i)
7794 IRTemp sysno = newTemp(Ity_I64);
7797 assign(sysno, mkU64(i));
7799 assign(sysno, unop(Iop_32Uto64, get_gpr_w1(1)));
7801 system_call(mkexpr(sysno));
7807 s390_irgen_TS(IRTemp op2addr)
7809 IRTemp value = newTemp(Ity_I8);
7811 assign(value, load(Ity_I8, mkexpr(op2addr)));
7812 s390_cc_thunk_putZ(S390_CC_OP_TEST_AND_SET, value);
7813 store(mkexpr(op2addr), mkU8(255));
7819 s390_irgen_TM(UChar i2, IRTemp op1addr)
7822 IRTemp value = newTemp(Ity_I8);
7825 assign(value, load(Ity_I8, mkexpr(op1addr)));
7826 s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_8, value, mktemp(Ity_I8,
7833 s390_irgen_TMY(UChar i2, IRTemp op1addr)
7836 IRTemp value = newTemp(Ity_I8);
7839 assign(value, load(Ity_I8, mkexpr(op1addr)));
7840 s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_8, value, mktemp(Ity_I8,
7847 s390_irgen_TMHH(UChar r1, UShort i2)
7850 IRTemp value = newTemp(Ity_I16);
7853 assign(value, get_gpr_hw0(r1));
7854 s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_16, value, mktemp(Ity_I16,
7861 s390_irgen_TMHL(UChar r1, UShort i2)
7864 IRTemp value = newTemp(Ity_I16);
7867 assign(value, get_gpr_hw1(r1));
7868 s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_16, value, mktemp(Ity_I16,
7875 s390_irgen_TMLH(UChar r1, UShort i2)
7878 IRTemp value = newTemp(Ity_I16);
7881 assign(value, get_gpr_hw2(r1));
7882 s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_16, value, mktemp(Ity_I16,
7889 s390_irgen_TMLL(UChar r1, UShort i2)
7892 IRTemp value = newTemp(Ity_I16);
7895 assign(value, get_gpr_hw3(r1));
7896 s390_cc_thunk_putZZ(S390_CC_OP_TEST_UNDER_MASK_16, value, mktemp(Ity_I16,
7903 s390_irgen_EFPC(UChar r1)
7905 put_gpr_w1(r1, get_fpc_w0());
7911 s390_irgen_LER(UChar r1, UChar r2)
7913 put_fpr_w0(r1, get_fpr_w0(r2));
7919 s390_irgen_LDR(UChar r1, UChar r2)
7921 put_fpr_dw0(r1, get_fpr_dw0(r2));
7927 s390_irgen_LXR(UChar r1, UChar r2)
7929 put_fpr_dw0(r1, get_fpr_dw0(r2));
7930 put_fpr_dw0(r1 + 2, get_fpr_dw0(r2 + 2));
7936 s390_irgen_LE(UChar r1, IRTemp op2addr)
7938 put_fpr_w0(r1, load(Ity_F32, mkexpr(op2addr)));
7944 s390_irgen_LD(UChar r1, IRTemp op2addr)
7946 put_fpr_dw0(r1, load(Ity_F64, mkexpr(op2addr)));
7952 s390_irgen_LEY(UChar r1, IRTemp op2addr)
7954 put_fpr_w0(r1, load(Ity_F32, mkexpr(op2addr)));
7960 s390_irgen_LDY(UChar r1, IRTemp op2addr)
7962 put_fpr_dw0(r1, load(Ity_F64, mkexpr(op2addr)));
7968 s390_irgen_LFPC(IRTemp op2addr)
7970 put_fpc_w0(load(Ity_I32, mkexpr(op2addr)));
7976 s390_irgen_LZER(UChar r1)
7978 put_fpr_w0(r1, mkF32i(0x0));
7984 s390_irgen_LZDR(UChar r1)
7986 put_fpr_dw0(r1, mkF64i(0x0));
7992 s390_irgen_LZXR(UChar r1)
7994 put_fpr_dw0(r1, mkF64i(0x0));
7995 put_fpr_dw0(r1 + 2, mkF64i(0x0));
8001 s390_irgen_SRNM(IRTemp op2addr)
8006 put_fpc_w0(binop(Iop_Or32, binop(Iop_And32, get_fpc_w0(), mkU32(~mask)),
8007 binop(Iop_And32, unop(Iop_64to32, mkexpr(op2addr)), mkU32(mask)))
8014 s390_irgen_SFPC(UChar r1)
8016 put_fpc_w0(get_gpr_w1(r1));
8022 s390_irgen_STE(UChar r1, IRTemp op2addr)
8024 store(mkexpr(op2addr), get_fpr_w0(r1));
8030 s390_irgen_STD(UChar r1, IRTemp op2addr)
8032 store(mkexpr(op2addr), get_fpr_dw0(r1));
8038 s390_irgen_STEY(UChar r1, IRTemp op2addr)
8040 store(mkexpr(op2addr), get_fpr_w0(r1));
8046 s390_irgen_STDY(UChar r1, IRTemp op2addr)
8048 store(mkexpr(op2addr), get_fpr_dw0(r1));
8054 s390_irgen_STFPC(IRTemp op2addr)
8056 store(mkexpr(op2addr), get_fpc_w0());
8062 s390_irgen_AEBR(UChar r1, UChar r2)
8064 IRTemp op1 = newTemp(Ity_F32);
8065 IRTemp op2 = newTemp(Ity_F32);
8066 IRTemp result = newTemp(Ity_F32);
8068 assign(op1, get_fpr_w0(r1));
8069 assign(op2, get_fpr_w0(r2));
8070 assign(result, triop(Iop_AddF32, mkU32(Irrm_NEAREST), mkexpr(op1),
8072 s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
8073 put_fpr_w0(r1, mkexpr(result));
8079 s390_irgen_ADBR(UChar r1, UChar r2)
8081 IRTemp op1 = newTemp(Ity_F64);
8082 IRTemp op2 = newTemp(Ity_F64);
8083 IRTemp result = newTemp(Ity_F64);
8085 assign(op1, get_fpr_dw0(r1));
8086 assign(op2, get_fpr_dw0(r2));
8087 assign(result, triop(Iop_AddF64, mkU32(Irrm_NEAREST), mkexpr(op1),
8089 s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
8090 put_fpr_dw0(r1, mkexpr(result));
8096 s390_irgen_AEB(UChar r1, IRTemp op2addr)
8098 IRTemp op1 = newTemp(Ity_F32);
8099 IRTemp op2 = newTemp(Ity_F32);
8100 IRTemp result = newTemp(Ity_F32);
8102 assign(op1, get_fpr_w0(r1));
8103 assign(op2, load(Ity_F32, mkexpr(op2addr)));
8104 assign(result, triop(Iop_AddF32, mkU32(Irrm_NEAREST), mkexpr(op1),
8106 s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
8107 put_fpr_w0(r1, mkexpr(result));
8113 s390_irgen_ADB(UChar r1, IRTemp op2addr)
8115 IRTemp op1 = newTemp(Ity_F64);
8116 IRTemp op2 = newTemp(Ity_F64);
8117 IRTemp result = newTemp(Ity_F64);
8119 assign(op1, get_fpr_dw0(r1));
8120 assign(op2, load(Ity_F64, mkexpr(op2addr)));
8121 assign(result, triop(Iop_AddF64, mkU32(Irrm_NEAREST), mkexpr(op1),
8123 s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
8124 put_fpr_dw0(r1, mkexpr(result));
8130 s390_irgen_CEFBR(UChar r1, UChar r2)
8132 IRTemp op2 = newTemp(Ity_I32);
8134 assign(op2, get_gpr_w1(r2));
8135 put_fpr_w0(r1, binop(Iop_I32StoF32, mkU32(Irrm_NEAREST), mkexpr(op2)));
8141 s390_irgen_CDFBR(UChar r1, UChar r2)
8143 IRTemp op2 = newTemp(Ity_I32);
8145 assign(op2, get_gpr_w1(r2));
8146 put_fpr_dw0(r1, unop(Iop_I32StoF64, mkexpr(op2)));
8152 s390_irgen_CEGBR(UChar r1, UChar r2)
8154 IRTemp op2 = newTemp(Ity_I64);
8156 assign(op2, get_gpr_dw0(r2));
8157 put_fpr_w0(r1, binop(Iop_I64StoF32, mkU32(Irrm_NEAREST), mkexpr(op2)));
8163 s390_irgen_CDGBR(UChar r1, UChar r2)
8165 IRTemp op2 = newTemp(Ity_I64);
8167 assign(op2, get_gpr_dw0(r2));
8168 put_fpr_dw0(r1, binop(Iop_I64StoF64, mkU32(Irrm_NEAREST), mkexpr(op2)));
8174 s390_irgen_CFEBR(UChar r3, UChar r1, UChar r2)
8176 IRTemp op = newTemp(Ity_F32);
8177 IRTemp result = newTemp(Ity_I32);
8179 assign(op, get_fpr_w0(r2));
8180 assign(result, binop(Iop_F32toI32S, mkU32(encode_rounding_mode(r3)),
8182 put_gpr_w1(r1, mkexpr(result));
8183 s390_cc_thunk_putF(S390_CC_OP_BFP_32_TO_INT_32, op);
8189 s390_irgen_CFDBR(UChar r3, UChar r1, UChar r2)
8191 IRTemp op = newTemp(Ity_F64);
8192 IRTemp result = newTemp(Ity_I32);
8194 assign(op, get_fpr_dw0(r2));
8195 assign(result, binop(Iop_F64toI32S, mkU32(encode_rounding_mode(r3)),
8197 put_gpr_w1(r1, mkexpr(result));
8198 s390_cc_thunk_putF(S390_CC_OP_BFP_64_TO_INT_32, op);
8204 s390_irgen_CGEBR(UChar r3, UChar r1, UChar r2)
8206 IRTemp op = newTemp(Ity_F32);
8207 IRTemp result = newTemp(Ity_I64);
8209 assign(op, get_fpr_w0(r2));
8210 assign(result, binop(Iop_F32toI64S, mkU32(encode_rounding_mode(r3)),
8212 put_gpr_dw0(r1, mkexpr(result));
8213 s390_cc_thunk_putF(S390_CC_OP_BFP_32_TO_INT_64, op);
8219 s390_irgen_CGDBR(UChar r3, UChar r1, UChar r2)
8221 IRTemp op = newTemp(Ity_F64);
8222 IRTemp result = newTemp(Ity_I64);
8224 assign(op, get_fpr_dw0(r2));
8225 assign(result, binop(Iop_F64toI64S, mkU32(encode_rounding_mode(r3)),
8227 put_gpr_dw0(r1, mkexpr(result));
8228 s390_cc_thunk_putF(S390_CC_OP_BFP_64_TO_INT_64, op);
8234 s390_irgen_DEBR(UChar r1, UChar r2)
8236 IRTemp op1 = newTemp(Ity_F32);
8237 IRTemp op2 = newTemp(Ity_F32);
8238 IRTemp result = newTemp(Ity_F32);
8240 assign(op1, get_fpr_w0(r1));
8241 assign(op2, get_fpr_w0(r2));
8242 assign(result, triop(Iop_DivF32, mkU32(Irrm_NEAREST), mkexpr(op1),
8244 put_fpr_w0(r1, mkexpr(result));
8250 s390_irgen_DDBR(UChar r1, UChar r2)
8252 IRTemp op1 = newTemp(Ity_F64);
8253 IRTemp op2 = newTemp(Ity_F64);
8254 IRTemp result = newTemp(Ity_F64);
8256 assign(op1, get_fpr_dw0(r1));
8257 assign(op2, get_fpr_dw0(r2));
8258 assign(result, triop(Iop_DivF64, mkU32(Irrm_NEAREST), mkexpr(op1),
8260 put_fpr_dw0(r1, mkexpr(result));
8266 s390_irgen_DEB(UChar r1, IRTemp op2addr)
8268 IRTemp op1 = newTemp(Ity_F32);
8269 IRTemp op2 = newTemp(Ity_F32);
8270 IRTemp result = newTemp(Ity_F32);
8272 assign(op1, get_fpr_w0(r1));
8273 assign(op2, load(Ity_F32, mkexpr(op2addr)));
8274 assign(result, triop(Iop_DivF32, mkU32(Irrm_NEAREST), mkexpr(op1),
8276 put_fpr_w0(r1, mkexpr(result));
8282 s390_irgen_DDB(UChar r1, IRTemp op2addr)
8284 IRTemp op1 = newTemp(Ity_F64);
8285 IRTemp op2 = newTemp(Ity_F64);
8286 IRTemp result = newTemp(Ity_F64);
8288 assign(op1, get_fpr_dw0(r1));
8289 assign(op2, load(Ity_F64, mkexpr(op2addr)));
8290 assign(result, triop(Iop_DivF64, mkU32(Irrm_NEAREST), mkexpr(op1),
8292 put_fpr_dw0(r1, mkexpr(result));
8298 s390_irgen_LTEBR(UChar r1, UChar r2)
8300 IRTemp result = newTemp(Ity_F32);
8302 assign(result, get_fpr_w0(r2));
8303 put_fpr_w0(r1, mkexpr(result));
8304 s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
8310 s390_irgen_LTDBR(UChar r1, UChar r2)
8312 IRTemp result = newTemp(Ity_F64);
8314 assign(result, get_fpr_dw0(r2));
8315 put_fpr_dw0(r1, mkexpr(result));
8316 s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
8322 s390_irgen_LCEBR(UChar r1, UChar r2)
8324 IRTemp result = newTemp(Ity_F32);
8326 assign(result, unop(Iop_NegF32, get_fpr_w0(r2)));
8327 put_fpr_w0(r1, mkexpr(result));
8328 s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
8334 s390_irgen_LCDBR(UChar r1, UChar r2)
8336 IRTemp result = newTemp(Ity_F64);
8338 assign(result, unop(Iop_NegF64, get_fpr_dw0(r2)));
8339 put_fpr_dw0(r1, mkexpr(result));
8340 s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
8346 s390_irgen_LDEBR(UChar r1, UChar r2)
8348 IRTemp op = newTemp(Ity_F32);
8350 assign(op, get_fpr_w0(r2));
8351 put_fpr_dw0(r1, unop(Iop_F32toF64, mkexpr(op)));
8357 s390_irgen_LDEB(UChar r1, IRTemp op2addr)
8359 IRTemp op = newTemp(Ity_F32);
8361 assign(op, load(Ity_F32, mkexpr(op2addr)));
8362 put_fpr_dw0(r1, unop(Iop_F32toF64, mkexpr(op)));
8368 s390_irgen_LEDBR(UChar r1, UChar r2)
8370 IRTemp op = newTemp(Ity_F64);
8372 assign(op, get_fpr_dw0(r2));
8373 put_fpr_w0(r1, binop(Iop_F64toF32, mkU32(Irrm_NEAREST), mkexpr(op)));
8379 s390_irgen_MEEBR(UChar r1, UChar r2)
8381 IRTemp op1 = newTemp(Ity_F32);
8382 IRTemp op2 = newTemp(Ity_F32);
8383 IRTemp result = newTemp(Ity_F32);
8385 assign(op1, get_fpr_w0(r1));
8386 assign(op2, get_fpr_w0(r2));
8387 assign(result, triop(Iop_MulF32, mkU32(Irrm_NEAREST), mkexpr(op1),
8389 put_fpr_w0(r1, mkexpr(result));
8395 s390_irgen_MDBR(UChar r1, UChar r2)
8397 IRTemp op1 = newTemp(Ity_F64);
8398 IRTemp op2 = newTemp(Ity_F64);
8399 IRTemp result = newTemp(Ity_F64);
8401 assign(op1, get_fpr_dw0(r1));
8402 assign(op2, get_fpr_dw0(r2));
8403 assign(result, triop(Iop_MulF64, mkU32(Irrm_NEAREST), mkexpr(op1),
8405 put_fpr_dw0(r1, mkexpr(result));
8411 s390_irgen_MEEB(UChar r1, IRTemp op2addr)
8413 IRTemp op1 = newTemp(Ity_F32);
8414 IRTemp op2 = newTemp(Ity_F32);
8415 IRTemp result = newTemp(Ity_F32);
8417 assign(op1, get_fpr_w0(r1));
8418 assign(op2, load(Ity_F32, mkexpr(op2addr)));
8419 assign(result, triop(Iop_MulF32, mkU32(Irrm_NEAREST), mkexpr(op1),
8421 put_fpr_w0(r1, mkexpr(result));
8427 s390_irgen_MDB(UChar r1, IRTemp op2addr)
8429 IRTemp op1 = newTemp(Ity_F64);
8430 IRTemp op2 = newTemp(Ity_F64);
8431 IRTemp result = newTemp(Ity_F64);
8433 assign(op1, get_fpr_dw0(r1));
8434 assign(op2, load(Ity_F64, mkexpr(op2addr)));
8435 assign(result, triop(Iop_MulF64, mkU32(Irrm_NEAREST), mkexpr(op1),
8437 put_fpr_dw0(r1, mkexpr(result));
8443 s390_irgen_SEBR(UChar r1, UChar r2)
8445 IRTemp op1 = newTemp(Ity_F32);
8446 IRTemp op2 = newTemp(Ity_F32);
8447 IRTemp result = newTemp(Ity_F32);
8449 assign(op1, get_fpr_w0(r1));
8450 assign(op2, get_fpr_w0(r2));
8451 assign(result, triop(Iop_SubF32, mkU32(Irrm_NEAREST), mkexpr(op1),
8453 s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
8454 put_fpr_w0(r1, mkexpr(result));
8460 s390_irgen_SDBR(UChar r1, UChar r2)
8462 IRTemp op1 = newTemp(Ity_F64);
8463 IRTemp op2 = newTemp(Ity_F64);
8464 IRTemp result = newTemp(Ity_F64);
8466 assign(op1, get_fpr_dw0(r1));
8467 assign(op2, get_fpr_dw0(r2));
8468 assign(result, triop(Iop_SubF64, mkU32(Irrm_NEAREST), mkexpr(op1),
8470 s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
8471 put_fpr_dw0(r1, mkexpr(result));
8477 s390_irgen_SEB(UChar r1, IRTemp op2addr)
8479 IRTemp op1 = newTemp(Ity_F32);
8480 IRTemp op2 = newTemp(Ity_F32);
8481 IRTemp result = newTemp(Ity_F32);
8483 assign(op1, get_fpr_w0(r1));
8484 assign(op2, load(Ity_F32, mkexpr(op2addr)));
8485 assign(result, triop(Iop_SubF32, mkU32(Irrm_NEAREST), mkexpr(op1),
8487 s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_32, result);
8488 put_fpr_w0(r1, mkexpr(result));
8494 s390_irgen_SDB(UChar r1, IRTemp op2addr)
8496 IRTemp op1 = newTemp(Ity_F64);
8497 IRTemp op2 = newTemp(Ity_F64);
8498 IRTemp result = newTemp(Ity_F64);
8500 assign(op1, get_fpr_dw0(r1));
8501 assign(op2, load(Ity_F64, mkexpr(op2addr)));
8502 assign(result, triop(Iop_SubF64, mkU32(Irrm_NEAREST), mkexpr(op1),
8504 s390_cc_thunk_putF(S390_CC_OP_BFP_RESULT_64, result);
8505 put_fpr_dw0(r1, mkexpr(result));
8512 s390_irgen_CLC(UChar length, IRTemp start1, IRTemp start2)
8514 IRTemp current1 = newTemp(Ity_I8);
8515 IRTemp current2 = newTemp(Ity_I8);
8516 IRTemp counter = newTemp(Ity_I64);
8518 assign(counter, get_counter_dw0());
8519 put_counter_dw0(mkU64(0));
8521 assign(current1, load(Ity_I8, binop(Iop_Add64, mkexpr(start1),
8523 assign(current2, load(Ity_I8, binop(Iop_Add64, mkexpr(start2),
8525 s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, current1, current2,
8528 /* Both fields differ ? */
8529 if_condition_goto(binop(Iop_CmpNE8, mkexpr(current1), mkexpr(current2)),
8530 guest_IA_next_instr);
8532 /* Check for end of field */
8533 put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
8534 if_condition_goto(binop(Iop_CmpNE64, mkexpr(counter), mkU64(length)),
8535 guest_IA_curr_instr);
8536 put_counter_dw0(mkU64(0));
8542 s390_irgen_CLCLE(UChar r1, UChar r3, IRTemp pad2)
8544 IRTemp addr1, addr3, addr1_load, addr3_load, len1, len3, single1, single3;
8546 addr1 = newTemp(Ity_I64);
8547 addr3 = newTemp(Ity_I64);
8548 addr1_load = newTemp(Ity_I64);
8549 addr3_load = newTemp(Ity_I64);
8550 len1 = newTemp(Ity_I64);
8551 len3 = newTemp(Ity_I64);
8552 single1 = newTemp(Ity_I8);
8553 single3 = newTemp(Ity_I8);
8555 assign(addr1, get_gpr_dw0(r1));
8556 assign(len1, get_gpr_dw0(r1 + 1));
8557 assign(addr3, get_gpr_dw0(r3));
8558 assign(len3, get_gpr_dw0(r3 + 1));
8560 /* len1 == 0 and len3 == 0? Exit */
8562 if_condition_goto(binop(Iop_CmpEQ64,binop(Iop_Or64, mkexpr(len1),
8563 mkexpr(len3)), mkU64(0)),
8564 guest_IA_next_instr);
8566 /* A mux requires both ways to be possible. This is a way to prevent clcle
8567 from reading from addr1 if it should read from the pad. Since the pad
8568 has no address, just read from the instruction, we discard that anyway */
8570 IRExpr_Mux0X(unop(Iop_1Uto8,
8571 binop(Iop_CmpEQ64, mkexpr(len1), mkU64(0))),
8573 mkU64(guest_IA_curr_instr)));
8575 /* same for addr3 */
8577 IRExpr_Mux0X(unop(Iop_1Uto8,
8578 binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0))),
8580 mkU64(guest_IA_curr_instr)));
8583 IRExpr_Mux0X(unop(Iop_1Uto8,
8584 binop(Iop_CmpEQ64, mkexpr(len1), mkU64(0))),
8585 load(Ity_I8, mkexpr(addr1_load)),
8586 unop(Iop_64to8, mkexpr(pad2))));
8589 IRExpr_Mux0X(unop(Iop_1Uto8,
8590 binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0))),
8591 load(Ity_I8, mkexpr(addr3_load)),
8592 unop(Iop_64to8, mkexpr(pad2))));
8594 s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, single1, single3, False);
8595 /* Both fields differ ? */
8596 if_condition_goto(binop(Iop_CmpNE8, mkexpr(single1), mkexpr(single3)),
8597 guest_IA_next_instr);
8599 /* If a length in 0 we must not change this length and the address */
8601 IRExpr_Mux0X(unop(Iop_1Uto8,
8602 binop(Iop_CmpEQ64, mkexpr(len1), mkU64(0))),
8603 binop(Iop_Add64, mkexpr(addr1), mkU64(1)),
8607 IRExpr_Mux0X(unop(Iop_1Uto8,
8608 binop(Iop_CmpEQ64, mkexpr(len1), mkU64(0))),
8609 binop(Iop_Sub64, mkexpr(len1), mkU64(1)),
8613 IRExpr_Mux0X(unop(Iop_1Uto8,
8614 binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0))),
8615 binop(Iop_Add64, mkexpr(addr3), mkU64(1)),
8619 IRExpr_Mux0X(unop(Iop_1Uto8,
8620 binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0))),
8621 binop(Iop_Sub64, mkexpr(len3), mkU64(1)),
8624 /* The architecture requires that we exit with CC3 after a machine specific
8625 amount of bytes. We do that if len1+len3 % 4096 == 0 */
8627 if_condition_goto(binop(Iop_CmpEQ64,
8629 binop(Iop_Add64, mkexpr(len1), mkexpr(len3)),
8632 guest_IA_next_instr);
8634 always_goto(mkU64(guest_IA_curr_instr));
8639 s390_irgen_XC_EX(IRTemp length, IRTemp start1, IRTemp start2)
8641 IRTemp old1 = newTemp(Ity_I8);
8642 IRTemp old2 = newTemp(Ity_I8);
8643 IRTemp new1 = newTemp(Ity_I8);
8644 IRTemp counter = newTemp(Ity_I32);
8645 IRTemp addr1 = newTemp(Ity_I64);
8647 assign(counter, get_counter_w0());
8649 assign(addr1, binop(Iop_Add64, mkexpr(start1),
8650 unop(Iop_32Uto64, mkexpr(counter))));
8652 assign(old1, load(Ity_I8, mkexpr(addr1)));
8653 assign(old2, load(Ity_I8, binop(Iop_Add64, mkexpr(start2),
8654 unop(Iop_32Uto64,mkexpr(counter)))));
8655 assign(new1, binop(Iop_Xor8, mkexpr(old1), mkexpr(old2)));
8657 store(mkexpr(addr1),
8658 IRExpr_Mux0X(unop(Iop_1Uto8, binop(Iop_CmpEQ64, mkexpr(start1),
8660 mkexpr(new1), mkU8(0)));
8661 put_counter_w1(binop(Iop_Or32, unop(Iop_8Uto32, mkexpr(new1)),
8664 /* Check for end of field */
8665 put_counter_w0(binop(Iop_Add32, mkexpr(counter), mkU32(1)));
8666 if_condition_goto(binop(Iop_CmpNE32, mkexpr(counter), mkexpr(length)),
8667 guest_IA_curr_instr);
8668 s390_cc_thunk_put1(S390_CC_OP_BITWISE, mktemp(Ity_I32, get_counter_w1()),
8670 put_counter_dw0(mkU64(0));
8675 s390_irgen_CLC_EX(IRTemp length, IRTemp start1, IRTemp start2)
8677 IRTemp current1 = newTemp(Ity_I8);
8678 IRTemp current2 = newTemp(Ity_I8);
8679 IRTemp counter = newTemp(Ity_I64);
8681 assign(counter, get_counter_dw0());
8682 put_counter_dw0(mkU64(0));
8684 assign(current1, load(Ity_I8, binop(Iop_Add64, mkexpr(start1),
8686 assign(current2, load(Ity_I8, binop(Iop_Add64, mkexpr(start2),
8688 s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, current1, current2,
8691 /* Both fields differ ? */
8692 if_condition_goto(binop(Iop_CmpNE8, mkexpr(current1), mkexpr(current2)),
8693 guest_IA_next_instr);
8695 /* Check for end of field */
8696 put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
8697 if_condition_goto(binop(Iop_CmpNE64, mkexpr(counter), mkexpr(length)),
8698 guest_IA_curr_instr);
8699 put_counter_dw0(mkU64(0));
8703 s390_irgen_MVC_EX(IRTemp length, IRTemp start1, IRTemp start2)
8705 IRTemp counter = newTemp(Ity_I64);
8707 assign(counter, get_counter_dw0());
8709 store(binop(Iop_Add64, mkexpr(start1), mkexpr(counter)),
8710 load(Ity_I8, binop(Iop_Add64, mkexpr(start2), mkexpr(counter))));
8712 /* Check for end of field */
8713 put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
8714 if_condition_goto(binop(Iop_CmpNE64, mkexpr(counter), mkexpr(length)),
8715 guest_IA_curr_instr);
8716 put_counter_dw0(mkU64(0));
8722 s390_irgen_EX_SS(UChar r, IRTemp addr2,
8723 void (*irgen)(IRTemp length, IRTemp start1, IRTemp start2), int lensize)
8726 unsigned int op : 8;
8728 unsigned int b1 : 4;
8729 unsigned int d1 : 12;
8730 unsigned int b2 : 4;
8731 unsigned int d2 : 12;
8735 unsigned long bytes;
8741 IRTemp start1 = newTemp(Ity_I64);
8742 IRTemp start2 = newTemp(Ity_I64);
8743 IRTemp len = newTemp(lensize == 64 ? Ity_I64 : Ity_I32);
8744 cond = newTemp(Ity_I1);
8745 torun = newTemp(Ity_I64);
8747 assign(torun, load(Ity_I64, mkexpr(addr2)));
8748 /* Start with a check that the saved code is still correct */
8749 assign(cond, binop(Iop_CmpNE64, mkexpr(torun), mkU64(last_execute_target)));
8750 /* If not, save the new value */
8751 d = unsafeIRDirty_0_N (0, "s390x_dirtyhelper_EX", &s390x_dirtyhelper_EX,
8752 mkIRExprVec_1(mkexpr(torun)));
8753 d->guard = mkexpr(cond);
8754 stmt(IRStmt_Dirty(d));
8757 stmt(IRStmt_Put(OFFB_TISTART, mkU64(guest_IA_curr_instr)));
8758 stmt(IRStmt_Put(OFFB_TILEN, mkU64(4)));
8759 stmt(IRStmt_Exit(mkexpr(cond), Ijk_TInval,
8760 IRConst_U64(guest_IA_curr_instr)));
8762 ss.bytes = last_execute_target;
8763 assign(start1, binop(Iop_Add64, mkU64(ss.dec.d1),
8764 ss.dec.b1 != 0 ? get_gpr_dw0(ss.dec.b1) : mkU64(0)));
8765 assign(start2, binop(Iop_Add64, mkU64(ss.dec.d2),
8766 ss.dec.b2 != 0 ? get_gpr_dw0(ss.dec.b2) : mkU64(0)));
8767 assign(len, unop(lensize == 64 ? Iop_8Uto64 : Iop_8Uto32, binop(Iop_Or8,
8768 r != 0 ? get_gpr_b7(r): mkU8(0), mkU8(ss.dec.l))));
8769 irgen(len, start1, start2);
8770 last_execute_target = 0;
8774 s390_irgen_EX(UChar r1, IRTemp addr2)
8776 switch(last_execute_target & 0xff00000000000000ULL) {
8779 /* no code information yet */
8782 /* so safe the code... */
8783 d = unsafeIRDirty_0_N (0, "s390x_dirtyhelper_EX", &s390x_dirtyhelper_EX,
8784 mkIRExprVec_1(load(Ity_I64, mkexpr(addr2))));
8785 stmt(IRStmt_Dirty(d));
8787 stmt(IRStmt_Put(OFFB_TISTART, mkU64(guest_IA_curr_instr)));
8788 stmt(IRStmt_Put(OFFB_TILEN, mkU64(4)));
8789 stmt(IRStmt_Exit(IRExpr_Const(IRConst_U1(True)), Ijk_TInval,
8790 IRConst_U64(guest_IA_curr_instr)));
8791 /* we know that this will be invalidated */
8792 irsb->next = mkU64(guest_IA_next_instr);
8793 dis_res->whatNext = Dis_StopHere;
8797 case 0xd200000000000000ULL:
8798 /* special case MVC */
8799 s390_irgen_EX_SS(r1, addr2, s390_irgen_MVC_EX, 64);
8800 return "mvc via ex";
8802 case 0xd500000000000000ULL:
8803 /* special case CLC */
8804 s390_irgen_EX_SS(r1, addr2, s390_irgen_CLC_EX, 64);
8805 return "clc via ex";
8807 case 0xd700000000000000ULL:
8808 /* special case XC */
8809 s390_irgen_EX_SS(r1, addr2, s390_irgen_XC_EX, 32);
8815 /* everything else will get a self checking prefix that also checks the
8823 cond = newTemp(Ity_I1);
8824 orperand = newTemp(Ity_I64);
8825 torun = newTemp(Ity_I64);
8828 assign(orperand, mkU64(0));
8830 assign(orperand, unop(Iop_8Uto64,get_gpr_b7(r1)));
8831 /* This code is going to be translated */
8832 assign(torun, binop(Iop_Or64, load(Ity_I64, mkexpr(addr2)),
8833 binop(Iop_Shl64, mkexpr(orperand), mkU8(48))));
8835 /* Start with a check that saved code is still correct */
8836 assign(cond, binop(Iop_CmpNE64, mkexpr(torun),
8837 mkU64(last_execute_target)));
8838 /* If not, save the new value */
8839 d = unsafeIRDirty_0_N (0, "s390x_dirtyhelper_EX", &s390x_dirtyhelper_EX,
8840 mkIRExprVec_1(mkexpr(torun)));
8841 d->guard = mkexpr(cond);
8842 stmt(IRStmt_Dirty(d));
8845 stmt(IRStmt_Put(OFFB_TISTART, mkU64(guest_IA_curr_instr)));
8846 stmt(IRStmt_Put(OFFB_TILEN, mkU64(4)));
8847 stmt(IRStmt_Exit(mkexpr(cond), Ijk_TInval,
8848 IRConst_U64(guest_IA_curr_instr)));
8850 /* Now comes the actual translation */
8851 bytes = (UChar *) &last_execute_target;
8852 s390_decode_and_irgen(bytes, ((((bytes[0] >> 6) + 1) >> 1) + 1) << 1,
8854 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
8855 vex_printf(" which was executed by\n");
8856 /* dont make useless translations in the next execute */
8857 last_execute_target = 0;
8864 s390_irgen_EXRL(UChar r1, UInt offset)
8866 IRTemp addr = newTemp(Ity_I64);
8867 /* we might save one round trip because we know the target */
8868 if (!last_execute_target)
8869 last_execute_target = *(ULong *)(HWord)
8870 (guest_IA_curr_instr + offset * 2UL);
8871 assign(addr, mkU64(guest_IA_curr_instr + offset * 2UL));
8872 s390_irgen_EX(r1, addr);
8877 s390_irgen_IPM(UChar r1)
8879 // As long as we dont support SPM, lets just assume 0 as program mask
8880 put_gpr_b4(r1, unop(Iop_32to8, binop(Iop_Or32, mkU32(0 /* program mask */),
8881 binop(Iop_Shl32, s390_call_calculate_cc(), mkU8(4)))));
8888 s390_irgen_SRST(UChar r1, UChar r2)
8890 IRTemp address = newTemp(Ity_I64);
8891 IRTemp next = newTemp(Ity_I64);
8892 IRTemp delim = newTemp(Ity_I8);
8893 IRTemp counter = newTemp(Ity_I64);
8894 IRTemp byte = newTemp(Ity_I8);
8896 assign(address, get_gpr_dw0(r2));
8897 assign(next, get_gpr_dw0(r1));
8899 assign(counter, get_counter_dw0());
8900 put_counter_dw0(mkU64(0));
8902 // start = next? CC=2 and out r1 and r2 unchanged
8904 put_gpr_dw0(r2, binop(Iop_Sub64, mkexpr(address), mkexpr(counter)));
8905 if_condition_goto(binop(Iop_CmpEQ64, mkexpr(address), mkexpr(next)),
8906 guest_IA_next_instr);
8908 assign(byte, load(Ity_I8, mkexpr(address)));
8909 assign(delim, get_gpr_b7(0));
8911 // byte = delim? CC=1, R1=address
8913 put_gpr_dw0(r1, mkexpr(address));
8914 if_condition_goto(binop(Iop_CmpEQ8, mkexpr(delim), mkexpr(byte)),
8915 guest_IA_next_instr);
8917 // else: all equal, no end yet, loop
8918 put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
8919 put_gpr_dw0(r1, mkexpr(next));
8920 put_gpr_dw0(r2, binop(Iop_Add64, mkexpr(address), mkU64(1)));
8921 stmt(IRStmt_Exit(binop(Iop_CmpNE64, mkexpr(counter), mkU64(255)),
8922 Ijk_Boring, IRConst_U64(guest_IA_curr_instr)));
8923 // >= 256 bytes done CC=3
8925 put_counter_dw0(mkU64(0));
8931 s390_irgen_CLST(UChar r1, UChar r2)
8933 IRTemp address1 = newTemp(Ity_I64);
8934 IRTemp address2 = newTemp(Ity_I64);
8935 IRTemp end = newTemp(Ity_I8);
8936 IRTemp counter = newTemp(Ity_I64);
8937 IRTemp byte1 = newTemp(Ity_I8);
8938 IRTemp byte2 = newTemp(Ity_I8);
8940 assign(address1, get_gpr_dw0(r1));
8941 assign(address2, get_gpr_dw0(r2));
8942 assign(end, get_gpr_b7(0));
8943 assign(counter, get_counter_dw0());
8944 put_counter_dw0(mkU64(0));
8945 assign(byte1, load(Ity_I8, mkexpr(address1)));
8946 assign(byte2, load(Ity_I8, mkexpr(address2)));
8948 // end in both? all equal, reset r1 and r2 to start values
8950 put_gpr_dw0(r1, binop(Iop_Sub64, mkexpr(address1), mkexpr(counter)));
8951 put_gpr_dw0(r2, binop(Iop_Sub64, mkexpr(address2), mkexpr(counter)));
8952 if_condition_goto(binop(Iop_CmpEQ8, mkU8(0),
8954 binop(Iop_Xor8, mkexpr(byte1), mkexpr(end)),
8955 binop(Iop_Xor8, mkexpr(byte2), mkexpr(end)))),
8956 guest_IA_next_instr);
8958 put_gpr_dw0(r1, mkexpr(address1));
8959 put_gpr_dw0(r2, mkexpr(address2));
8961 // End found in string1
8963 if_condition_goto(binop(Iop_CmpEQ8, mkexpr(end), mkexpr(byte1)),
8964 guest_IA_next_instr);
8966 // End found in string2
8968 if_condition_goto(binop(Iop_CmpEQ8, mkexpr(end), mkexpr(byte2)),
8969 guest_IA_next_instr);
8971 // string1 < string2
8973 if_condition_goto(binop(Iop_CmpLT32U, unop(Iop_8Uto32, mkexpr(byte1)),
8974 unop(Iop_8Uto32, mkexpr(byte2))),
8975 guest_IA_next_instr);
8977 // string2 < string1
8979 if_condition_goto(binop(Iop_CmpLT32U, unop(Iop_8Uto32, mkexpr(byte2)),
8980 unop(Iop_8Uto32, mkexpr(byte1))),
8981 guest_IA_next_instr);
8983 // else: all equal, no end yet, loop
8984 put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
8985 put_gpr_dw0(r1, binop(Iop_Add64, get_gpr_dw0(r1), mkU64(1)));
8986 put_gpr_dw0(r2, binop(Iop_Add64, get_gpr_dw0(r2), mkU64(1)));
8987 stmt(IRStmt_Exit(binop(Iop_CmpNE64, mkexpr(counter), mkU64(255)),
8988 Ijk_Boring, IRConst_U64(guest_IA_curr_instr)));
8989 // >= 256 bytes done CC=3
8991 put_counter_dw0(mkU64(0));
8997 s390_irgen_load_multiple_32bit(UChar r1, UChar r3, IRTemp op2addr)
9000 IRTemp addr = newTemp(Ity_I64);
9002 assign(addr, mkexpr(op2addr));
9008 put_gpr_w1(reg, load(Ity_I32, mkexpr(addr)));
9009 addr = newTemp(Ity_I64);
9010 assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
9012 } while (reg != (r3 + 1));
9016 s390_irgen_LM(UChar r1, UChar r3, IRTemp op2addr)
9018 s390_irgen_load_multiple_32bit(r1, r3, op2addr);
9024 s390_irgen_LMY(UChar r1, UChar r3, IRTemp op2addr)
9026 s390_irgen_load_multiple_32bit(r1, r3, op2addr);
9032 s390_irgen_LMH(UChar r1, UChar r3, IRTemp op2addr)
9035 IRTemp addr = newTemp(Ity_I64);
9037 assign(addr, mkexpr(op2addr));
9043 put_gpr_w0(reg, load(Ity_I32, mkexpr(addr)));
9044 addr = newTemp(Ity_I64);
9045 assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
9047 } while (reg != (r3 + 1));
9053 s390_irgen_LMG(UChar r1, UChar r3, IRTemp op2addr)
9056 IRTemp addr = newTemp(Ity_I64);
9058 assign(addr, mkexpr(op2addr));
9064 put_gpr_dw0(reg, load(Ity_I64, mkexpr(addr)));
9065 addr = newTemp(Ity_I64);
9066 assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(8)));
9068 } while (reg != (r3 + 1));
9074 s390_irgen_store_multiple_32bit(UChar r1, UChar r3, IRTemp op2addr)
9077 IRTemp addr = newTemp(Ity_I64);
9079 assign(addr, mkexpr(op2addr));
9085 store(mkexpr(addr), get_gpr_w1(reg));
9086 addr = newTemp(Ity_I64);
9087 assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
9089 } while( reg != (r3 + 1));
9093 s390_irgen_STM(UChar r1, UChar r3, IRTemp op2addr)
9095 s390_irgen_store_multiple_32bit(r1, r3, op2addr);
9101 s390_irgen_STMY(UChar r1, UChar r3, IRTemp op2addr)
9103 s390_irgen_store_multiple_32bit(r1, r3, op2addr);
9109 s390_irgen_STMH(UChar r1, UChar r3, IRTemp op2addr)
9112 IRTemp addr = newTemp(Ity_I64);
9114 assign(addr, mkexpr(op2addr));
9120 store(mkexpr(addr), get_gpr_w0(reg));
9121 addr = newTemp(Ity_I64);
9122 assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
9124 } while( reg != (r3 + 1));
9130 s390_irgen_STMG(UChar r1, UChar r3, IRTemp op2addr)
9133 IRTemp addr = newTemp(Ity_I64);
9135 assign(addr, mkexpr(op2addr));
9141 store(mkexpr(addr), get_gpr_dw0(reg));
9142 addr = newTemp(Ity_I64);
9143 assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(8)));
9145 } while( reg != (r3 + 1));
9151 s390_irgen_XONC(IROp op, UChar length, IRTemp start1, IRTemp start2)
9153 IRTemp old1 = newTemp(Ity_I8);
9154 IRTemp old2 = newTemp(Ity_I8);
9155 IRTemp new1 = newTemp(Ity_I8);
9156 IRTemp counter = newTemp(Ity_I32);
9157 IRTemp addr1 = newTemp(Ity_I64);
9159 assign(counter, get_counter_w0());
9161 assign(addr1, binop(Iop_Add64, mkexpr(start1),
9162 unop(Iop_32Uto64, mkexpr(counter))));
9164 assign(old1, load(Ity_I8, mkexpr(addr1)));
9165 assign(old2, load(Ity_I8, binop(Iop_Add64, mkexpr(start2),
9166 unop(Iop_32Uto64,mkexpr(counter)))));
9167 assign(new1, binop(op, mkexpr(old1), mkexpr(old2)));
9169 /* Special case: xc is used to zero memory */
9170 if (op == Iop_Xor8) {
9171 store(mkexpr(addr1),
9172 IRExpr_Mux0X(unop(Iop_1Uto8, binop(Iop_CmpEQ64, mkexpr(start1),
9174 mkexpr(new1), mkU8(0)));
9176 store(mkexpr(addr1), mkexpr(new1));
9177 put_counter_w1(binop(Iop_Or32, unop(Iop_8Uto32, mkexpr(new1)),
9180 /* Check for end of field */
9181 put_counter_w0(binop(Iop_Add32, mkexpr(counter), mkU32(1)));
9182 if_condition_goto(binop(Iop_CmpNE32, mkexpr(counter), mkU32(length)),
9183 guest_IA_curr_instr);
9184 s390_cc_thunk_put1(S390_CC_OP_BITWISE, mktemp(Ity_I32, get_counter_w1()),
9186 put_counter_dw0(mkU64(0));
9190 s390_irgen_XC(UChar length, IRTemp start1, IRTemp start2)
9192 s390_irgen_XONC(Iop_Xor8, length, start1, start2);
9198 s390_irgen_XC_sameloc(UChar length, UChar b, UShort d)
9200 IRTemp counter = newTemp(Ity_I32);
9201 IRTemp start = newTemp(Ity_I64);
9202 IRTemp addr = newTemp(Ity_I64);
9205 binop(Iop_Add64, mkU64(d), b != 0 ? get_gpr_dw0(b) : mkU64(0)));
9210 for (i = 0; i <= length; ++i) {
9211 store(binop(Iop_Add64, mkexpr(start), mkU64(i)), mkU8(0));
9214 assign(counter, get_counter_w0());
9216 assign(addr, binop(Iop_Add64, mkexpr(start),
9217 unop(Iop_32Uto64, mkexpr(counter))));
9219 store(mkexpr(addr), mkU8(0));
9221 /* Check for end of field */
9222 put_counter_w0(binop(Iop_Add32, mkexpr(counter), mkU32(1)));
9223 if_condition_goto(binop(Iop_CmpNE32, mkexpr(counter), mkU32(length)),
9224 guest_IA_curr_instr);
9227 put_counter_dw0(mkU64(0));
9230 s390_cc_thunk_put1(S390_CC_OP_BITWISE, mktemp(Ity_I32, mkU32(0)), False);
9232 if (UNLIKELY(vex_traceflags & VEX_TRACE_FE))
9233 s390_disasm(ENC3(MNM, UDLB, UDXB), "xc", d, length, b, d, 0, b);
9237 s390_irgen_NC(UChar length, IRTemp start1, IRTemp start2)
9239 s390_irgen_XONC(Iop_And8, length, start1, start2);
9245 s390_irgen_OC(UChar length, IRTemp start1, IRTemp start2)
9247 s390_irgen_XONC(Iop_Or8, length, start1, start2);
9254 s390_irgen_MVC(UChar length, IRTemp start1, IRTemp start2)
9256 IRTemp counter = newTemp(Ity_I64);
9258 assign(counter, get_counter_dw0());
9260 store(binop(Iop_Add64, mkexpr(start1), mkexpr(counter)),
9261 load(Ity_I8, binop(Iop_Add64, mkexpr(start2), mkexpr(counter))));
9263 /* Check for end of field */
9264 put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
9265 if_condition_goto(binop(Iop_CmpNE64, mkexpr(counter), mkU64(length)),
9266 guest_IA_curr_instr);
9267 put_counter_dw0(mkU64(0));
9273 s390_irgen_MVCLE(UChar r1, UChar r3, IRTemp pad2)
9275 IRTemp addr1, addr3, addr3_load, len1, len3, single;
9277 addr1 = newTemp(Ity_I64);
9278 addr3 = newTemp(Ity_I64);
9279 addr3_load = newTemp(Ity_I64);
9280 len1 = newTemp(Ity_I64);
9281 len3 = newTemp(Ity_I64);
9282 single = newTemp(Ity_I8);
9284 assign(addr1, get_gpr_dw0(r1));
9285 assign(len1, get_gpr_dw0(r1 + 1));
9286 assign(addr3, get_gpr_dw0(r3));
9287 assign(len3, get_gpr_dw0(r3 + 1));
9290 s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, len1, len3, False);
9291 if_condition_goto(binop(Iop_CmpEQ64,mkexpr(len1), mkU64(0)),
9292 guest_IA_next_instr);
9294 /* This is a hack to prevent mvcle from reading from addr3 if it
9295 should read from the pad. Since the pad has no address, just
9296 read from the instruction, we discard that anyway */
9298 IRExpr_Mux0X(unop(Iop_1Uto8, binop(Iop_CmpEQ64, mkexpr(len3),
9301 mkU64(guest_IA_curr_instr)));
9304 IRExpr_Mux0X(unop(Iop_1Uto8, binop(Iop_CmpEQ64, mkexpr(len3),
9306 load(Ity_I8, mkexpr(addr3_load)),
9307 unop(Iop_64to8, mkexpr(pad2))));
9308 store(mkexpr(addr1), mkexpr(single));
9310 put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(addr1), mkU64(1)));
9312 put_gpr_dw0(r1 + 1, binop(Iop_Sub64, mkexpr(len1), mkU64(1)));
9315 IRExpr_Mux0X(unop(Iop_1Uto8, binop(Iop_CmpEQ64, mkexpr(len3),
9317 binop(Iop_Add64, mkexpr(addr3), mkU64(1)),
9321 IRExpr_Mux0X(unop(Iop_1Uto8, binop(Iop_CmpEQ64, mkexpr(len3),
9323 binop(Iop_Sub64, mkexpr(len3), mkU64(1)),
9326 /* We should set CC=3 (faked by overflow add) and leave after
9327 a maximum of ~4096 bytes have been processed. This is simpler:
9328 we leave whenever (len1 % 4096) == 0 */
9329 s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_ADD_64, mktemp(Ity_I64, mkU64(-1ULL)),
9331 mktemp(Ity_I64, mkU64(-1ULL)), False);
9332 if_condition_goto(binop(Iop_CmpEQ64,
9333 binop(Iop_And64, mkexpr(len1), mkU64(0xfff)),
9335 guest_IA_next_instr);
9337 s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, len1, len3, False);
9338 if_condition_goto(binop(Iop_CmpNE64, mkexpr(len1), mkU64(1)),
9339 guest_IA_curr_instr);
9345 s390_irgen_MVST(UChar r1, UChar r2)
9347 IRTemp addr1 = newTemp(Ity_I64);
9348 IRTemp addr2 = newTemp(Ity_I64);
9349 IRTemp end = newTemp(Ity_I8);
9350 IRTemp byte = newTemp(Ity_I8);
9351 IRTemp counter = newTemp(Ity_I64);
9353 assign(addr1, get_gpr_dw0(r1));
9354 assign(addr2, get_gpr_dw0(r2));
9355 assign(counter, get_counter_dw0());
9356 assign(end, get_gpr_b7(0));
9357 assign(byte, load(Ity_I8, binop(Iop_Add64, mkexpr(addr2),mkexpr(counter))));
9358 store(binop(Iop_Add64,mkexpr(addr1),mkexpr(counter)), mkexpr(byte));
9360 // We use unlimited as cpu-determined number
9361 put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
9362 if_condition_goto(binop(Iop_CmpNE8, mkexpr(end), mkexpr(byte)),
9363 guest_IA_curr_instr);
9365 // and always set cc=1 at the end + update r1
9367 put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(addr1), mkexpr(counter)));
9368 put_counter_dw0(mkU64(0));
9374 s390_irgen_divide_64to32(IROp op, UChar r1, IRTemp op2)
9376 IRTemp op1 = newTemp(Ity_I64);
9377 IRTemp result = newTemp(Ity_I64);
9379 assign(op1, binop(Iop_32HLto64,
9380 get_gpr_w1(r1), // high 32 bits
9381 get_gpr_w1(r1 + 1))); // low 32 bits
9382 assign(result, binop(op, mkexpr(op1), mkexpr(op2)));
9383 put_gpr_w1(r1, unop(Iop_64HIto32, mkexpr(result))); // remainder
9384 put_gpr_w1(r1 + 1, unop(Iop_64to32, mkexpr(result))); // quotient
9388 s390_irgen_divide_128to64(IROp op, UChar r1, IRTemp op2)
9390 IRTemp op1 = newTemp(Ity_I128);
9391 IRTemp result = newTemp(Ity_I128);
9393 assign(op1, binop(Iop_64HLto128,
9394 get_gpr_dw0(r1), // high 64 bits
9395 get_gpr_dw0(r1 + 1))); // low 64 bits
9396 assign(result, binop(op, mkexpr(op1), mkexpr(op2)));
9397 put_gpr_dw0(r1, unop(Iop_128HIto64, mkexpr(result))); // remainder
9398 put_gpr_dw0(r1 + 1, unop(Iop_128to64, mkexpr(result))); // quotient
9402 s390_irgen_divide_64to64(IROp op, UChar r1, IRTemp op2)
9404 IRTemp op1 = newTemp(Ity_I64);
9405 IRTemp result = newTemp(Ity_I128);
9407 assign(op1, get_gpr_dw0(r1 + 1));
9408 assign(result, binop(op, mkexpr(op1), mkexpr(op2)));
9409 put_gpr_dw0(r1, unop(Iop_128HIto64, mkexpr(result))); // remainder
9410 put_gpr_dw0(r1 + 1, unop(Iop_128to64, mkexpr(result))); // quotient
9414 s390_irgen_DR(UChar r1, UChar r2)
9416 IRTemp op2 = newTemp(Ity_I32);
9418 assign(op2, get_gpr_w1(r2));
9420 s390_irgen_divide_64to32(Iop_DivModS64to32, r1, op2);
9426 s390_irgen_D(UChar r1, IRTemp op2addr)
9428 IRTemp op2 = newTemp(Ity_I32);
9430 assign(op2, load(Ity_I32, mkexpr(op2addr)));
9432 s390_irgen_divide_64to32(Iop_DivModS64to32, r1, op2);
9438 s390_irgen_DLR(UChar r1, UChar r2)
9440 IRTemp op2 = newTemp(Ity_I32);
9442 assign(op2, get_gpr_w1(r2));
9444 s390_irgen_divide_64to32(Iop_DivModU64to32, r1, op2);
9450 s390_irgen_DL(UChar r1, IRTemp op2addr)
9452 IRTemp op2 = newTemp(Ity_I32);
9454 assign(op2, load(Ity_I32, mkexpr(op2addr)));
9456 s390_irgen_divide_64to32(Iop_DivModU64to32, r1, op2);
9462 s390_irgen_DLG(UChar r1, IRTemp op2addr)
9464 IRTemp op2 = newTemp(Ity_I64);
9466 assign(op2, load(Ity_I64, mkexpr(op2addr)));
9468 s390_irgen_divide_128to64(Iop_DivModU128to64, r1, op2);
9474 s390_irgen_DLGR(UChar r1, UChar r2)
9476 IRTemp op2 = newTemp(Ity_I64);
9478 assign(op2, get_gpr_dw0(r2));
9480 s390_irgen_divide_128to64(Iop_DivModU128to64, r1, op2);
9486 s390_irgen_DSGR(UChar r1, UChar r2)
9488 IRTemp op2 = newTemp(Ity_I64);
9490 assign(op2, get_gpr_dw0(r2));
9492 s390_irgen_divide_64to64(Iop_DivModS64to64, r1, op2);
9498 s390_irgen_DSG(UChar r1, IRTemp op2addr)
9500 IRTemp op2 = newTemp(Ity_I64);
9502 assign(op2, load(Ity_I64, mkexpr(op2addr)));
9504 s390_irgen_divide_64to64(Iop_DivModS64to64, r1, op2);
9510 s390_irgen_DSGFR(UChar r1, UChar r2)
9512 IRTemp op2 = newTemp(Ity_I64);
9514 assign(op2, unop(Iop_32Sto64, get_gpr_w1(r2)));
9516 s390_irgen_divide_64to64(Iop_DivModS64to64, r1, op2);
9522 s390_irgen_DSGF(UChar r1, IRTemp op2addr)
9524 IRTemp op2 = newTemp(Ity_I64);
9526 assign(op2, unop(Iop_32Sto64, load(Ity_I32, mkexpr(op2addr))));
9528 s390_irgen_divide_64to64(Iop_DivModS64to64, r1, op2);
9534 s390_irgen_load_ar_multiple(UChar r1, UChar r3, IRTemp op2addr)
9537 IRTemp addr = newTemp(Ity_I64);
9539 assign(addr, mkexpr(op2addr));
9545 put_ar_w0(reg, load(Ity_I32, mkexpr(addr)));
9546 addr = newTemp(Ity_I64);
9547 assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
9549 } while (reg != (r3 + 1));
9553 s390_irgen_LAM(UChar r1, UChar r3, IRTemp op2addr)
9555 s390_irgen_load_ar_multiple(r1, r3, op2addr);
9561 s390_irgen_LAMY(UChar r1, UChar r3, IRTemp op2addr)
9563 s390_irgen_load_ar_multiple(r1, r3, op2addr);
9569 s390_irgen_store_ar_multiple(UChar r1, UChar r3, IRTemp op2addr)
9572 IRTemp addr = newTemp(Ity_I64);
9574 assign(addr, mkexpr(op2addr));
9580 store(mkexpr(addr), get_ar_w0(reg));
9581 addr = newTemp(Ity_I64);
9582 assign(addr, binop(Iop_Add64, mkexpr(old), mkU64(4)));
9584 } while (reg != (r3 + 1));
9588 s390_irgen_STAM(UChar r1, UChar r3, IRTemp op2addr)
9590 s390_irgen_store_ar_multiple(r1, r3, op2addr);
9596 s390_irgen_STAMY(UChar r1, UChar r3, IRTemp op2addr)
9598 s390_irgen_store_ar_multiple(r1, r3, op2addr);
9604 /* Implementation for 32-bit compare-and-swap */
9606 s390_irgen_cas_32(UChar r1, UChar r3, IRTemp op2addr)
9609 IRTemp op1 = newTemp(Ity_I32);
9610 IRTemp old_mem = newTemp(Ity_I32);
9611 IRTemp op3 = newTemp(Ity_I32);
9612 IRTemp result = newTemp(Ity_I32);
9613 IRTemp nequal = newTemp(Ity_I1);
9615 assign(op1, get_gpr_w1(r1));
9616 assign(op3, get_gpr_w1(r3));
9618 /* The first and second operands are compared. If they are equal,
9619 the third operand is stored at the second- operand location. */
9620 cas = mkIRCAS(IRTemp_INVALID, old_mem,
9621 Iend_BE, mkexpr(op2addr),
9622 NULL, mkexpr(op1), /* expected value */
9623 NULL, mkexpr(op3) /* new value */);
9624 stmt(IRStmt_CAS(cas));
9626 /* Set CC. Operands compared equal -> 0, else 1. */
9627 assign(result, binop(Iop_Sub32, mkexpr(op1), mkexpr(old_mem)));
9628 s390_cc_thunk_put1(S390_CC_OP_BITWISE, result, False);
9630 /* If operands were equal (cc == 0) just store the old value op1 in r1.
9631 Otherwise, store the old_value from memory in r1 and yield. */
9632 assign(nequal, binop(Iop_CmpNE32, s390_call_calculate_cc(), mkU32(0)));
9633 put_gpr_w1(r1, mkite(mkexpr(nequal), mkexpr(old_mem), mkexpr(op1)));
9634 stmt(IRStmt_Exit(mkexpr(nequal), Ijk_Yield,
9635 IRConst_U64(guest_IA_next_instr)));
9639 s390_irgen_CS(UChar r1, UChar r3, IRTemp op2addr)
9641 s390_irgen_cas_32(r1, r3, op2addr);
9647 s390_irgen_CSY(UChar r1, UChar r3, IRTemp op2addr)
9649 s390_irgen_cas_32(r1, r3, op2addr);
9655 s390_irgen_CSG(UChar r1, UChar r3, IRTemp op2addr)
9658 IRTemp op1 = newTemp(Ity_I64);
9659 IRTemp old_mem = newTemp(Ity_I64);
9660 IRTemp op3 = newTemp(Ity_I64);
9661 IRTemp result = newTemp(Ity_I64);
9662 IRTemp nequal = newTemp(Ity_I1);
9664 assign(op1, get_gpr_dw0(r1));
9665 assign(op3, get_gpr_dw0(r3));
9667 /* The first and second operands are compared. If they are equal,
9668 the third operand is stored at the second- operand location. */
9669 cas = mkIRCAS(IRTemp_INVALID, old_mem,
9670 Iend_BE, mkexpr(op2addr),
9671 NULL, mkexpr(op1), /* expected value */
9672 NULL, mkexpr(op3) /* new value */);
9673 stmt(IRStmt_CAS(cas));
9675 /* Set CC. Operands compared equal -> 0, else 1. */
9676 assign(result, binop(Iop_Sub64, mkexpr(op1), mkexpr(old_mem)));
9677 s390_cc_thunk_put1(S390_CC_OP_BITWISE, result, False);
9679 /* If operands were equal (cc == 0) just store the old value op1 in r1.
9680 Otherwise, store the old_value from memory in r1 and yield. */
9681 assign(nequal, binop(Iop_CmpNE32, s390_call_calculate_cc(), mkU32(0)));
9682 put_gpr_dw0(r1, mkite(mkexpr(nequal), mkexpr(old_mem), mkexpr(op1)));
9683 stmt(IRStmt_Exit(mkexpr(nequal), Ijk_Yield,
9684 IRConst_U64(guest_IA_next_instr)));
9690 /* Binary floating point */
9693 s390_irgen_AXBR(UChar r1, UChar r2)
9695 IRTemp op1 = newTemp(Ity_F128);
9696 IRTemp op2 = newTemp(Ity_F128);
9697 IRTemp result = newTemp(Ity_F128);
9699 assign(op1, get_fpr_pair(r1));
9700 assign(op2, get_fpr_pair(r2));
9701 assign(result, triop(Iop_AddF128, mkU32(Irrm_NEAREST), mkexpr(op1),
9703 put_fpr_pair(r1, mkexpr(result));
9705 s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
9710 /* The result of a Iop_CmdFxx operation is a condition code. It is
9711 encoded using the values defined in type IRCmpFxxResult.
9712 Before we can store the condition code into the guest state (or do
9713 anything else with it for that matter) we need to convert it to
9714 the encoding that s390 uses. This is what this function does.
9716 s390 VEX b6 b2 b0 cc.1 cc.0
9720 3 0x45 Unordered 1 1 1 1 1
9722 The following bits from the VEX encoding are interesting:
9723 b0, b2, b6 with b0 being the LSB. We observe:
9726 cc.1 = b2 | (~b0 & ~b6)
9728 with cc being the s390 condition code.
9731 convert_vex_fpcc_to_s390(IRTemp vex_cc)
9733 IRTemp cc0 = newTemp(Ity_I32);
9734 IRTemp cc1 = newTemp(Ity_I32);
9735 IRTemp b0 = newTemp(Ity_I32);
9736 IRTemp b2 = newTemp(Ity_I32);
9737 IRTemp b6 = newTemp(Ity_I32);
9739 assign(b0, binop(Iop_And32, mkexpr(vex_cc), mkU32(1)));
9740 assign(b2, binop(Iop_And32, binop(Iop_Shr32, mkexpr(vex_cc), mkU8(2)),
9742 assign(b6, binop(Iop_And32, binop(Iop_Shr32, mkexpr(vex_cc), mkU8(6)),
9745 assign(cc0, mkexpr(b0));
9746 assign(cc1, binop(Iop_Or32, mkexpr(b2),
9748 binop(Iop_Sub32, mkU32(1), mkexpr(b0)), /* ~b0 */
9749 binop(Iop_Sub32, mkU32(1), mkexpr(b6)) /* ~b6 */
9752 return binop(Iop_Or32, mkexpr(cc0), binop(Iop_Shl32, mkexpr(cc1), mkU8(1)));
9756 s390_irgen_CEBR(UChar r1, UChar r2)
9758 IRTemp op1 = newTemp(Ity_F32);
9759 IRTemp op2 = newTemp(Ity_F32);
9760 IRTemp cc_vex = newTemp(Ity_I32);
9761 IRTemp cc_s390 = newTemp(Ity_I32);
9763 assign(op1, get_fpr_w0(r1));
9764 assign(op2, get_fpr_w0(r2));
9765 assign(cc_vex, binop(Iop_CmpF32, mkexpr(op1), mkexpr(op2)));
9767 assign(cc_s390, convert_vex_fpcc_to_s390(cc_vex));
9768 s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
9774 s390_irgen_CDBR(UChar r1, UChar r2)
9776 IRTemp op1 = newTemp(Ity_F64);
9777 IRTemp op2 = newTemp(Ity_F64);
9778 IRTemp cc_vex = newTemp(Ity_I32);
9779 IRTemp cc_s390 = newTemp(Ity_I32);
9781 assign(op1, get_fpr_dw0(r1));
9782 assign(op2, get_fpr_dw0(r2));
9783 assign(cc_vex, binop(Iop_CmpF64, mkexpr(op1), mkexpr(op2)));
9785 assign(cc_s390, convert_vex_fpcc_to_s390(cc_vex));
9786 s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
9792 s390_irgen_CXBR(UChar r1, UChar r2)
9794 IRTemp op1 = newTemp(Ity_F128);
9795 IRTemp op2 = newTemp(Ity_F128);
9796 IRTemp cc_vex = newTemp(Ity_I32);
9797 IRTemp cc_s390 = newTemp(Ity_I32);
9799 assign(op1, get_fpr_pair(r1));
9800 assign(op2, get_fpr_pair(r2));
9801 assign(cc_vex, binop(Iop_CmpF128, mkexpr(op1), mkexpr(op2)));
9803 assign(cc_s390, convert_vex_fpcc_to_s390(cc_vex));
9804 s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
9810 s390_irgen_CEB(UChar r1, IRTemp op2addr)
9812 IRTemp op1 = newTemp(Ity_F32);
9813 IRTemp op2 = newTemp(Ity_F32);
9814 IRTemp cc_vex = newTemp(Ity_I32);
9815 IRTemp cc_s390 = newTemp(Ity_I32);
9817 assign(op1, get_fpr_w0(r1));
9818 assign(op2, load(Ity_F32, mkexpr(op2addr)));
9819 assign(cc_vex, binop(Iop_CmpF32, mkexpr(op1), mkexpr(op2)));
9821 assign(cc_s390, convert_vex_fpcc_to_s390(cc_vex));
9822 s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
9828 s390_irgen_CDB(UChar r1, IRTemp op2addr)
9830 IRTemp op1 = newTemp(Ity_F64);
9831 IRTemp op2 = newTemp(Ity_F64);
9832 IRTemp cc_vex = newTemp(Ity_I32);
9833 IRTemp cc_s390 = newTemp(Ity_I32);
9835 assign(op1, get_fpr_dw0(r1));
9836 assign(op2, load(Ity_F64, mkexpr(op2addr)));
9837 assign(cc_vex, binop(Iop_CmpF64, mkexpr(op1), mkexpr(op2)));
9839 assign(cc_s390, convert_vex_fpcc_to_s390(cc_vex));
9840 s390_cc_thunk_put1(S390_CC_OP_SET, cc_s390, False);
9846 s390_irgen_CXFBR(UChar r1, UChar r2)
9848 IRTemp op2 = newTemp(Ity_I32);
9850 assign(op2, get_gpr_w1(r2));
9851 put_fpr_pair(r1, unop(Iop_I32StoF128, mkexpr(op2)));
9857 s390_irgen_CXGBR(UChar r1, UChar r2)
9859 IRTemp op2 = newTemp(Ity_I64);
9861 assign(op2, get_gpr_dw0(r2));
9862 put_fpr_pair(r1, unop(Iop_I64StoF128, mkexpr(op2)));
9868 s390_irgen_CFXBR(UChar r3, UChar r1, UChar r2)
9870 IRTemp op = newTemp(Ity_F128);
9871 IRTemp result = newTemp(Ity_I32);
9873 assign(op, get_fpr_pair(r2));
9874 assign(result, binop(Iop_F128toI32S, mkU32(encode_rounding_mode(r3)),
9876 put_gpr_w1(r1, mkexpr(result));
9877 s390_cc_thunk_put1f128(S390_CC_OP_BFP_128_TO_INT_32, op);
9883 s390_irgen_CGXBR(UChar r3, UChar r1, UChar r2)
9885 IRTemp op = newTemp(Ity_F128);
9886 IRTemp result = newTemp(Ity_I64);
9888 assign(op, get_fpr_pair(r2));
9889 assign(result, binop(Iop_F128toI64S, mkU32(encode_rounding_mode(r3)),
9891 put_gpr_dw0(r1, mkexpr(result));
9892 s390_cc_thunk_put1f128(S390_CC_OP_BFP_128_TO_INT_64, op);
9898 s390_irgen_DXBR(UChar r1, UChar r2)
9900 IRTemp op1 = newTemp(Ity_F128);
9901 IRTemp op2 = newTemp(Ity_F128);
9902 IRTemp result = newTemp(Ity_F128);
9904 assign(op1, get_fpr_pair(r1));
9905 assign(op2, get_fpr_pair(r2));
9906 assign(result, triop(Iop_DivF128, mkU32(Irrm_NEAREST), mkexpr(op1),
9908 put_fpr_pair(r1, mkexpr(result));
9914 s390_irgen_LTXBR(UChar r1, UChar r2)
9916 IRTemp result = newTemp(Ity_F128);
9918 assign(result, get_fpr_pair(r2));
9919 put_fpr_pair(r1, mkexpr(result));
9920 s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
9926 s390_irgen_LCXBR(UChar r1, UChar r2)
9928 IRTemp result = newTemp(Ity_F128);
9930 assign(result, unop(Iop_NegF128, get_fpr_pair(r2)));
9931 put_fpr_pair(r1, mkexpr(result));
9932 s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
9938 s390_irgen_LXDBR(UChar r1, UChar r2)
9940 IRTemp op = newTemp(Ity_F64);
9942 assign(op, get_fpr_dw0(r2));
9943 put_fpr_pair(r1, unop(Iop_F64toF128, mkexpr(op)));
9949 s390_irgen_LXEBR(UChar r1, UChar r2)
9951 IRTemp op = newTemp(Ity_F32);
9953 assign(op, get_fpr_w0(r2));
9954 put_fpr_pair(r1, unop(Iop_F32toF128, mkexpr(op)));
9960 s390_irgen_LXDB(UChar r1, IRTemp op2addr)
9962 IRTemp op = newTemp(Ity_F64);
9964 assign(op, load(Ity_F64, mkexpr(op2addr)));
9965 put_fpr_pair(r1, unop(Iop_F64toF128, mkexpr(op)));
9971 s390_irgen_LXEB(UChar r1, IRTemp op2addr)
9973 IRTemp op = newTemp(Ity_F32);
9975 assign(op, load(Ity_F32, mkexpr(op2addr)));
9976 put_fpr_pair(r1, unop(Iop_F32toF128, mkexpr(op)));
9982 s390_irgen_LNEBR(UChar r1, UChar r2)
9984 IRTemp result = newTemp(Ity_F32);
9986 assign(result, unop(Iop_NegF32, unop(Iop_AbsF32, get_fpr_w0(r2))));
9987 put_fpr_w0(r1, mkexpr(result));
9988 s390_cc_thunk_put1f(S390_CC_OP_BFP_RESULT_32, result);
9994 s390_irgen_LNDBR(UChar r1, UChar r2)
9996 IRTemp result = newTemp(Ity_F64);
9998 assign(result, unop(Iop_NegF64, unop(Iop_AbsF64, get_fpr_dw0(r2))));
9999 put_fpr_dw0(r1, mkexpr(result));
10000 s390_cc_thunk_put1f(S390_CC_OP_BFP_RESULT_64, result);
10006 s390_irgen_LNXBR(UChar r1, UChar r2)
10008 IRTemp result = newTemp(Ity_F128);
10010 assign(result, unop(Iop_NegF128, unop(Iop_AbsF128, get_fpr_pair(r2))));
10011 put_fpr_pair(r1, mkexpr(result));
10012 s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
10018 s390_irgen_LPEBR(UChar r1, UChar r2)
10020 IRTemp result = newTemp(Ity_F32);
10022 assign(result, unop(Iop_AbsF32, get_fpr_w0(r2)));
10023 put_fpr_w0(r1, mkexpr(result));
10024 s390_cc_thunk_put1f(S390_CC_OP_BFP_RESULT_32, result);
10030 s390_irgen_LPDBR(UChar r1, UChar r2)
10032 IRTemp result = newTemp(Ity_F64);
10034 assign(result, unop(Iop_AbsF64, get_fpr_dw0(r2)));
10035 put_fpr_dw0(r1, mkexpr(result));
10036 s390_cc_thunk_put1f(S390_CC_OP_BFP_RESULT_64, result);
10042 s390_irgen_LPXBR(UChar r1, UChar r2)
10044 IRTemp result = newTemp(Ity_F128);
10046 assign(result, unop(Iop_AbsF128, get_fpr_pair(r2)));
10047 put_fpr_pair(r1, mkexpr(result));
10048 s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
10054 s390_irgen_LDXBR(UChar r1, UChar r2)
10056 IRTemp result = newTemp(Ity_F64);
10058 assign(result, binop(Iop_F128toF64, mkU32(Irrm_NEAREST), get_fpr_pair(r2)));
10059 put_fpr_dw0(r1, mkexpr(result));
10065 s390_irgen_LEXBR(UChar r1, UChar r2)
10067 IRTemp result = newTemp(Ity_F32);
10069 assign(result, binop(Iop_F128toF32, mkU32(Irrm_NEAREST), get_fpr_pair(r2)));
10070 put_fpr_w0(r1, mkexpr(result));
10076 s390_irgen_MXBR(UChar r1, UChar r2)
10078 IRTemp op1 = newTemp(Ity_F128);
10079 IRTemp op2 = newTemp(Ity_F128);
10080 IRTemp result = newTemp(Ity_F128);
10082 assign(op1, get_fpr_pair(r1));
10083 assign(op2, get_fpr_pair(r2));
10084 assign(result, triop(Iop_MulF128, mkU32(Irrm_NEAREST), mkexpr(op1),
10086 put_fpr_pair(r1, mkexpr(result));
10092 s390_irgen_MAEBR(UChar r1, UChar r3, UChar r2)
10094 put_fpr_w0(r1, qop(Iop_MAddF32, mkU32(Irrm_NEAREST),
10095 get_fpr_w0(r1), get_fpr_w0(r2), get_fpr_w0(r3)));
10101 s390_irgen_MADBR(UChar r1, UChar r3, UChar r2)
10103 put_fpr_dw0(r1, qop(Iop_MAddF64, mkU32(Irrm_NEAREST),
10104 get_fpr_dw0(r1), get_fpr_dw0(r2), get_fpr_dw0(r3)));
10110 s390_irgen_MAEB(UChar r3, IRTemp op2addr, UChar r1)
10112 IRExpr *op2 = load(Ity_F32, mkexpr(op2addr));
10114 put_fpr_w0(r1, qop(Iop_MAddF32, mkU32(Irrm_NEAREST),
10115 get_fpr_w0(r1), op2, get_fpr_w0(r3)));
10121 s390_irgen_MADB(UChar r3, IRTemp op2addr, UChar r1)
10123 IRExpr *op2 = load(Ity_F64, mkexpr(op2addr));
10125 put_fpr_dw0(r1, qop(Iop_MAddF64, mkU32(Irrm_NEAREST),
10126 get_fpr_dw0(r1), op2, get_fpr_dw0(r3)));
10132 s390_irgen_MSEBR(UChar r1, UChar r3, UChar r2)
10134 put_fpr_w0(r1, qop(Iop_MSubF32, mkU32(Irrm_NEAREST),
10135 get_fpr_w0(r1), get_fpr_w0(r2), get_fpr_w0(r3)));
10141 s390_irgen_MSDBR(UChar r1, UChar r3, UChar r2)
10143 put_fpr_dw0(r1, qop(Iop_MSubF64, mkU32(Irrm_NEAREST),
10144 get_fpr_dw0(r1), get_fpr_dw0(r2), get_fpr_dw0(r3)));
10150 s390_irgen_MSEB(UChar r3, IRTemp op2addr, UChar r1)
10152 IRExpr *op2 = load(Ity_F32, mkexpr(op2addr));
10154 put_fpr_w0(r1, qop(Iop_MSubF32, mkU32(Irrm_NEAREST),
10155 get_fpr_w0(r1), op2, get_fpr_w0(r3)));
10161 s390_irgen_MSDB(UChar r3, IRTemp op2addr, UChar r1)
10163 IRExpr *op2 = load(Ity_F64, mkexpr(op2addr));
10165 put_fpr_dw0(r1, qop(Iop_MSubF64, mkU32(Irrm_NEAREST),
10166 get_fpr_dw0(r1), op2, get_fpr_dw0(r3)));
10172 s390_irgen_SQEBR(UChar r1, UChar r2)
10174 IRTemp result = newTemp(Ity_F32);
10176 assign(result, binop(Iop_SqrtF32, mkU32(Irrm_NEAREST), get_fpr_w0(r2)));
10177 put_fpr_w0(r1, mkexpr(result));
10183 s390_irgen_SQDBR(UChar r1, UChar r2)
10185 IRTemp result = newTemp(Ity_F64);
10187 assign(result, binop(Iop_SqrtF64, mkU32(Irrm_NEAREST), get_fpr_dw0(r2)));
10188 put_fpr_dw0(r1, mkexpr(result));
10194 s390_irgen_SQXBR(UChar r1, UChar r2)
10196 IRTemp result = newTemp(Ity_F128);
10198 assign(result, binop(Iop_SqrtF128, mkU32(Irrm_NEAREST), get_fpr_pair(r2)));
10199 put_fpr_pair(r1, mkexpr(result));
10205 s390_irgen_SQEB(UChar r1, IRTemp op2addr)
10207 IRTemp op = newTemp(Ity_F32);
10209 assign(op, load(Ity_F32, mkexpr(op2addr)));
10210 put_fpr_w0(r1, binop(Iop_SqrtF32, mkU32(Irrm_NEAREST), mkexpr(op)));
10216 s390_irgen_SQDB(UChar r1, IRTemp op2addr)
10218 IRTemp op = newTemp(Ity_F64);
10220 assign(op, load(Ity_F64, mkexpr(op2addr)));
10221 put_fpr_dw0(r1, binop(Iop_SqrtF64, mkU32(Irrm_NEAREST), mkexpr(op)));
10227 s390_irgen_SXBR(UChar r1, UChar r2)
10229 IRTemp op1 = newTemp(Ity_F128);
10230 IRTemp op2 = newTemp(Ity_F128);
10231 IRTemp result = newTemp(Ity_F128);
10233 assign(op1, get_fpr_pair(r1));
10234 assign(op2, get_fpr_pair(r2));
10235 assign(result, triop(Iop_SubF128, mkU32(Irrm_NEAREST), mkexpr(op1),
10237 put_fpr_pair(r1, mkexpr(result));
10238 s390_cc_thunk_put1f128(S390_CC_OP_BFP_RESULT_128, result);
10244 s390_irgen_TCEB(UChar r1, IRTemp op2addr)
10246 IRTemp value = newTemp(Ity_F32);
10248 assign(value, get_fpr_w0(r1));
10250 s390_cc_thunk_putFZ(S390_CC_OP_BFP_TDC_32, value, op2addr);
10256 s390_irgen_TCDB(UChar r1, IRTemp op2addr)
10258 IRTemp value = newTemp(Ity_F64);
10260 assign(value, get_fpr_dw0(r1));
10262 s390_cc_thunk_putFZ(S390_CC_OP_BFP_TDC_64, value, op2addr);
10268 s390_irgen_TCXB(UChar r1, IRTemp op2addr)
10270 IRTemp value = newTemp(Ity_F128);
10272 assign(value, get_fpr_pair(r1));
10274 s390_cc_thunk_put1f128Z(S390_CC_OP_BFP_TDC_128, value, op2addr);
10280 s390_irgen_LCDFR(UChar r1, UChar r2)
10282 IRTemp result = newTemp(Ity_F64);
10284 assign(result, unop(Iop_NegF64, get_fpr_dw0(r2)));
10285 put_fpr_dw0(r1, mkexpr(result));
10291 s390_irgen_LNDFR(UChar r1, UChar r2)
10293 IRTemp result = newTemp(Ity_F64);
10295 assign(result, unop(Iop_NegF64, unop(Iop_AbsF64, get_fpr_dw0(r2))));
10296 put_fpr_dw0(r1, mkexpr(result));
10302 s390_irgen_LPDFR(UChar r1, UChar r2)
10304 IRTemp result = newTemp(Ity_F64);
10306 assign(result, unop(Iop_AbsF64, get_fpr_dw0(r2)));
10307 put_fpr_dw0(r1, mkexpr(result));
10313 s390_irgen_LDGR(UChar r1, UChar r2)
10315 put_fpr_dw0(r1, unop(Iop_ReinterpI64asF64, get_gpr_dw0(r2)));
10321 s390_irgen_LGDR(UChar r1, UChar r2)
10323 put_gpr_dw0(r1, unop(Iop_ReinterpF64asI64, get_fpr_dw0(r2)));
10330 s390_irgen_CPSDR(UChar r3, UChar r1, UChar r2)
10332 IRTemp sign = newTemp(Ity_I64);
10333 IRTemp value = newTemp(Ity_I64);
10335 assign(sign, binop(Iop_And64, unop(Iop_ReinterpF64asI64, get_fpr_dw0(r3)),
10336 mkU64(1ULL << 63)));
10337 assign(value, binop(Iop_And64, unop(Iop_ReinterpF64asI64, get_fpr_dw0(r2)),
10338 mkU64((1ULL << 63) - 1)));
10339 put_fpr_dw0(r1, unop(Iop_ReinterpI64asF64, binop(Iop_Or64, mkexpr(value),
10347 s390_do_cvb(ULong decimal)
10349 #if defined(VGA_s390x)
10353 "cvb %[result],%[input]\n\t"
10354 : [result] "=d"(binary)
10355 : [input] "m"(decimal)
10365 s390_call_cvb(IRExpr *in)
10367 IRExpr **args, *call;
10369 args = mkIRExprVec_1(in);
10370 call = mkIRExprCCall(Ity_I32, 0 /*regparm*/,
10371 "s390_do_cvb", &s390_do_cvb, args);
10373 /* Nothing is excluded from definedness checking. */
10374 call->Iex.CCall.cee->mcx_mask = 0;
10380 s390_irgen_CVB(UChar r1, IRTemp op2addr)
10382 put_gpr_w1(r1, s390_call_cvb(load(Ity_I64, mkexpr(op2addr))));
10388 s390_irgen_CVBY(UChar r1, IRTemp op2addr)
10390 put_gpr_w1(r1, s390_call_cvb(load(Ity_I64, mkexpr(op2addr))));
10397 s390_do_cvd(ULong binary_in)
10399 #if defined(VGA_s390x)
10400 UInt binary = binary_in & 0xffffffffULL;
10404 "cvd %[input],%[result]\n\t"
10405 : [result] "=m"(decimal)
10406 : [input] "d"(binary)
10416 s390_call_cvd(IRExpr *in)
10418 IRExpr **args, *call;
10420 args = mkIRExprVec_1(in);
10421 call = mkIRExprCCall(Ity_I64, 0 /*regparm*/,
10422 "s390_do_cvd", &s390_do_cvd, args);
10424 /* Nothing is excluded from definedness checking. */
10425 call->Iex.CCall.cee->mcx_mask = 0;
10431 s390_irgen_CVD(UChar r1, IRTemp op2addr)
10433 store(mkexpr(op2addr), s390_call_cvd(get_gpr_w1(r1)));
10439 s390_irgen_CVDY(UChar r1, IRTemp op2addr)
10441 store(mkexpr(op2addr), s390_call_cvd(get_gpr_w1(r1)));
10447 s390_irgen_FLOGR(UChar r1, UChar r2)
10449 IRTemp input = newTemp(Ity_I64);
10450 IRTemp not_zero = newTemp(Ity_I64);
10451 IRTemp tmpnum = newTemp(Ity_I64);
10452 IRTemp num = newTemp(Ity_I64);
10453 IRTemp shift_amount = newTemp(Ity_I8);
10455 /* We use the "count leading zeroes" operator because the number of
10456 leading zeroes is identical with the bit position of the first '1' bit.
10457 However, that operator does not work when the input value is zero.
10458 Therefore, we set the LSB of the input value to 1 and use Clz64 on
10459 the modified value. If input == 0, then the result is 64. Otherwise,
10460 the result of Clz64 is what we want. */
10462 assign(input, get_gpr_dw0(r2));
10463 assign(not_zero, binop(Iop_Or64, mkexpr(input), mkU64(1)));
10464 assign(tmpnum, unop(Iop_Clz64, mkexpr(not_zero)));
10466 /* num = (input == 0) ? 64 : tmpnum */
10467 assign(num, mkite(binop(Iop_CmpEQ64, mkexpr(input), mkU64(0)),
10468 /* == 0 */ mkU64(64),
10469 /* != 0 */ mkexpr(tmpnum)));
10471 put_gpr_dw0(r1, mkexpr(num));
10473 /* Set the leftmost '1' bit of the input value to zero. The general scheme
10474 is to first shift the input value by NUM + 1 bits to the left which
10475 causes the leftmost '1' bit to disappear. Then we shift logically to
10476 the right by NUM + 1 bits. Because the semantics of Iop_Shl64 and
10477 Iop_Shr64 are undefined if the shift-amount is greater than or equal to
10478 the width of the value-to-be-shifted, we need to special case
10479 NUM + 1 >= 64. This is equivalent to INPUT != 0 && INPUT != 1.
10480 For both such INPUT values the result will be 0. */
10482 assign(shift_amount, unop(Iop_64to8, binop(Iop_Add64, mkexpr(num),
10485 put_gpr_dw0(r1 + 1,
10486 mkite(binop(Iop_CmpLE64U, mkexpr(input), mkU64(1)),
10487 /* == 0 || == 1*/ mkU64(0),
10490 binop(Iop_Shl64, mkexpr(input),
10491 mkexpr(shift_amount)),
10492 mkexpr(shift_amount))));
10494 /* Compare the original value as an unsigned integer with 0. */
10495 s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, input,
10496 mktemp(Ity_I64, mkU64(0)), False);
10502 s390_irgen_STCK(IRTemp op2addr)
10505 IRTemp cc = newTemp(Ity_I64);
10507 d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_STCK",
10508 &s390x_dirtyhelper_STCK,
10509 mkIRExprVec_1(mkexpr(op2addr)));
10510 d->mFx = Ifx_Write;
10511 d->mAddr = mkexpr(op2addr);
10513 stmt(IRStmt_Dirty(d));
10514 s390_cc_thunk_fill(mkU64(S390_CC_OP_SET),
10515 mkexpr(cc), mkU64(0), mkU64(0));
10520 s390_irgen_STCKF(IRTemp op2addr)
10523 IRTemp cc = newTemp(Ity_I64);
10525 d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_STCKF",
10526 &s390x_dirtyhelper_STCKF,
10527 mkIRExprVec_1(mkexpr(op2addr)));
10528 d->mFx = Ifx_Write;
10529 d->mAddr = mkexpr(op2addr);
10531 stmt(IRStmt_Dirty(d));
10532 s390_cc_thunk_fill(mkU64(S390_CC_OP_SET),
10533 mkexpr(cc), mkU64(0), mkU64(0));
10538 s390_irgen_STCKE(IRTemp op2addr)
10541 IRTemp cc = newTemp(Ity_I64);
10543 d = unsafeIRDirty_1_N(cc, 0, "s390x_dirtyhelper_STCKE",
10544 &s390x_dirtyhelper_STCKE,
10545 mkIRExprVec_1(mkexpr(op2addr)));
10546 d->mFx = Ifx_Write;
10547 d->mAddr = mkexpr(op2addr);
10549 stmt(IRStmt_Dirty(d));
10550 s390_cc_thunk_fill(mkU64(S390_CC_OP_SET),
10551 mkexpr(cc), mkU64(0), mkU64(0));
10555 /*------------------------------------------------------------*/
10556 /*--- Build IR for special instructions ---*/
10557 /*------------------------------------------------------------*/
10560 s390_irgen_client_request(void)
10563 vex_printf("%%R3 = client_request ( %%R2 )\n");
10565 irsb->next = mkU64((ULong)(guest_IA_curr_instr
10566 + S390_SPECIAL_OP_PREAMBLE_SIZE
10567 + S390_SPECIAL_OP_SIZE));
10568 irsb->jumpkind = Ijk_ClientReq;
10570 dis_res->whatNext = Dis_StopHere;
10574 s390_irgen_guest_NRADDR(void)
10577 vex_printf("%%R3 = guest_NRADDR\n");
10579 put_gpr_dw0(3, IRExpr_Get(S390_GUEST_OFFSET(guest_NRADDR), Ity_I64));
10583 s390_irgen_call_noredir(void)
10585 /* Continue after special op */
10586 put_gpr_dw0(14, mkU64(guest_IA_curr_instr
10587 + S390_SPECIAL_OP_PREAMBLE_SIZE
10588 + S390_SPECIAL_OP_SIZE));
10590 /* The address is in REG1, all parameters are in the right (guest) places */
10591 irsb->next = get_gpr_dw0(1);
10592 irsb->jumpkind = Ijk_NoRedir;
10594 dis_res->whatNext = Dis_StopHere;
10597 /* Force proper alignment for the structures below. */
10601 static s390_decode_t
10602 s390_decode_2byte_and_irgen(UChar *bytes)
10606 unsigned int op : 16;
10609 unsigned int op : 8;
10610 unsigned int i : 8;
10613 unsigned int op : 8;
10614 unsigned int r1 : 4;
10615 unsigned int r2 : 4;
10623 vassert(sizeof(formats) == 2);
10625 ((char *)(&ovl.value))[0] = bytes[0];
10626 ((char *)(&ovl.value))[1] = bytes[1];
10628 switch (ovl.value & 0xffff) {
10629 case 0x0101: /* PR */ goto unimplemented;
10630 case 0x0102: /* UPT */ goto unimplemented;
10631 case 0x0104: /* PTFF */ goto unimplemented;
10632 case 0x0107: /* SCKPF */ goto unimplemented;
10633 case 0x010a: /* PFPO */ goto unimplemented;
10634 case 0x010b: /* TAM */ goto unimplemented;
10635 case 0x010c: /* SAM24 */ goto unimplemented;
10636 case 0x010d: /* SAM31 */ goto unimplemented;
10637 case 0x010e: /* SAM64 */ goto unimplemented;
10638 case 0x01ff: /* TRAP2 */ goto unimplemented;
10641 switch ((ovl.value & 0xff00) >> 8) {
10642 case 0x04: /* SPM */ goto unimplemented;
10643 case 0x05: /* BALR */ goto unimplemented;
10644 case 0x06: s390_format_RR_RR(s390_irgen_BCTR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10646 case 0x07: s390_format_RR(s390_irgen_BCR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10648 case 0x0a: s390_format_I(s390_irgen_SVC, ovl.fmt.I.i); goto ok;
10649 case 0x0b: /* BSM */ goto unimplemented;
10650 case 0x0c: /* BASSM */ goto unimplemented;
10651 case 0x0d: s390_format_RR_RR(s390_irgen_BASR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10653 case 0x0e: /* MVCL */ goto unimplemented;
10654 case 0x0f: /* CLCL */ goto unimplemented;
10655 case 0x10: s390_format_RR_RR(s390_irgen_LPR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10657 case 0x11: s390_format_RR_RR(s390_irgen_LNR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10659 case 0x12: s390_format_RR_RR(s390_irgen_LTR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10661 case 0x13: s390_format_RR_RR(s390_irgen_LCR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10663 case 0x14: s390_format_RR_RR(s390_irgen_NR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10665 case 0x15: s390_format_RR_RR(s390_irgen_CLR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10667 case 0x16: s390_format_RR_RR(s390_irgen_OR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10669 case 0x17: s390_format_RR_RR(s390_irgen_XR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10671 case 0x18: s390_format_RR_RR(s390_irgen_LR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10673 case 0x19: s390_format_RR_RR(s390_irgen_CR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10675 case 0x1a: s390_format_RR_RR(s390_irgen_AR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10677 case 0x1b: s390_format_RR_RR(s390_irgen_SR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10679 case 0x1c: s390_format_RR_RR(s390_irgen_MR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10681 case 0x1d: s390_format_RR_RR(s390_irgen_DR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10683 case 0x1e: s390_format_RR_RR(s390_irgen_ALR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10685 case 0x1f: s390_format_RR_RR(s390_irgen_SLR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10687 case 0x20: /* LPDR */ goto unimplemented;
10688 case 0x21: /* LNDR */ goto unimplemented;
10689 case 0x22: /* LTDR */ goto unimplemented;
10690 case 0x23: /* LCDR */ goto unimplemented;
10691 case 0x24: /* HDR */ goto unimplemented;
10692 case 0x25: /* LDXR */ goto unimplemented;
10693 case 0x26: /* MXR */ goto unimplemented;
10694 case 0x27: /* MXDR */ goto unimplemented;
10695 case 0x28: s390_format_RR_FF(s390_irgen_LDR, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10697 case 0x29: /* CDR */ goto unimplemented;
10698 case 0x2a: /* ADR */ goto unimplemented;
10699 case 0x2b: /* SDR */ goto unimplemented;
10700 case 0x2c: /* MDR */ goto unimplemented;
10701 case 0x2d: /* DDR */ goto unimplemented;
10702 case 0x2e: /* AWR */ goto unimplemented;
10703 case 0x2f: /* SWR */ goto unimplemented;
10704 case 0x30: /* LPER */ goto unimplemented;
10705 case 0x31: /* LNER */ goto unimplemented;
10706 case 0x32: /* LTER */ goto unimplemented;
10707 case 0x33: /* LCER */ goto unimplemented;
10708 case 0x34: /* HER */ goto unimplemented;
10709 case 0x35: /* LEDR */ goto unimplemented;
10710 case 0x36: /* AXR */ goto unimplemented;
10711 case 0x37: /* SXR */ goto unimplemented;
10712 case 0x38: s390_format_RR_FF(s390_irgen_LER, ovl.fmt.RR.r1, ovl.fmt.RR.r2);
10714 case 0x39: /* CER */ goto unimplemented;
10715 case 0x3a: /* AER */ goto unimplemented;
10716 case 0x3b: /* SER */ goto unimplemented;
10717 case 0x3c: /* MDER */ goto unimplemented;
10718 case 0x3d: /* DER */ goto unimplemented;
10719 case 0x3e: /* AUR */ goto unimplemented;
10720 case 0x3f: /* SUR */ goto unimplemented;
10723 return S390_DECODE_UNKNOWN_INSN;
10726 return S390_DECODE_OK;
10729 return S390_DECODE_UNIMPLEMENTED_INSN;
10732 static s390_decode_t
10733 s390_decode_4byte_and_irgen(UChar *bytes)
10737 unsigned int op1 : 8;
10738 unsigned int r1 : 4;
10739 unsigned int op2 : 4;
10740 unsigned int i2 : 16;
10743 unsigned int op : 16;
10745 unsigned int r1 : 4;
10746 unsigned int r2 : 4;
10749 unsigned int op : 16;
10750 unsigned int r1 : 4;
10752 unsigned int r3 : 4;
10753 unsigned int r2 : 4;
10756 unsigned int op : 16;
10757 unsigned int r3 : 4;
10758 unsigned int m4 : 4;
10759 unsigned int r1 : 4;
10760 unsigned int r2 : 4;
10763 unsigned int op : 16;
10764 unsigned int r3 : 4;
10766 unsigned int r1 : 4;
10767 unsigned int r2 : 4;
10770 unsigned int op : 16;
10771 unsigned int r3 : 4;
10773 unsigned int r1 : 4;
10774 unsigned int r2 : 4;
10777 unsigned int op : 16;
10778 unsigned int r3 : 4;
10780 unsigned int r1 : 4;
10781 unsigned int r2 : 4;
10784 unsigned int op : 8;
10785 unsigned int r1 : 4;
10786 unsigned int r3 : 4;
10787 unsigned int b2 : 4;
10788 unsigned int d2 : 12;
10791 unsigned int op : 8;
10792 unsigned int r1 : 4;
10793 unsigned int r3 : 4;
10794 unsigned int i2 : 16;
10797 unsigned int op : 8;
10798 unsigned int r1 : 4;
10799 unsigned int x2 : 4;
10800 unsigned int b2 : 4;
10801 unsigned int d2 : 12;
10804 unsigned int op : 16;
10805 unsigned int b2 : 4;
10806 unsigned int d2 : 12;
10809 unsigned int op : 8;
10810 unsigned int i2 : 8;
10811 unsigned int b1 : 4;
10812 unsigned int d1 : 12;
10820 vassert(sizeof(formats) == 4);
10822 ((char *)(&ovl.value))[0] = bytes[0];
10823 ((char *)(&ovl.value))[1] = bytes[1];
10824 ((char *)(&ovl.value))[2] = bytes[2];
10825 ((char *)(&ovl.value))[3] = bytes[3];
10827 switch ((ovl.value & 0xff0f0000) >> 16) {
10828 case 0xa500: s390_format_RI_RU(s390_irgen_IIHH, ovl.fmt.RI.r1,
10829 ovl.fmt.RI.i2); goto ok;
10830 case 0xa501: s390_format_RI_RU(s390_irgen_IIHL, ovl.fmt.RI.r1,
10831 ovl.fmt.RI.i2); goto ok;
10832 case 0xa502: s390_format_RI_RU(s390_irgen_IILH, ovl.fmt.RI.r1,
10833 ovl.fmt.RI.i2); goto ok;
10834 case 0xa503: s390_format_RI_RU(s390_irgen_IILL, ovl.fmt.RI.r1,
10835 ovl.fmt.RI.i2); goto ok;
10836 case 0xa504: s390_format_RI_RU(s390_irgen_NIHH, ovl.fmt.RI.r1,
10837 ovl.fmt.RI.i2); goto ok;
10838 case 0xa505: s390_format_RI_RU(s390_irgen_NIHL, ovl.fmt.RI.r1,
10839 ovl.fmt.RI.i2); goto ok;
10840 case 0xa506: s390_format_RI_RU(s390_irgen_NILH, ovl.fmt.RI.r1,
10841 ovl.fmt.RI.i2); goto ok;
10842 case 0xa507: s390_format_RI_RU(s390_irgen_NILL, ovl.fmt.RI.r1,
10843 ovl.fmt.RI.i2); goto ok;
10844 case 0xa508: s390_format_RI_RU(s390_irgen_OIHH, ovl.fmt.RI.r1,
10845 ovl.fmt.RI.i2); goto ok;
10846 case 0xa509: s390_format_RI_RU(s390_irgen_OIHL, ovl.fmt.RI.r1,
10847 ovl.fmt.RI.i2); goto ok;
10848 case 0xa50a: s390_format_RI_RU(s390_irgen_OILH, ovl.fmt.RI.r1,
10849 ovl.fmt.RI.i2); goto ok;
10850 case 0xa50b: s390_format_RI_RU(s390_irgen_OILL, ovl.fmt.RI.r1,
10851 ovl.fmt.RI.i2); goto ok;
10852 case 0xa50c: s390_format_RI_RU(s390_irgen_LLIHH, ovl.fmt.RI.r1,
10853 ovl.fmt.RI.i2); goto ok;
10854 case 0xa50d: s390_format_RI_RU(s390_irgen_LLIHL, ovl.fmt.RI.r1,
10855 ovl.fmt.RI.i2); goto ok;
10856 case 0xa50e: s390_format_RI_RU(s390_irgen_LLILH, ovl.fmt.RI.r1,
10857 ovl.fmt.RI.i2); goto ok;
10858 case 0xa50f: s390_format_RI_RU(s390_irgen_LLILL, ovl.fmt.RI.r1,
10859 ovl.fmt.RI.i2); goto ok;
10860 case 0xa700: s390_format_RI_RU(s390_irgen_TMLH, ovl.fmt.RI.r1,
10861 ovl.fmt.RI.i2); goto ok;
10862 case 0xa701: s390_format_RI_RU(s390_irgen_TMLL, ovl.fmt.RI.r1,
10863 ovl.fmt.RI.i2); goto ok;
10864 case 0xa702: s390_format_RI_RU(s390_irgen_TMHH, ovl.fmt.RI.r1,
10865 ovl.fmt.RI.i2); goto ok;
10866 case 0xa703: s390_format_RI_RU(s390_irgen_TMHL, ovl.fmt.RI.r1,
10867 ovl.fmt.RI.i2); goto ok;
10868 case 0xa704: s390_format_RI(s390_irgen_BRC, ovl.fmt.RI.r1, ovl.fmt.RI.i2);
10870 case 0xa705: s390_format_RI_RP(s390_irgen_BRAS, ovl.fmt.RI.r1,
10871 ovl.fmt.RI.i2); goto ok;
10872 case 0xa706: s390_format_RI_RP(s390_irgen_BRCT, ovl.fmt.RI.r1,
10873 ovl.fmt.RI.i2); goto ok;
10874 case 0xa707: s390_format_RI_RP(s390_irgen_BRCTG, ovl.fmt.RI.r1,
10875 ovl.fmt.RI.i2); goto ok;
10876 case 0xa708: s390_format_RI_RI(s390_irgen_LHI, ovl.fmt.RI.r1, ovl.fmt.RI.i2);
10878 case 0xa709: s390_format_RI_RI(s390_irgen_LGHI, ovl.fmt.RI.r1,
10879 ovl.fmt.RI.i2); goto ok;
10880 case 0xa70a: s390_format_RI_RI(s390_irgen_AHI, ovl.fmt.RI.r1, ovl.fmt.RI.i2);
10882 case 0xa70b: s390_format_RI_RI(s390_irgen_AGHI, ovl.fmt.RI.r1,
10883 ovl.fmt.RI.i2); goto ok;
10884 case 0xa70c: s390_format_RI_RI(s390_irgen_MHI, ovl.fmt.RI.r1, ovl.fmt.RI.i2);
10886 case 0xa70d: s390_format_RI_RI(s390_irgen_MGHI, ovl.fmt.RI.r1,
10887 ovl.fmt.RI.i2); goto ok;
10888 case 0xa70e: s390_format_RI_RI(s390_irgen_CHI, ovl.fmt.RI.r1, ovl.fmt.RI.i2);
10890 case 0xa70f: s390_format_RI_RI(s390_irgen_CGHI, ovl.fmt.RI.r1,
10891 ovl.fmt.RI.i2); goto ok;
10894 switch ((ovl.value & 0xffff0000) >> 16) {
10895 case 0x8000: /* SSM */ goto unimplemented;
10896 case 0x8200: /* LPSW */ goto unimplemented;
10897 case 0x9300: s390_format_S_RD(s390_irgen_TS, ovl.fmt.S.b2, ovl.fmt.S.d2);
10899 case 0xb202: /* STIDP */ goto unimplemented;
10900 case 0xb204: /* SCK */ goto unimplemented;
10901 case 0xb205: s390_format_S_RD(s390_irgen_STCK, ovl.fmt.S.b2, ovl.fmt.S.d2);goto ok;
10902 case 0xb206: /* SCKC */ goto unimplemented;
10903 case 0xb207: /* STCKC */ goto unimplemented;
10904 case 0xb208: /* SPT */ goto unimplemented;
10905 case 0xb209: /* STPT */ goto unimplemented;
10906 case 0xb20a: /* SPKA */ goto unimplemented;
10907 case 0xb20b: /* IPK */ goto unimplemented;
10908 case 0xb20d: /* PTLB */ goto unimplemented;
10909 case 0xb210: /* SPX */ goto unimplemented;
10910 case 0xb211: /* STPX */ goto unimplemented;
10911 case 0xb212: /* STAP */ goto unimplemented;
10912 case 0xb214: /* SIE */ goto unimplemented;
10913 case 0xb218: /* PC */ goto unimplemented;
10914 case 0xb219: /* SAC */ goto unimplemented;
10915 case 0xb21a: /* CFC */ goto unimplemented;
10916 case 0xb221: /* IPTE */ goto unimplemented;
10917 case 0xb222: s390_format_RRE_R0(s390_irgen_IPM, ovl.fmt.RRE.r1); goto ok;
10918 case 0xb223: /* IVSK */ goto unimplemented;
10919 case 0xb224: /* IAC */ goto unimplemented;
10920 case 0xb225: /* SSAR */ goto unimplemented;
10921 case 0xb226: /* EPAR */ goto unimplemented;
10922 case 0xb227: /* ESAR */ goto unimplemented;
10923 case 0xb228: /* PT */ goto unimplemented;
10924 case 0xb229: /* ISKE */ goto unimplemented;
10925 case 0xb22a: /* RRBE */ goto unimplemented;
10926 case 0xb22b: /* SSKE */ goto unimplemented;
10927 case 0xb22c: /* TB */ goto unimplemented;
10928 case 0xb22d: /* DXR */ goto unimplemented;
10929 case 0xb22e: /* PGIN */ goto unimplemented;
10930 case 0xb22f: /* PGOUT */ goto unimplemented;
10931 case 0xb230: /* CSCH */ goto unimplemented;
10932 case 0xb231: /* HSCH */ goto unimplemented;
10933 case 0xb232: /* MSCH */ goto unimplemented;
10934 case 0xb233: /* SSCH */ goto unimplemented;
10935 case 0xb234: /* STSCH */ goto unimplemented;
10936 case 0xb235: /* TSCH */ goto unimplemented;
10937 case 0xb236: /* TPI */ goto unimplemented;
10938 case 0xb237: /* SAL */ goto unimplemented;
10939 case 0xb238: /* RSCH */ goto unimplemented;
10940 case 0xb239: /* STCRW */ goto unimplemented;
10941 case 0xb23a: /* STCPS */ goto unimplemented;
10942 case 0xb23b: /* RCHP */ goto unimplemented;
10943 case 0xb23c: /* SCHM */ goto unimplemented;
10944 case 0xb240: /* BAKR */ goto unimplemented;
10945 case 0xb241: /* CKSM */ goto unimplemented;
10946 case 0xb244: /* SQDR */ goto unimplemented;
10947 case 0xb245: /* SQER */ goto unimplemented;
10948 case 0xb246: /* STURA */ goto unimplemented;
10949 case 0xb247: /* MSTA */ goto unimplemented;
10950 case 0xb248: /* PALB */ goto unimplemented;
10951 case 0xb249: /* EREG */ goto unimplemented;
10952 case 0xb24a: /* ESTA */ goto unimplemented;
10953 case 0xb24b: /* LURA */ goto unimplemented;
10954 case 0xb24c: /* TAR */ goto unimplemented;
10955 case 0xb24d: s390_format_RRE(s390_irgen_CPYA, ovl.fmt.RRE.r1,
10956 ovl.fmt.RRE.r2); goto ok;
10957 case 0xb24e: s390_format_RRE(s390_irgen_SAR, ovl.fmt.RRE.r1, ovl.fmt.RRE.r2);
10959 case 0xb24f: s390_format_RRE(s390_irgen_EAR, ovl.fmt.RRE.r1, ovl.fmt.RRE.r2);
10961 case 0xb250: /* CSP */ goto unimplemented;
10962 case 0xb252: s390_format_RRE_RR(s390_irgen_MSR, ovl.fmt.RRE.r1,
10963 ovl.fmt.RRE.r2); goto ok;
10964 case 0xb254: /* MVPG */ goto unimplemented;
10965 case 0xb255: s390_format_RRE_RR(s390_irgen_MVST, ovl.fmt.RRE.r1,
10966 ovl.fmt.RRE.r2); goto ok;
10967 case 0xb257: /* CUSE */ goto unimplemented;
10968 case 0xb258: /* BSG */ goto unimplemented;
10969 case 0xb25a: /* BSA */ goto unimplemented;
10970 case 0xb25d: s390_format_RRE_RR(s390_irgen_CLST, ovl.fmt.RRE.r1,
10971 ovl.fmt.RRE.r2); goto ok;
10972 case 0xb25e: s390_format_RRE_RR(s390_irgen_SRST, ovl.fmt.RRE.r1,
10973 ovl.fmt.RRE.r2); goto ok;
10974 case 0xb263: /* CMPSC */ goto unimplemented;
10975 case 0xb274: /* SIGA */ goto unimplemented;
10976 case 0xb276: /* XSCH */ goto unimplemented;
10977 case 0xb277: /* RP */ goto unimplemented;
10978 case 0xb278: s390_format_S_RD(s390_irgen_STCKE, ovl.fmt.S.b2, ovl.fmt.S.d2);goto ok;
10979 case 0xb279: /* SACF */ goto unimplemented;
10980 case 0xb27c: s390_format_S_RD(s390_irgen_STCKF, ovl.fmt.S.b2, ovl.fmt.S.d2);goto ok;
10981 case 0xb27d: /* STSI */ goto unimplemented;
10982 case 0xb299: s390_format_S_RD(s390_irgen_SRNM, ovl.fmt.S.b2, ovl.fmt.S.d2);
10984 case 0xb29c: s390_format_S_RD(s390_irgen_STFPC, ovl.fmt.S.b2, ovl.fmt.S.d2);
10986 case 0xb29d: s390_format_S_RD(s390_irgen_LFPC, ovl.fmt.S.b2, ovl.fmt.S.d2);
10988 case 0xb2a5: /* TRE */ goto unimplemented;
10989 case 0xb2a6: /* CU21 */ goto unimplemented;
10990 case 0xb2a7: /* CU12 */ goto unimplemented;
10991 case 0xb2b0: /* STFLE */ goto unimplemented;
10992 case 0xb2b1: /* STFL */ goto unimplemented;
10993 case 0xb2b2: /* LPSWE */ goto unimplemented;
10994 case 0xb2b8: /* SRNMB */ goto unimplemented;
10995 case 0xb2b9: /* SRNMT */ goto unimplemented;
10996 case 0xb2bd: /* LFAS */ goto unimplemented;
10997 case 0xb2ff: /* TRAP4 */ goto unimplemented;
10998 case 0xb300: s390_format_RRE_FF(s390_irgen_LPEBR, ovl.fmt.RRE.r1,
10999 ovl.fmt.RRE.r2); goto ok;
11000 case 0xb301: s390_format_RRE_FF(s390_irgen_LNEBR, ovl.fmt.RRE.r1,
11001 ovl.fmt.RRE.r2); goto ok;
11002 case 0xb302: s390_format_RRE_FF(s390_irgen_LTEBR, ovl.fmt.RRE.r1,
11003 ovl.fmt.RRE.r2); goto ok;
11004 case 0xb303: s390_format_RRE_FF(s390_irgen_LCEBR, ovl.fmt.RRE.r1,
11005 ovl.fmt.RRE.r2); goto ok;
11006 case 0xb304: s390_format_RRE_FF(s390_irgen_LDEBR, ovl.fmt.RRE.r1,
11007 ovl.fmt.RRE.r2); goto ok;
11008 case 0xb305: s390_format_RRE_FF(s390_irgen_LXDBR, ovl.fmt.RRE.r1,
11009 ovl.fmt.RRE.r2); goto ok;
11010 case 0xb306: s390_format_RRE_FF(s390_irgen_LXEBR, ovl.fmt.RRE.r1,
11011 ovl.fmt.RRE.r2); goto ok;
11012 case 0xb307: /* MXDBR */ goto unimplemented;
11013 case 0xb308: /* KEBR */ goto unimplemented;
11014 case 0xb309: s390_format_RRE_FF(s390_irgen_CEBR, ovl.fmt.RRE.r1,
11015 ovl.fmt.RRE.r2); goto ok;
11016 case 0xb30a: s390_format_RRE_FF(s390_irgen_AEBR, ovl.fmt.RRE.r1,
11017 ovl.fmt.RRE.r2); goto ok;
11018 case 0xb30b: s390_format_RRE_FF(s390_irgen_SEBR, ovl.fmt.RRE.r1,
11019 ovl.fmt.RRE.r2); goto ok;
11020 case 0xb30c: /* MDEBR */ goto unimplemented;
11021 case 0xb30d: s390_format_RRE_FF(s390_irgen_DEBR, ovl.fmt.RRE.r1,
11022 ovl.fmt.RRE.r2); goto ok;
11023 case 0xb30e: s390_format_RRF_F0FF(s390_irgen_MAEBR, ovl.fmt.RRF.r1,
11024 ovl.fmt.RRF.r3, ovl.fmt.RRF.r2); goto ok;
11025 case 0xb30f: s390_format_RRF_F0FF(s390_irgen_MSEBR, ovl.fmt.RRF.r1,
11026 ovl.fmt.RRF.r3, ovl.fmt.RRF.r2); goto ok;
11027 case 0xb310: s390_format_RRE_FF(s390_irgen_LPDBR, ovl.fmt.RRE.r1,
11028 ovl.fmt.RRE.r2); goto ok;
11029 case 0xb311: s390_format_RRE_FF(s390_irgen_LNDBR, ovl.fmt.RRE.r1,
11030 ovl.fmt.RRE.r2); goto ok;
11031 case 0xb312: s390_format_RRE_FF(s390_irgen_LTDBR, ovl.fmt.RRE.r1,
11032 ovl.fmt.RRE.r2); goto ok;
11033 case 0xb313: s390_format_RRE_FF(s390_irgen_LCDBR, ovl.fmt.RRE.r1,
11034 ovl.fmt.RRE.r2); goto ok;
11035 case 0xb314: s390_format_RRE_FF(s390_irgen_SQEBR, ovl.fmt.RRE.r1,
11036 ovl.fmt.RRE.r2); goto ok;
11037 case 0xb315: s390_format_RRE_FF(s390_irgen_SQDBR, ovl.fmt.RRE.r1,
11038 ovl.fmt.RRE.r2); goto ok;
11039 case 0xb316: s390_format_RRE_FF(s390_irgen_SQXBR, ovl.fmt.RRE.r1,
11040 ovl.fmt.RRE.r2); goto ok;
11041 case 0xb317: s390_format_RRE_FF(s390_irgen_MEEBR, ovl.fmt.RRE.r1,
11042 ovl.fmt.RRE.r2); goto ok;
11043 case 0xb318: /* KDBR */ goto unimplemented;
11044 case 0xb319: s390_format_RRE_FF(s390_irgen_CDBR, ovl.fmt.RRE.r1,
11045 ovl.fmt.RRE.r2); goto ok;
11046 case 0xb31a: s390_format_RRE_FF(s390_irgen_ADBR, ovl.fmt.RRE.r1,
11047 ovl.fmt.RRE.r2); goto ok;
11048 case 0xb31b: s390_format_RRE_FF(s390_irgen_SDBR, ovl.fmt.RRE.r1,
11049 ovl.fmt.RRE.r2); goto ok;
11050 case 0xb31c: s390_format_RRE_FF(s390_irgen_MDBR, ovl.fmt.RRE.r1,
11051 ovl.fmt.RRE.r2); goto ok;
11052 case 0xb31d: s390_format_RRE_FF(s390_irgen_DDBR, ovl.fmt.RRE.r1,
11053 ovl.fmt.RRE.r2); goto ok;
11054 case 0xb31e: s390_format_RRF_F0FF(s390_irgen_MADBR, ovl.fmt.RRF.r1,
11055 ovl.fmt.RRF.r3, ovl.fmt.RRF.r2); goto ok;
11056 case 0xb31f: s390_format_RRF_F0FF(s390_irgen_MSDBR, ovl.fmt.RRF.r1,
11057 ovl.fmt.RRF.r3, ovl.fmt.RRF.r2); goto ok;
11058 case 0xb324: /* LDER */ goto unimplemented;
11059 case 0xb325: /* LXDR */ goto unimplemented;
11060 case 0xb326: /* LXER */ goto unimplemented;
11061 case 0xb32e: /* MAER */ goto unimplemented;
11062 case 0xb32f: /* MSER */ goto unimplemented;
11063 case 0xb336: /* SQXR */ goto unimplemented;
11064 case 0xb337: /* MEER */ goto unimplemented;
11065 case 0xb338: /* MAYLR */ goto unimplemented;
11066 case 0xb339: /* MYLR */ goto unimplemented;
11067 case 0xb33a: /* MAYR */ goto unimplemented;
11068 case 0xb33b: /* MYR */ goto unimplemented;
11069 case 0xb33c: /* MAYHR */ goto unimplemented;
11070 case 0xb33d: /* MYHR */ goto unimplemented;
11071 case 0xb33e: /* MADR */ goto unimplemented;
11072 case 0xb33f: /* MSDR */ goto unimplemented;
11073 case 0xb340: s390_format_RRE_FF(s390_irgen_LPXBR, ovl.fmt.RRE.r1,
11074 ovl.fmt.RRE.r2); goto ok;
11075 case 0xb341: s390_format_RRE_FF(s390_irgen_LNXBR, ovl.fmt.RRE.r1,
11076 ovl.fmt.RRE.r2); goto ok;
11077 case 0xb342: s390_format_RRE_FF(s390_irgen_LTXBR, ovl.fmt.RRE.r1,
11078 ovl.fmt.RRE.r2); goto ok;
11079 case 0xb343: s390_format_RRE_FF(s390_irgen_LCXBR, ovl.fmt.RRE.r1,
11080 ovl.fmt.RRE.r2); goto ok;
11081 case 0xb344: s390_format_RRE_FF(s390_irgen_LEDBR, ovl.fmt.RRE.r1,
11082 ovl.fmt.RRE.r2); goto ok;
11083 case 0xb345: s390_format_RRE_FF(s390_irgen_LDXBR, ovl.fmt.RRE.r1,
11084 ovl.fmt.RRE.r2); goto ok;
11085 case 0xb346: s390_format_RRE_FF(s390_irgen_LEXBR, ovl.fmt.RRE.r1,
11086 ovl.fmt.RRE.r2); goto ok;
11087 case 0xb347: /* FIXBR */ goto unimplemented;
11088 case 0xb348: /* KXBR */ goto unimplemented;
11089 case 0xb349: s390_format_RRE_FF(s390_irgen_CXBR, ovl.fmt.RRE.r1,
11090 ovl.fmt.RRE.r2); goto ok;
11091 case 0xb34a: s390_format_RRE_FF(s390_irgen_AXBR, ovl.fmt.RRE.r1,
11092 ovl.fmt.RRE.r2); goto ok;
11093 case 0xb34b: s390_format_RRE_FF(s390_irgen_SXBR, ovl.fmt.RRE.r1,
11094 ovl.fmt.RRE.r2); goto ok;
11095 case 0xb34c: s390_format_RRE_FF(s390_irgen_MXBR, ovl.fmt.RRE.r1,
11096 ovl.fmt.RRE.r2); goto ok;
11097 case 0xb34d: s390_format_RRE_FF(s390_irgen_DXBR, ovl.fmt.RRE.r1,
11098 ovl.fmt.RRE.r2); goto ok;
11099 case 0xb350: /* TBEDR */ goto unimplemented;
11100 case 0xb351: /* TBDR */ goto unimplemented;
11101 case 0xb353: /* DIEBR */ goto unimplemented;
11102 case 0xb357: /* FIEBR */ goto unimplemented;
11103 case 0xb358: /* THDER */ goto unimplemented;
11104 case 0xb359: /* THDR */ goto unimplemented;
11105 case 0xb35b: /* DIDBR */ goto unimplemented;
11106 case 0xb35f: /* FIDBR */ goto unimplemented;
11107 case 0xb360: /* LPXR */ goto unimplemented;
11108 case 0xb361: /* LNXR */ goto unimplemented;
11109 case 0xb362: /* LTXR */ goto unimplemented;
11110 case 0xb363: /* LCXR */ goto unimplemented;
11111 case 0xb365: s390_format_RRE_FF(s390_irgen_LXR, ovl.fmt.RRE.r1,
11112 ovl.fmt.RRE.r2); goto ok;
11113 case 0xb366: /* LEXR */ goto unimplemented;
11114 case 0xb367: /* FIXR */ goto unimplemented;
11115 case 0xb369: /* CXR */ goto unimplemented;
11116 case 0xb370: s390_format_RRE_FF(s390_irgen_LPDFR, ovl.fmt.RRE.r1,
11117 ovl.fmt.RRE.r2); goto ok;
11118 case 0xb371: s390_format_RRE_FF(s390_irgen_LNDFR, ovl.fmt.RRE.r1,
11119 ovl.fmt.RRE.r2); goto ok;
11120 case 0xb372: s390_format_RRF_F0FF2(s390_irgen_CPSDR, ovl.fmt.RRF3.r3,
11121 ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
11123 case 0xb373: s390_format_RRE_FF(s390_irgen_LCDFR, ovl.fmt.RRE.r1,
11124 ovl.fmt.RRE.r2); goto ok;
11125 case 0xb374: s390_format_RRE_F0(s390_irgen_LZER, ovl.fmt.RRE.r1); goto ok;
11126 case 0xb375: s390_format_RRE_F0(s390_irgen_LZDR, ovl.fmt.RRE.r1); goto ok;
11127 case 0xb376: s390_format_RRE_F0(s390_irgen_LZXR, ovl.fmt.RRE.r1); goto ok;
11128 case 0xb377: /* FIER */ goto unimplemented;
11129 case 0xb37f: /* FIDR */ goto unimplemented;
11130 case 0xb384: s390_format_RRE_R0(s390_irgen_SFPC, ovl.fmt.RRE.r1); goto ok;
11131 case 0xb385: /* SFASR */ goto unimplemented;
11132 case 0xb38c: s390_format_RRE_R0(s390_irgen_EFPC, ovl.fmt.RRE.r1); goto ok;
11133 case 0xb390: /* CELFBR */ goto unimplemented;
11134 case 0xb391: /* CDLFBR */ goto unimplemented;
11135 case 0xb392: /* CXLFBR */ goto unimplemented;
11136 case 0xb394: s390_format_RRE_FR(s390_irgen_CEFBR, ovl.fmt.RRE.r1,
11137 ovl.fmt.RRE.r2); goto ok;
11138 case 0xb395: s390_format_RRE_FR(s390_irgen_CDFBR, ovl.fmt.RRE.r1,
11139 ovl.fmt.RRE.r2); goto ok;
11140 case 0xb396: s390_format_RRE_FR(s390_irgen_CXFBR, ovl.fmt.RRE.r1,
11141 ovl.fmt.RRE.r2); goto ok;
11142 case 0xb398: s390_format_RRF_U0RF(s390_irgen_CFEBR, ovl.fmt.RRF3.r3,
11143 ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
11145 case 0xb399: s390_format_RRF_U0RF(s390_irgen_CFDBR, ovl.fmt.RRF3.r3,
11146 ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
11148 case 0xb39a: s390_format_RRF_U0RF(s390_irgen_CFXBR, ovl.fmt.RRF3.r3,
11149 ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
11151 case 0xb3a0: /* CELGBR */ goto unimplemented;
11152 case 0xb3a1: /* CDLGBR */ goto unimplemented;
11153 case 0xb3a2: /* CXLGBR */ goto unimplemented;
11154 case 0xb3a4: s390_format_RRE_FR(s390_irgen_CEGBR, ovl.fmt.RRE.r1,
11155 ovl.fmt.RRE.r2); goto ok;
11156 case 0xb3a5: s390_format_RRE_FR(s390_irgen_CDGBR, ovl.fmt.RRE.r1,
11157 ovl.fmt.RRE.r2); goto ok;
11158 case 0xb3a6: s390_format_RRE_FR(s390_irgen_CXGBR, ovl.fmt.RRE.r1,
11159 ovl.fmt.RRE.r2); goto ok;
11160 case 0xb3a8: s390_format_RRF_U0RF(s390_irgen_CGEBR, ovl.fmt.RRF3.r3,
11161 ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
11163 case 0xb3a9: s390_format_RRF_U0RF(s390_irgen_CGDBR, ovl.fmt.RRF3.r3,
11164 ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
11166 case 0xb3aa: s390_format_RRF_U0RF(s390_irgen_CGXBR, ovl.fmt.RRF3.r3,
11167 ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2);
11169 case 0xb3b4: /* CEFR */ goto unimplemented;
11170 case 0xb3b5: /* CDFR */ goto unimplemented;
11171 case 0xb3b6: /* CXFR */ goto unimplemented;
11172 case 0xb3b8: /* CFER */ goto unimplemented;
11173 case 0xb3b9: /* CFDR */ goto unimplemented;
11174 case 0xb3ba: /* CFXR */ goto unimplemented;
11175 case 0xb3c1: s390_format_RRE_FR(s390_irgen_LDGR, ovl.fmt.RRE.r1,
11176 ovl.fmt.RRE.r2); goto ok;
11177 case 0xb3c4: /* CEGR */ goto unimplemented;
11178 case 0xb3c5: /* CDGR */ goto unimplemented;
11179 case 0xb3c6: /* CXGR */ goto unimplemented;
11180 case 0xb3c8: /* CGER */ goto unimplemented;
11181 case 0xb3c9: /* CGDR */ goto unimplemented;
11182 case 0xb3ca: /* CGXR */ goto unimplemented;
11183 case 0xb3cd: s390_format_RRE_RF(s390_irgen_LGDR, ovl.fmt.RRE.r1,
11184 ovl.fmt.RRE.r2); goto ok;
11185 case 0xb3d0: /* MDTR */ goto unimplemented;
11186 case 0xb3d1: /* DDTR */ goto unimplemented;
11187 case 0xb3d2: /* ADTR */ goto unimplemented;
11188 case 0xb3d3: /* SDTR */ goto unimplemented;
11189 case 0xb3d4: /* LDETR */ goto unimplemented;
11190 case 0xb3d5: /* LEDTR */ goto unimplemented;
11191 case 0xb3d6: /* LTDTR */ goto unimplemented;
11192 case 0xb3d7: /* FIDTR */ goto unimplemented;
11193 case 0xb3d8: /* MXTR */ goto unimplemented;
11194 case 0xb3d9: /* DXTR */ goto unimplemented;
11195 case 0xb3da: /* AXTR */ goto unimplemented;
11196 case 0xb3db: /* SXTR */ goto unimplemented;
11197 case 0xb3dc: /* LXDTR */ goto unimplemented;
11198 case 0xb3dd: /* LDXTR */ goto unimplemented;
11199 case 0xb3de: /* LTXTR */ goto unimplemented;
11200 case 0xb3df: /* FIXTR */ goto unimplemented;
11201 case 0xb3e0: /* KDTR */ goto unimplemented;
11202 case 0xb3e1: /* CGDTR */ goto unimplemented;
11203 case 0xb3e2: /* CUDTR */ goto unimplemented;
11204 case 0xb3e3: /* CSDTR */ goto unimplemented;
11205 case 0xb3e4: /* CDTR */ goto unimplemented;
11206 case 0xb3e5: /* EEDTR */ goto unimplemented;
11207 case 0xb3e7: /* ESDTR */ goto unimplemented;
11208 case 0xb3e8: /* KXTR */ goto unimplemented;
11209 case 0xb3e9: /* CGXTR */ goto unimplemented;
11210 case 0xb3ea: /* CUXTR */ goto unimplemented;
11211 case 0xb3eb: /* CSXTR */ goto unimplemented;
11212 case 0xb3ec: /* CXTR */ goto unimplemented;
11213 case 0xb3ed: /* EEXTR */ goto unimplemented;
11214 case 0xb3ef: /* ESXTR */ goto unimplemented;
11215 case 0xb3f1: /* CDGTR */ goto unimplemented;
11216 case 0xb3f2: /* CDUTR */ goto unimplemented;
11217 case 0xb3f3: /* CDSTR */ goto unimplemented;
11218 case 0xb3f4: /* CEDTR */ goto unimplemented;
11219 case 0xb3f5: /* QADTR */ goto unimplemented;
11220 case 0xb3f6: /* IEDTR */ goto unimplemented;
11221 case 0xb3f7: /* RRDTR */ goto unimplemented;
11222 case 0xb3f9: /* CXGTR */ goto unimplemented;
11223 case 0xb3fa: /* CXUTR */ goto unimplemented;
11224 case 0xb3fb: /* CXSTR */ goto unimplemented;
11225 case 0xb3fc: /* CEXTR */ goto unimplemented;
11226 case 0xb3fd: /* QAXTR */ goto unimplemented;
11227 case 0xb3fe: /* IEXTR */ goto unimplemented;
11228 case 0xb3ff: /* RRXTR */ goto unimplemented;
11229 case 0xb900: s390_format_RRE_RR(s390_irgen_LPGR, ovl.fmt.RRE.r1,
11230 ovl.fmt.RRE.r2); goto ok;
11231 case 0xb901: s390_format_RRE_RR(s390_irgen_LNGR, ovl.fmt.RRE.r1,
11232 ovl.fmt.RRE.r2); goto ok;
11233 case 0xb902: s390_format_RRE_RR(s390_irgen_LTGR, ovl.fmt.RRE.r1,
11234 ovl.fmt.RRE.r2); goto ok;
11235 case 0xb903: s390_format_RRE_RR(s390_irgen_LCGR, ovl.fmt.RRE.r1,
11236 ovl.fmt.RRE.r2); goto ok;
11237 case 0xb904: s390_format_RRE_RR(s390_irgen_LGR, ovl.fmt.RRE.r1,
11238 ovl.fmt.RRE.r2); goto ok;
11239 case 0xb905: /* LURAG */ goto unimplemented;
11240 case 0xb906: s390_format_RRE_RR(s390_irgen_LGBR, ovl.fmt.RRE.r1,
11241 ovl.fmt.RRE.r2); goto ok;
11242 case 0xb907: s390_format_RRE_RR(s390_irgen_LGHR, ovl.fmt.RRE.r1,
11243 ovl.fmt.RRE.r2); goto ok;
11244 case 0xb908: s390_format_RRE_RR(s390_irgen_AGR, ovl.fmt.RRE.r1,
11245 ovl.fmt.RRE.r2); goto ok;
11246 case 0xb909: s390_format_RRE_RR(s390_irgen_SGR, ovl.fmt.RRE.r1,
11247 ovl.fmt.RRE.r2); goto ok;
11248 case 0xb90a: s390_format_RRE_RR(s390_irgen_ALGR, ovl.fmt.RRE.r1,
11249 ovl.fmt.RRE.r2); goto ok;
11250 case 0xb90b: s390_format_RRE_RR(s390_irgen_SLGR, ovl.fmt.RRE.r1,
11251 ovl.fmt.RRE.r2); goto ok;
11252 case 0xb90c: s390_format_RRE_RR(s390_irgen_MSGR, ovl.fmt.RRE.r1,
11253 ovl.fmt.RRE.r2); goto ok;
11254 case 0xb90d: s390_format_RRE_RR(s390_irgen_DSGR, ovl.fmt.RRE.r1,
11255 ovl.fmt.RRE.r2); goto ok;
11256 case 0xb90e: /* EREGG */ goto unimplemented;
11257 case 0xb90f: s390_format_RRE_RR(s390_irgen_LRVGR, ovl.fmt.RRE.r1,
11258 ovl.fmt.RRE.r2); goto ok;
11259 case 0xb910: s390_format_RRE_RR(s390_irgen_LPGFR, ovl.fmt.RRE.r1,
11260 ovl.fmt.RRE.r2); goto ok;
11261 case 0xb911: s390_format_RRE_RR(s390_irgen_LNGFR, ovl.fmt.RRE.r1,
11262 ovl.fmt.RRE.r2); goto ok;
11263 case 0xb912: s390_format_RRE_RR(s390_irgen_LTGFR, ovl.fmt.RRE.r1,
11264 ovl.fmt.RRE.r2); goto ok;
11265 case 0xb913: s390_format_RRE_RR(s390_irgen_LCGFR, ovl.fmt.RRE.r1,
11266 ovl.fmt.RRE.r2); goto ok;
11267 case 0xb914: s390_format_RRE_RR(s390_irgen_LGFR, ovl.fmt.RRE.r1,
11268 ovl.fmt.RRE.r2); goto ok;
11269 case 0xb916: s390_format_RRE_RR(s390_irgen_LLGFR, ovl.fmt.RRE.r1,
11270 ovl.fmt.RRE.r2); goto ok;
11271 case 0xb917: s390_format_RRE_RR(s390_irgen_LLGTR, ovl.fmt.RRE.r1,
11272 ovl.fmt.RRE.r2); goto ok;
11273 case 0xb918: s390_format_RRE_RR(s390_irgen_AGFR, ovl.fmt.RRE.r1,
11274 ovl.fmt.RRE.r2); goto ok;
11275 case 0xb919: s390_format_RRE_RR(s390_irgen_SGFR, ovl.fmt.RRE.r1,
11276 ovl.fmt.RRE.r2); goto ok;
11277 case 0xb91a: s390_format_RRE_RR(s390_irgen_ALGFR, ovl.fmt.RRE.r1,
11278 ovl.fmt.RRE.r2); goto ok;
11279 case 0xb91b: s390_format_RRE_RR(s390_irgen_SLGFR, ovl.fmt.RRE.r1,
11280 ovl.fmt.RRE.r2); goto ok;
11281 case 0xb91c: s390_format_RRE_RR(s390_irgen_MSGFR, ovl.fmt.RRE.r1,
11282 ovl.fmt.RRE.r2); goto ok;
11283 case 0xb91d: s390_format_RRE_RR(s390_irgen_DSGFR, ovl.fmt.RRE.r1,
11284 ovl.fmt.RRE.r2); goto ok;
11285 case 0xb91e: /* KMAC */ goto unimplemented;
11286 case 0xb91f: s390_format_RRE_RR(s390_irgen_LRVR, ovl.fmt.RRE.r1,
11287 ovl.fmt.RRE.r2); goto ok;
11288 case 0xb920: s390_format_RRE_RR(s390_irgen_CGR, ovl.fmt.RRE.r1,
11289 ovl.fmt.RRE.r2); goto ok;
11290 case 0xb921: s390_format_RRE_RR(s390_irgen_CLGR, ovl.fmt.RRE.r1,
11291 ovl.fmt.RRE.r2); goto ok;
11292 case 0xb925: /* STURG */ goto unimplemented;
11293 case 0xb926: s390_format_RRE_RR(s390_irgen_LBR, ovl.fmt.RRE.r1,
11294 ovl.fmt.RRE.r2); goto ok;
11295 case 0xb927: s390_format_RRE_RR(s390_irgen_LHR, ovl.fmt.RRE.r1,
11296 ovl.fmt.RRE.r2); goto ok;
11297 case 0xb928: /* PCKMO */ goto unimplemented;
11298 case 0xb92b: /* KMO */ goto unimplemented;
11299 case 0xb92c: /* PCC */ goto unimplemented;
11300 case 0xb92d: /* KMCTR */ goto unimplemented;
11301 case 0xb92e: /* KM */ goto unimplemented;
11302 case 0xb92f: /* KMC */ goto unimplemented;
11303 case 0xb930: s390_format_RRE_RR(s390_irgen_CGFR, ovl.fmt.RRE.r1,
11304 ovl.fmt.RRE.r2); goto ok;
11305 case 0xb931: s390_format_RRE_RR(s390_irgen_CLGFR, ovl.fmt.RRE.r1,
11306 ovl.fmt.RRE.r2); goto ok;
11307 case 0xb93e: /* KIMD */ goto unimplemented;
11308 case 0xb93f: /* KLMD */ goto unimplemented;
11309 case 0xb941: /* CFDTR */ goto unimplemented;
11310 case 0xb942: /* CLGDTR */ goto unimplemented;
11311 case 0xb943: /* CLFDTR */ goto unimplemented;
11312 case 0xb946: s390_format_RRE_RR(s390_irgen_BCTGR, ovl.fmt.RRE.r1,
11313 ovl.fmt.RRE.r2); goto ok;
11314 case 0xb949: /* CFXTR */ goto unimplemented;
11315 case 0xb94a: /* CLGXTR */ goto unimplemented;
11316 case 0xb94b: /* CLFXTR */ goto unimplemented;
11317 case 0xb951: /* CDFTR */ goto unimplemented;
11318 case 0xb952: /* CDLGTR */ goto unimplemented;
11319 case 0xb953: /* CDLFTR */ goto unimplemented;
11320 case 0xb959: /* CXFTR */ goto unimplemented;
11321 case 0xb95a: /* CXLGTR */ goto unimplemented;
11322 case 0xb95b: /* CXLFTR */ goto unimplemented;
11323 case 0xb960: /* CGRT */ goto unimplemented;
11324 case 0xb961: /* CLGRT */ goto unimplemented;
11325 case 0xb972: /* CRT */ goto unimplemented;
11326 case 0xb973: /* CLRT */ goto unimplemented;
11327 case 0xb980: s390_format_RRE_RR(s390_irgen_NGR, ovl.fmt.RRE.r1,
11328 ovl.fmt.RRE.r2); goto ok;
11329 case 0xb981: s390_format_RRE_RR(s390_irgen_OGR, ovl.fmt.RRE.r1,
11330 ovl.fmt.RRE.r2); goto ok;
11331 case 0xb982: s390_format_RRE_RR(s390_irgen_XGR, ovl.fmt.RRE.r1,
11332 ovl.fmt.RRE.r2); goto ok;
11333 case 0xb983: s390_format_RRE_RR(s390_irgen_FLOGR, ovl.fmt.RRE.r1,
11334 ovl.fmt.RRE.r2); goto ok;
11335 case 0xb984: s390_format_RRE_RR(s390_irgen_LLGCR, ovl.fmt.RRE.r1,
11336 ovl.fmt.RRE.r2); goto ok;
11337 case 0xb985: s390_format_RRE_RR(s390_irgen_LLGHR, ovl.fmt.RRE.r1,
11338 ovl.fmt.RRE.r2); goto ok;
11339 case 0xb986: s390_format_RRE_RR(s390_irgen_MLGR, ovl.fmt.RRE.r1,
11340 ovl.fmt.RRE.r2); goto ok;
11341 case 0xb987: s390_format_RRE_RR(s390_irgen_DLGR, ovl.fmt.RRE.r1,
11342 ovl.fmt.RRE.r2); goto ok;
11343 case 0xb988: s390_format_RRE_RR(s390_irgen_ALCGR, ovl.fmt.RRE.r1,
11344 ovl.fmt.RRE.r2); goto ok;
11345 case 0xb989: s390_format_RRE_RR(s390_irgen_SLBGR, ovl.fmt.RRE.r1,
11346 ovl.fmt.RRE.r2); goto ok;
11347 case 0xb98a: /* CSPG */ goto unimplemented;
11348 case 0xb98d: /* EPSW */ goto unimplemented;
11349 case 0xb98e: /* IDTE */ goto unimplemented;
11350 case 0xb990: /* TRTT */ goto unimplemented;
11351 case 0xb991: /* TRTO */ goto unimplemented;
11352 case 0xb992: /* TROT */ goto unimplemented;
11353 case 0xb993: /* TROO */ goto unimplemented;
11354 case 0xb994: s390_format_RRE_RR(s390_irgen_LLCR, ovl.fmt.RRE.r1,
11355 ovl.fmt.RRE.r2); goto ok;
11356 case 0xb995: s390_format_RRE_RR(s390_irgen_LLHR, ovl.fmt.RRE.r1,
11357 ovl.fmt.RRE.r2); goto ok;
11358 case 0xb996: s390_format_RRE_RR(s390_irgen_MLR, ovl.fmt.RRE.r1,
11359 ovl.fmt.RRE.r2); goto ok;
11360 case 0xb997: s390_format_RRE_RR(s390_irgen_DLR, ovl.fmt.RRE.r1,
11361 ovl.fmt.RRE.r2); goto ok;
11362 case 0xb998: s390_format_RRE_RR(s390_irgen_ALCR, ovl.fmt.RRE.r1,
11363 ovl.fmt.RRE.r2); goto ok;
11364 case 0xb999: s390_format_RRE_RR(s390_irgen_SLBR, ovl.fmt.RRE.r1,
11365 ovl.fmt.RRE.r2); goto ok;
11366 case 0xb99a: /* EPAIR */ goto unimplemented;
11367 case 0xb99b: /* ESAIR */ goto unimplemented;
11368 case 0xb99d: /* ESEA */ goto unimplemented;
11369 case 0xb99e: /* PTI */ goto unimplemented;
11370 case 0xb99f: /* SSAIR */ goto unimplemented;
11371 case 0xb9a2: /* PTF */ goto unimplemented;
11372 case 0xb9aa: /* LPTEA */ goto unimplemented;
11373 case 0xb9ae: /* RRBM */ goto unimplemented;
11374 case 0xb9af: /* PFMF */ goto unimplemented;
11375 case 0xb9b0: /* CU14 */ goto unimplemented;
11376 case 0xb9b1: /* CU24 */ goto unimplemented;
11377 case 0xb9b2: /* CU41 */ goto unimplemented;
11378 case 0xb9b3: /* CU42 */ goto unimplemented;
11379 case 0xb9bd: /* TRTRE */ goto unimplemented;
11380 case 0xb9be: /* SRSTU */ goto unimplemented;
11381 case 0xb9bf: /* TRTE */ goto unimplemented;
11382 case 0xb9c8: s390_format_RRF_R0RR2(s390_irgen_AHHHR, ovl.fmt.RRF4.r3,
11383 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11385 case 0xb9c9: s390_format_RRF_R0RR2(s390_irgen_SHHHR, ovl.fmt.RRF4.r3,
11386 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11388 case 0xb9ca: s390_format_RRF_R0RR2(s390_irgen_ALHHHR, ovl.fmt.RRF4.r3,
11389 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11391 case 0xb9cb: s390_format_RRF_R0RR2(s390_irgen_SLHHHR, ovl.fmt.RRF4.r3,
11392 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11394 case 0xb9cd: s390_format_RRE_RR(s390_irgen_CHHR, ovl.fmt.RRE.r1,
11395 ovl.fmt.RRE.r2); goto ok;
11396 case 0xb9cf: s390_format_RRE_RR(s390_irgen_CLHHR, ovl.fmt.RRE.r1,
11397 ovl.fmt.RRE.r2); goto ok;
11398 case 0xb9d8: s390_format_RRF_R0RR2(s390_irgen_AHHLR, ovl.fmt.RRF4.r3,
11399 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11401 case 0xb9d9: s390_format_RRF_R0RR2(s390_irgen_SHHLR, ovl.fmt.RRF4.r3,
11402 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11404 case 0xb9da: s390_format_RRF_R0RR2(s390_irgen_ALHHLR, ovl.fmt.RRF4.r3,
11405 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11407 case 0xb9db: s390_format_RRF_R0RR2(s390_irgen_SLHHLR, ovl.fmt.RRF4.r3,
11408 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11410 case 0xb9dd: s390_format_RRE_RR(s390_irgen_CHLR, ovl.fmt.RRE.r1,
11411 ovl.fmt.RRE.r2); goto ok;
11412 case 0xb9df: s390_format_RRE_RR(s390_irgen_CLHLR, ovl.fmt.RRE.r1,
11413 ovl.fmt.RRE.r2); goto ok;
11414 case 0xb9e1: /* POPCNT */ goto unimplemented;
11415 case 0xb9e2: s390_format_RRF_U0RR(s390_irgen_LOCGR, ovl.fmt.RRF3.r3,
11416 ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2,
11417 S390_XMNM_LOCGR); goto ok;
11418 case 0xb9e4: s390_format_RRF_R0RR2(s390_irgen_NGRK, ovl.fmt.RRF4.r3,
11419 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11421 case 0xb9e6: s390_format_RRF_R0RR2(s390_irgen_OGRK, ovl.fmt.RRF4.r3,
11422 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11424 case 0xb9e7: s390_format_RRF_R0RR2(s390_irgen_XGRK, ovl.fmt.RRF4.r3,
11425 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11427 case 0xb9e8: s390_format_RRF_R0RR2(s390_irgen_AGRK, ovl.fmt.RRF4.r3,
11428 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11430 case 0xb9e9: s390_format_RRF_R0RR2(s390_irgen_SGRK, ovl.fmt.RRF4.r3,
11431 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11433 case 0xb9ea: s390_format_RRF_R0RR2(s390_irgen_ALGRK, ovl.fmt.RRF4.r3,
11434 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11436 case 0xb9eb: s390_format_RRF_R0RR2(s390_irgen_SLGRK, ovl.fmt.RRF4.r3,
11437 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11439 case 0xb9f2: s390_format_RRF_U0RR(s390_irgen_LOCR, ovl.fmt.RRF3.r3,
11440 ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2,
11441 S390_XMNM_LOCR); goto ok;
11442 case 0xb9f4: s390_format_RRF_R0RR2(s390_irgen_NRK, ovl.fmt.RRF4.r3,
11443 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11445 case 0xb9f6: s390_format_RRF_R0RR2(s390_irgen_ORK, ovl.fmt.RRF4.r3,
11446 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11448 case 0xb9f7: s390_format_RRF_R0RR2(s390_irgen_XRK, ovl.fmt.RRF4.r3,
11449 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11451 case 0xb9f8: s390_format_RRF_R0RR2(s390_irgen_ARK, ovl.fmt.RRF4.r3,
11452 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11454 case 0xb9f9: s390_format_RRF_R0RR2(s390_irgen_SRK, ovl.fmt.RRF4.r3,
11455 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11457 case 0xb9fa: s390_format_RRF_R0RR2(s390_irgen_ALRK, ovl.fmt.RRF4.r3,
11458 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11460 case 0xb9fb: s390_format_RRF_R0RR2(s390_irgen_SLRK, ovl.fmt.RRF4.r3,
11461 ovl.fmt.RRF4.r1, ovl.fmt.RRF4.r2);
11465 switch ((ovl.value & 0xff000000) >> 24) {
11466 case 0x40: s390_format_RX_RRRD(s390_irgen_STH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11467 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11468 case 0x41: s390_format_RX_RRRD(s390_irgen_LA, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11469 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11470 case 0x42: s390_format_RX_RRRD(s390_irgen_STC, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11471 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11472 case 0x43: s390_format_RX_RRRD(s390_irgen_IC, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11473 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11474 case 0x44: s390_format_RX_RRRD(s390_irgen_EX, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11475 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11476 case 0x45: /* BAL */ goto unimplemented;
11477 case 0x46: s390_format_RX_RRRD(s390_irgen_BCT, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11478 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11479 case 0x47: s390_format_RX(s390_irgen_BC, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11480 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11481 case 0x48: s390_format_RX_RRRD(s390_irgen_LH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11482 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11483 case 0x49: s390_format_RX_RRRD(s390_irgen_CH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11484 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11485 case 0x4a: s390_format_RX_RRRD(s390_irgen_AH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11486 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11487 case 0x4b: s390_format_RX_RRRD(s390_irgen_SH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11488 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11489 case 0x4c: s390_format_RX_RRRD(s390_irgen_MH, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11490 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11491 case 0x4d: s390_format_RX_RRRD(s390_irgen_BAS, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11492 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11493 case 0x4e: s390_format_RX_RRRD(s390_irgen_CVD, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11494 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11495 case 0x4f: s390_format_RX_RRRD(s390_irgen_CVB, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11496 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11497 case 0x50: s390_format_RX_RRRD(s390_irgen_ST, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11498 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11499 case 0x51: s390_format_RX_RRRD(s390_irgen_LAE, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11500 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11501 case 0x54: s390_format_RX_RRRD(s390_irgen_N, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11502 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11503 case 0x55: s390_format_RX_RRRD(s390_irgen_CL, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11504 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11505 case 0x56: s390_format_RX_RRRD(s390_irgen_O, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11506 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11507 case 0x57: s390_format_RX_RRRD(s390_irgen_X, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11508 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11509 case 0x58: s390_format_RX_RRRD(s390_irgen_L, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11510 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11511 case 0x59: s390_format_RX_RRRD(s390_irgen_C, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11512 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11513 case 0x5a: s390_format_RX_RRRD(s390_irgen_A, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11514 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11515 case 0x5b: s390_format_RX_RRRD(s390_irgen_S, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11516 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11517 case 0x5c: s390_format_RX_RRRD(s390_irgen_M, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11518 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11519 case 0x5d: s390_format_RX_RRRD(s390_irgen_D, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11520 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11521 case 0x5e: s390_format_RX_RRRD(s390_irgen_AL, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11522 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11523 case 0x5f: s390_format_RX_RRRD(s390_irgen_SL, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11524 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11525 case 0x60: s390_format_RX_FRRD(s390_irgen_STD, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11526 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11527 case 0x67: /* MXD */ goto unimplemented;
11528 case 0x68: s390_format_RX_FRRD(s390_irgen_LD, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11529 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11530 case 0x69: /* CD */ goto unimplemented;
11531 case 0x6a: /* AD */ goto unimplemented;
11532 case 0x6b: /* SD */ goto unimplemented;
11533 case 0x6c: /* MD */ goto unimplemented;
11534 case 0x6d: /* DD */ goto unimplemented;
11535 case 0x6e: /* AW */ goto unimplemented;
11536 case 0x6f: /* SW */ goto unimplemented;
11537 case 0x70: s390_format_RX_FRRD(s390_irgen_STE, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11538 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11539 case 0x71: s390_format_RX_RRRD(s390_irgen_MS, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11540 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11541 case 0x78: s390_format_RX_FRRD(s390_irgen_LE, ovl.fmt.RX.r1, ovl.fmt.RX.x2,
11542 ovl.fmt.RX.b2, ovl.fmt.RX.d2); goto ok;
11543 case 0x79: /* CE */ goto unimplemented;
11544 case 0x7a: /* AE */ goto unimplemented;
11545 case 0x7b: /* SE */ goto unimplemented;
11546 case 0x7c: /* MDE */ goto unimplemented;
11547 case 0x7d: /* DE */ goto unimplemented;
11548 case 0x7e: /* AU */ goto unimplemented;
11549 case 0x7f: /* SU */ goto unimplemented;
11550 case 0x83: /* DIAG */ goto unimplemented;
11551 case 0x84: s390_format_RSI_RRP(s390_irgen_BRXH, ovl.fmt.RSI.r1,
11552 ovl.fmt.RSI.r3, ovl.fmt.RSI.i2); goto ok;
11553 case 0x85: s390_format_RSI_RRP(s390_irgen_BRXLE, ovl.fmt.RSI.r1,
11554 ovl.fmt.RSI.r3, ovl.fmt.RSI.i2); goto ok;
11555 case 0x86: s390_format_RS_RRRD(s390_irgen_BXH, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
11556 ovl.fmt.RS.b2, ovl.fmt.RS.d2); goto ok;
11557 case 0x87: s390_format_RS_RRRD(s390_irgen_BXLE, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
11558 ovl.fmt.RS.b2, ovl.fmt.RS.d2); goto ok;
11559 case 0x88: s390_format_RS_R0RD(s390_irgen_SRL, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
11560 ovl.fmt.RS.d2); goto ok;
11561 case 0x89: s390_format_RS_R0RD(s390_irgen_SLL, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
11562 ovl.fmt.RS.d2); goto ok;
11563 case 0x8a: s390_format_RS_R0RD(s390_irgen_SRA, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
11564 ovl.fmt.RS.d2); goto ok;
11565 case 0x8b: s390_format_RS_R0RD(s390_irgen_SLA, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
11566 ovl.fmt.RS.d2); goto ok;
11567 case 0x8c: s390_format_RS_R0RD(s390_irgen_SRDL, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
11568 ovl.fmt.RS.d2); goto ok;
11569 case 0x8d: s390_format_RS_R0RD(s390_irgen_SLDL, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
11570 ovl.fmt.RS.d2); goto ok;
11571 case 0x8e: s390_format_RS_R0RD(s390_irgen_SRDA, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
11572 ovl.fmt.RS.d2); goto ok;
11573 case 0x8f: s390_format_RS_R0RD(s390_irgen_SLDA, ovl.fmt.RS.r1, ovl.fmt.RS.b2,
11574 ovl.fmt.RS.d2); goto ok;
11575 case 0x90: s390_format_RS_RRRD(s390_irgen_STM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
11576 ovl.fmt.RS.b2, ovl.fmt.RS.d2); goto ok;
11577 case 0x91: s390_format_SI_URD(s390_irgen_TM, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
11578 ovl.fmt.SI.d1); goto ok;
11579 case 0x92: s390_format_SI_URD(s390_irgen_MVI, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
11580 ovl.fmt.SI.d1); goto ok;
11581 case 0x94: s390_format_SI_URD(s390_irgen_NI, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
11582 ovl.fmt.SI.d1); goto ok;
11583 case 0x95: s390_format_SI_URD(s390_irgen_CLI, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
11584 ovl.fmt.SI.d1); goto ok;
11585 case 0x96: s390_format_SI_URD(s390_irgen_OI, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
11586 ovl.fmt.SI.d1); goto ok;
11587 case 0x97: s390_format_SI_URD(s390_irgen_XI, ovl.fmt.SI.i2, ovl.fmt.SI.b1,
11588 ovl.fmt.SI.d1); goto ok;
11589 case 0x98: s390_format_RS_RRRD(s390_irgen_LM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
11590 ovl.fmt.RS.b2, ovl.fmt.RS.d2); goto ok;
11591 case 0x99: /* TRACE */ goto unimplemented;
11592 case 0x9a: s390_format_RS_AARD(s390_irgen_LAM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
11593 ovl.fmt.RS.b2, ovl.fmt.RS.d2); goto ok;
11594 case 0x9b: s390_format_RS_AARD(s390_irgen_STAM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
11595 ovl.fmt.RS.b2, ovl.fmt.RS.d2); goto ok;
11596 case 0xa8: s390_format_RS_RRRD(s390_irgen_MVCLE, ovl.fmt.RS.r1,
11597 ovl.fmt.RS.r3, ovl.fmt.RS.b2, ovl.fmt.RS.d2);
11599 case 0xa9: s390_format_RS_RRRD(s390_irgen_CLCLE, ovl.fmt.RS.r1,
11600 ovl.fmt.RS.r3, ovl.fmt.RS.b2, ovl.fmt.RS.d2);
11602 case 0xac: /* STNSM */ goto unimplemented;
11603 case 0xad: /* STOSM */ goto unimplemented;
11604 case 0xae: /* SIGP */ goto unimplemented;
11605 case 0xaf: /* MC */ goto unimplemented;
11606 case 0xb1: /* LRA */ goto unimplemented;
11607 case 0xb6: /* STCTL */ goto unimplemented;
11608 case 0xb7: /* LCTL */ goto unimplemented;
11609 case 0xba: s390_format_RS_RRRD(s390_irgen_CS, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
11610 ovl.fmt.RS.b2, ovl.fmt.RS.d2); goto ok;
11611 case 0xbb: /* CDS */ goto unimplemented;
11612 case 0xbd: s390_format_RS_RURD(s390_irgen_CLM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
11613 ovl.fmt.RS.b2, ovl.fmt.RS.d2); goto ok;
11614 case 0xbe: s390_format_RS_RURD(s390_irgen_STCM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
11615 ovl.fmt.RS.b2, ovl.fmt.RS.d2); goto ok;
11616 case 0xbf: s390_format_RS_RURD(s390_irgen_ICM, ovl.fmt.RS.r1, ovl.fmt.RS.r3,
11617 ovl.fmt.RS.b2, ovl.fmt.RS.d2); goto ok;
11620 return S390_DECODE_UNKNOWN_INSN;
11623 return S390_DECODE_OK;
11626 return S390_DECODE_UNIMPLEMENTED_INSN;
11629 static s390_decode_t
11630 s390_decode_6byte_and_irgen(UChar *bytes)
11634 unsigned int op1 : 8;
11635 unsigned int r1 : 4;
11636 unsigned int r3 : 4;
11637 unsigned int i2 : 16;
11639 unsigned int op2 : 8;
11642 unsigned int op1 : 8;
11643 unsigned int r1 : 4;
11644 unsigned int r2 : 4;
11645 unsigned int i3 : 8;
11646 unsigned int i4 : 8;
11647 unsigned int i5 : 8;
11648 unsigned int op2 : 8;
11651 unsigned int op1 : 8;
11652 unsigned int r1 : 4;
11654 unsigned int i2 : 16;
11655 unsigned int m3 : 4;
11657 unsigned int op2 : 8;
11660 unsigned int op1 : 8;
11661 unsigned int r1 : 4;
11662 unsigned int r2 : 4;
11663 unsigned int i4 : 16;
11664 unsigned int m3 : 4;
11666 unsigned int op2 : 8;
11669 unsigned int op1 : 8;
11670 unsigned int r1 : 4;
11671 unsigned int m3 : 4;
11672 unsigned int i4 : 16;
11673 unsigned int i2 : 8;
11674 unsigned int op2 : 8;
11677 unsigned int op1 : 8;
11678 unsigned int r1 : 4;
11679 unsigned int op2 : 4;
11680 unsigned int i2 : 32;
11683 unsigned int op1 : 8;
11684 unsigned int r1 : 4;
11685 unsigned int m3 : 4;
11686 unsigned int b4 : 4;
11687 unsigned int d4 : 12;
11688 unsigned int i2 : 8;
11689 unsigned int op2 : 8;
11692 unsigned int op1 : 8;
11693 unsigned int r1 : 4;
11694 unsigned int r2 : 4;
11695 unsigned int b4 : 4;
11696 unsigned int d4 : 12;
11697 unsigned int m3 : 4;
11699 unsigned int op2 : 8;
11702 unsigned int op1 : 8;
11703 unsigned int l1 : 4;
11705 unsigned int b1 : 4;
11706 unsigned int d1 : 12;
11708 unsigned int op2 : 8;
11711 unsigned int op1 : 8;
11712 unsigned int r1 : 4;
11713 unsigned int r3 : 4;
11714 unsigned int b2 : 4;
11715 unsigned int dl2 : 12;
11716 unsigned int dh2 : 8;
11717 unsigned int op2 : 8;
11720 unsigned int op1 : 8;
11721 unsigned int r1 : 4;
11722 unsigned int x2 : 4;
11723 unsigned int b2 : 4;
11724 unsigned int d2 : 12;
11726 unsigned int op2 : 8;
11729 unsigned int op1 : 8;
11730 unsigned int r3 : 4;
11731 unsigned int x2 : 4;
11732 unsigned int b2 : 4;
11733 unsigned int d2 : 12;
11734 unsigned int r1 : 4;
11736 unsigned int op2 : 8;
11739 unsigned int op1 : 8;
11740 unsigned int r1 : 4;
11741 unsigned int x2 : 4;
11742 unsigned int b2 : 4;
11743 unsigned int dl2 : 12;
11744 unsigned int dh2 : 8;
11745 unsigned int op2 : 8;
11748 unsigned int op1 : 8;
11749 unsigned int i2 : 8;
11750 unsigned int b1 : 4;
11751 unsigned int dl1 : 12;
11752 unsigned int dh1 : 8;
11753 unsigned int op2 : 8;
11756 unsigned int op : 8;
11757 unsigned int l : 8;
11758 unsigned int b1 : 4;
11759 unsigned int d1 : 12;
11760 unsigned int b2 : 4;
11761 unsigned int d2 : 12;
11764 unsigned int op : 8;
11765 unsigned int l1 : 4;
11766 unsigned int l2 : 4;
11767 unsigned int b1 : 4;
11768 unsigned int d1 : 12;
11769 unsigned int b2 : 4;
11770 unsigned int d2 : 12;
11773 unsigned int op : 8;
11774 unsigned int r1 : 4;
11775 unsigned int r3 : 4;
11776 unsigned int b2 : 4;
11777 unsigned int d2 : 12;
11778 unsigned int b4 : 4;
11779 unsigned int d4 : 12;
11782 unsigned int op : 16;
11783 unsigned int b1 : 4;
11784 unsigned int d1 : 12;
11785 unsigned int b2 : 4;
11786 unsigned int d2 : 12;
11789 unsigned int op1 : 8;
11790 unsigned int r3 : 4;
11791 unsigned int op2 : 4;
11792 unsigned int b1 : 4;
11793 unsigned int d1 : 12;
11794 unsigned int b2 : 4;
11795 unsigned int d2 : 12;
11798 unsigned int op : 16;
11799 unsigned int b1 : 4;
11800 unsigned int d1 : 12;
11801 unsigned int i2 : 16;
11809 vassert(sizeof(formats) == 6);
11811 ((char *)(&ovl.value))[0] = bytes[0];
11812 ((char *)(&ovl.value))[1] = bytes[1];
11813 ((char *)(&ovl.value))[2] = bytes[2];
11814 ((char *)(&ovl.value))[3] = bytes[3];
11815 ((char *)(&ovl.value))[4] = bytes[4];
11816 ((char *)(&ovl.value))[5] = bytes[5];
11817 ((char *)(&ovl.value))[6] = 0x0;
11818 ((char *)(&ovl.value))[7] = 0x0;
11820 switch ((ovl.value >> 16) & 0xff00000000ffULL) {
11821 case 0xe30000000002ULL: s390_format_RXY_RRRD(s390_irgen_LTG, ovl.fmt.RXY.r1,
11822 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11824 ovl.fmt.RXY.dh2); goto ok;
11825 case 0xe30000000003ULL: /* LRAG */ goto unimplemented;
11826 case 0xe30000000004ULL: s390_format_RXY_RRRD(s390_irgen_LG, ovl.fmt.RXY.r1,
11827 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11829 ovl.fmt.RXY.dh2); goto ok;
11830 case 0xe30000000006ULL: s390_format_RXY_RRRD(s390_irgen_CVBY, ovl.fmt.RXY.r1,
11831 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11833 ovl.fmt.RXY.dh2); goto ok;
11834 case 0xe30000000008ULL: s390_format_RXY_RRRD(s390_irgen_AG, ovl.fmt.RXY.r1,
11835 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11837 ovl.fmt.RXY.dh2); goto ok;
11838 case 0xe30000000009ULL: s390_format_RXY_RRRD(s390_irgen_SG, ovl.fmt.RXY.r1,
11839 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11841 ovl.fmt.RXY.dh2); goto ok;
11842 case 0xe3000000000aULL: s390_format_RXY_RRRD(s390_irgen_ALG, ovl.fmt.RXY.r1,
11843 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11845 ovl.fmt.RXY.dh2); goto ok;
11846 case 0xe3000000000bULL: s390_format_RXY_RRRD(s390_irgen_SLG, ovl.fmt.RXY.r1,
11847 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11849 ovl.fmt.RXY.dh2); goto ok;
11850 case 0xe3000000000cULL: s390_format_RXY_RRRD(s390_irgen_MSG, ovl.fmt.RXY.r1,
11851 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11853 ovl.fmt.RXY.dh2); goto ok;
11854 case 0xe3000000000dULL: s390_format_RXY_RRRD(s390_irgen_DSG, ovl.fmt.RXY.r1,
11855 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11857 ovl.fmt.RXY.dh2); goto ok;
11858 case 0xe3000000000eULL: /* CVBG */ goto unimplemented;
11859 case 0xe3000000000fULL: s390_format_RXY_RRRD(s390_irgen_LRVG, ovl.fmt.RXY.r1,
11860 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11862 ovl.fmt.RXY.dh2); goto ok;
11863 case 0xe30000000012ULL: s390_format_RXY_RRRD(s390_irgen_LT, ovl.fmt.RXY.r1,
11864 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11866 ovl.fmt.RXY.dh2); goto ok;
11867 case 0xe30000000013ULL: /* LRAY */ goto unimplemented;
11868 case 0xe30000000014ULL: s390_format_RXY_RRRD(s390_irgen_LGF, ovl.fmt.RXY.r1,
11869 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11871 ovl.fmt.RXY.dh2); goto ok;
11872 case 0xe30000000015ULL: s390_format_RXY_RRRD(s390_irgen_LGH, ovl.fmt.RXY.r1,
11873 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11875 ovl.fmt.RXY.dh2); goto ok;
11876 case 0xe30000000016ULL: s390_format_RXY_RRRD(s390_irgen_LLGF, ovl.fmt.RXY.r1,
11877 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11879 ovl.fmt.RXY.dh2); goto ok;
11880 case 0xe30000000017ULL: s390_format_RXY_RRRD(s390_irgen_LLGT, ovl.fmt.RXY.r1,
11881 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11883 ovl.fmt.RXY.dh2); goto ok;
11884 case 0xe30000000018ULL: s390_format_RXY_RRRD(s390_irgen_AGF, ovl.fmt.RXY.r1,
11885 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11887 ovl.fmt.RXY.dh2); goto ok;
11888 case 0xe30000000019ULL: s390_format_RXY_RRRD(s390_irgen_SGF, ovl.fmt.RXY.r1,
11889 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11891 ovl.fmt.RXY.dh2); goto ok;
11892 case 0xe3000000001aULL: s390_format_RXY_RRRD(s390_irgen_ALGF, ovl.fmt.RXY.r1,
11893 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11895 ovl.fmt.RXY.dh2); goto ok;
11896 case 0xe3000000001bULL: s390_format_RXY_RRRD(s390_irgen_SLGF, ovl.fmt.RXY.r1,
11897 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11899 ovl.fmt.RXY.dh2); goto ok;
11900 case 0xe3000000001cULL: s390_format_RXY_RRRD(s390_irgen_MSGF, ovl.fmt.RXY.r1,
11901 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11903 ovl.fmt.RXY.dh2); goto ok;
11904 case 0xe3000000001dULL: s390_format_RXY_RRRD(s390_irgen_DSGF, ovl.fmt.RXY.r1,
11905 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11907 ovl.fmt.RXY.dh2); goto ok;
11908 case 0xe3000000001eULL: s390_format_RXY_RRRD(s390_irgen_LRV, ovl.fmt.RXY.r1,
11909 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11911 ovl.fmt.RXY.dh2); goto ok;
11912 case 0xe3000000001fULL: s390_format_RXY_RRRD(s390_irgen_LRVH, ovl.fmt.RXY.r1,
11913 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11915 ovl.fmt.RXY.dh2); goto ok;
11916 case 0xe30000000020ULL: s390_format_RXY_RRRD(s390_irgen_CG, ovl.fmt.RXY.r1,
11917 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11919 ovl.fmt.RXY.dh2); goto ok;
11920 case 0xe30000000021ULL: s390_format_RXY_RRRD(s390_irgen_CLG, ovl.fmt.RXY.r1,
11921 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11923 ovl.fmt.RXY.dh2); goto ok;
11924 case 0xe30000000024ULL: s390_format_RXY_RRRD(s390_irgen_STG, ovl.fmt.RXY.r1,
11925 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11927 ovl.fmt.RXY.dh2); goto ok;
11928 case 0xe30000000026ULL: s390_format_RXY_RRRD(s390_irgen_CVDY, ovl.fmt.RXY.r1,
11929 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11931 ovl.fmt.RXY.dh2); goto ok;
11932 case 0xe3000000002eULL: /* CVDG */ goto unimplemented;
11933 case 0xe3000000002fULL: s390_format_RXY_RRRD(s390_irgen_STRVG,
11934 ovl.fmt.RXY.r1, ovl.fmt.RXY.x2,
11935 ovl.fmt.RXY.b2, ovl.fmt.RXY.dl2,
11936 ovl.fmt.RXY.dh2); goto ok;
11937 case 0xe30000000030ULL: s390_format_RXY_RRRD(s390_irgen_CGF, ovl.fmt.RXY.r1,
11938 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11940 ovl.fmt.RXY.dh2); goto ok;
11941 case 0xe30000000031ULL: s390_format_RXY_RRRD(s390_irgen_CLGF, ovl.fmt.RXY.r1,
11942 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11944 ovl.fmt.RXY.dh2); goto ok;
11945 case 0xe30000000032ULL: s390_format_RXY_RRRD(s390_irgen_LTGF, ovl.fmt.RXY.r1,
11946 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11948 ovl.fmt.RXY.dh2); goto ok;
11949 case 0xe30000000034ULL: s390_format_RXY_RRRD(s390_irgen_CGH, ovl.fmt.RXY.r1,
11950 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11952 ovl.fmt.RXY.dh2); goto ok;
11953 case 0xe30000000036ULL: s390_format_RXY_URRD(s390_irgen_PFD, ovl.fmt.RXY.r1,
11954 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11956 ovl.fmt.RXY.dh2); goto ok;
11957 case 0xe3000000003eULL: s390_format_RXY_RRRD(s390_irgen_STRV, ovl.fmt.RXY.r1,
11958 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11960 ovl.fmt.RXY.dh2); goto ok;
11961 case 0xe3000000003fULL: s390_format_RXY_RRRD(s390_irgen_STRVH,
11962 ovl.fmt.RXY.r1, ovl.fmt.RXY.x2,
11963 ovl.fmt.RXY.b2, ovl.fmt.RXY.dl2,
11964 ovl.fmt.RXY.dh2); goto ok;
11965 case 0xe30000000046ULL: s390_format_RXY_RRRD(s390_irgen_BCTG, ovl.fmt.RXY.r1,
11966 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11968 ovl.fmt.RXY.dh2); goto ok;
11969 case 0xe30000000050ULL: s390_format_RXY_RRRD(s390_irgen_STY, ovl.fmt.RXY.r1,
11970 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11972 ovl.fmt.RXY.dh2); goto ok;
11973 case 0xe30000000051ULL: s390_format_RXY_RRRD(s390_irgen_MSY, ovl.fmt.RXY.r1,
11974 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11976 ovl.fmt.RXY.dh2); goto ok;
11977 case 0xe30000000054ULL: s390_format_RXY_RRRD(s390_irgen_NY, ovl.fmt.RXY.r1,
11978 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11980 ovl.fmt.RXY.dh2); goto ok;
11981 case 0xe30000000055ULL: s390_format_RXY_RRRD(s390_irgen_CLY, ovl.fmt.RXY.r1,
11982 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11984 ovl.fmt.RXY.dh2); goto ok;
11985 case 0xe30000000056ULL: s390_format_RXY_RRRD(s390_irgen_OY, ovl.fmt.RXY.r1,
11986 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11988 ovl.fmt.RXY.dh2); goto ok;
11989 case 0xe30000000057ULL: s390_format_RXY_RRRD(s390_irgen_XY, ovl.fmt.RXY.r1,
11990 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11992 ovl.fmt.RXY.dh2); goto ok;
11993 case 0xe30000000058ULL: s390_format_RXY_RRRD(s390_irgen_LY, ovl.fmt.RXY.r1,
11994 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
11996 ovl.fmt.RXY.dh2); goto ok;
11997 case 0xe30000000059ULL: s390_format_RXY_RRRD(s390_irgen_CY, ovl.fmt.RXY.r1,
11998 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12000 ovl.fmt.RXY.dh2); goto ok;
12001 case 0xe3000000005aULL: s390_format_RXY_RRRD(s390_irgen_AY, ovl.fmt.RXY.r1,
12002 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12004 ovl.fmt.RXY.dh2); goto ok;
12005 case 0xe3000000005bULL: s390_format_RXY_RRRD(s390_irgen_SY, ovl.fmt.RXY.r1,
12006 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12008 ovl.fmt.RXY.dh2); goto ok;
12009 case 0xe3000000005cULL: s390_format_RXY_RRRD(s390_irgen_MFY, ovl.fmt.RXY.r1,
12010 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12012 ovl.fmt.RXY.dh2); goto ok;
12013 case 0xe3000000005eULL: s390_format_RXY_RRRD(s390_irgen_ALY, ovl.fmt.RXY.r1,
12014 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12016 ovl.fmt.RXY.dh2); goto ok;
12017 case 0xe3000000005fULL: s390_format_RXY_RRRD(s390_irgen_SLY, ovl.fmt.RXY.r1,
12018 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12020 ovl.fmt.RXY.dh2); goto ok;
12021 case 0xe30000000070ULL: s390_format_RXY_RRRD(s390_irgen_STHY, ovl.fmt.RXY.r1,
12022 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12024 ovl.fmt.RXY.dh2); goto ok;
12025 case 0xe30000000071ULL: s390_format_RXY_RRRD(s390_irgen_LAY, ovl.fmt.RXY.r1,
12026 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12028 ovl.fmt.RXY.dh2); goto ok;
12029 case 0xe30000000072ULL: s390_format_RXY_RRRD(s390_irgen_STCY, ovl.fmt.RXY.r1,
12030 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12032 ovl.fmt.RXY.dh2); goto ok;
12033 case 0xe30000000073ULL: s390_format_RXY_RRRD(s390_irgen_ICY, ovl.fmt.RXY.r1,
12034 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12036 ovl.fmt.RXY.dh2); goto ok;
12037 case 0xe30000000075ULL: s390_format_RXY_RRRD(s390_irgen_LAEY, ovl.fmt.RXY.r1,
12038 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12040 ovl.fmt.RXY.dh2); goto ok;
12041 case 0xe30000000076ULL: s390_format_RXY_RRRD(s390_irgen_LB, ovl.fmt.RXY.r1,
12042 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12044 ovl.fmt.RXY.dh2); goto ok;
12045 case 0xe30000000077ULL: s390_format_RXY_RRRD(s390_irgen_LGB, ovl.fmt.RXY.r1,
12046 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12048 ovl.fmt.RXY.dh2); goto ok;
12049 case 0xe30000000078ULL: s390_format_RXY_RRRD(s390_irgen_LHY, ovl.fmt.RXY.r1,
12050 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12052 ovl.fmt.RXY.dh2); goto ok;
12053 case 0xe30000000079ULL: s390_format_RXY_RRRD(s390_irgen_CHY, ovl.fmt.RXY.r1,
12054 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12056 ovl.fmt.RXY.dh2); goto ok;
12057 case 0xe3000000007aULL: s390_format_RXY_RRRD(s390_irgen_AHY, ovl.fmt.RXY.r1,
12058 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12060 ovl.fmt.RXY.dh2); goto ok;
12061 case 0xe3000000007bULL: s390_format_RXY_RRRD(s390_irgen_SHY, ovl.fmt.RXY.r1,
12062 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12064 ovl.fmt.RXY.dh2); goto ok;
12065 case 0xe3000000007cULL: s390_format_RXY_RRRD(s390_irgen_MHY, ovl.fmt.RXY.r1,
12066 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12068 ovl.fmt.RXY.dh2); goto ok;
12069 case 0xe30000000080ULL: s390_format_RXY_RRRD(s390_irgen_NG, ovl.fmt.RXY.r1,
12070 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12072 ovl.fmt.RXY.dh2); goto ok;
12073 case 0xe30000000081ULL: s390_format_RXY_RRRD(s390_irgen_OG, ovl.fmt.RXY.r1,
12074 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12076 ovl.fmt.RXY.dh2); goto ok;
12077 case 0xe30000000082ULL: s390_format_RXY_RRRD(s390_irgen_XG, ovl.fmt.RXY.r1,
12078 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12080 ovl.fmt.RXY.dh2); goto ok;
12081 case 0xe30000000086ULL: s390_format_RXY_RRRD(s390_irgen_MLG, ovl.fmt.RXY.r1,
12082 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12084 ovl.fmt.RXY.dh2); goto ok;
12085 case 0xe30000000087ULL: s390_format_RXY_RRRD(s390_irgen_DLG, ovl.fmt.RXY.r1,
12086 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12088 ovl.fmt.RXY.dh2); goto ok;
12089 case 0xe30000000088ULL: s390_format_RXY_RRRD(s390_irgen_ALCG, ovl.fmt.RXY.r1,
12090 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12092 ovl.fmt.RXY.dh2); goto ok;
12093 case 0xe30000000089ULL: s390_format_RXY_RRRD(s390_irgen_SLBG, ovl.fmt.RXY.r1,
12094 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12096 ovl.fmt.RXY.dh2); goto ok;
12097 case 0xe3000000008eULL: s390_format_RXY_RRRD(s390_irgen_STPQ, ovl.fmt.RXY.r1,
12098 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12100 ovl.fmt.RXY.dh2); goto ok;
12101 case 0xe3000000008fULL: s390_format_RXY_RRRD(s390_irgen_LPQ, ovl.fmt.RXY.r1,
12102 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12104 ovl.fmt.RXY.dh2); goto ok;
12105 case 0xe30000000090ULL: s390_format_RXY_RRRD(s390_irgen_LLGC, ovl.fmt.RXY.r1,
12106 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12108 ovl.fmt.RXY.dh2); goto ok;
12109 case 0xe30000000091ULL: s390_format_RXY_RRRD(s390_irgen_LLGH, ovl.fmt.RXY.r1,
12110 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12112 ovl.fmt.RXY.dh2); goto ok;
12113 case 0xe30000000094ULL: s390_format_RXY_RRRD(s390_irgen_LLC, ovl.fmt.RXY.r1,
12114 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12116 ovl.fmt.RXY.dh2); goto ok;
12117 case 0xe30000000095ULL: s390_format_RXY_RRRD(s390_irgen_LLH, ovl.fmt.RXY.r1,
12118 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12120 ovl.fmt.RXY.dh2); goto ok;
12121 case 0xe30000000096ULL: s390_format_RXY_RRRD(s390_irgen_ML, ovl.fmt.RXY.r1,
12122 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12124 ovl.fmt.RXY.dh2); goto ok;
12125 case 0xe30000000097ULL: s390_format_RXY_RRRD(s390_irgen_DL, ovl.fmt.RXY.r1,
12126 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12128 ovl.fmt.RXY.dh2); goto ok;
12129 case 0xe30000000098ULL: s390_format_RXY_RRRD(s390_irgen_ALC, ovl.fmt.RXY.r1,
12130 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12132 ovl.fmt.RXY.dh2); goto ok;
12133 case 0xe30000000099ULL: s390_format_RXY_RRRD(s390_irgen_SLB, ovl.fmt.RXY.r1,
12134 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12136 ovl.fmt.RXY.dh2); goto ok;
12137 case 0xe300000000c0ULL: s390_format_RXY_RRRD(s390_irgen_LBH, ovl.fmt.RXY.r1,
12138 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12140 ovl.fmt.RXY.dh2); goto ok;
12141 case 0xe300000000c2ULL: s390_format_RXY_RRRD(s390_irgen_LLCH, ovl.fmt.RXY.r1,
12142 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12144 ovl.fmt.RXY.dh2); goto ok;
12145 case 0xe300000000c3ULL: s390_format_RXY_RRRD(s390_irgen_STCH, ovl.fmt.RXY.r1,
12146 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12148 ovl.fmt.RXY.dh2); goto ok;
12149 case 0xe300000000c4ULL: s390_format_RXY_RRRD(s390_irgen_LHH, ovl.fmt.RXY.r1,
12150 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12152 ovl.fmt.RXY.dh2); goto ok;
12153 case 0xe300000000c6ULL: s390_format_RXY_RRRD(s390_irgen_LLHH, ovl.fmt.RXY.r1,
12154 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12156 ovl.fmt.RXY.dh2); goto ok;
12157 case 0xe300000000c7ULL: s390_format_RXY_RRRD(s390_irgen_STHH, ovl.fmt.RXY.r1,
12158 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12160 ovl.fmt.RXY.dh2); goto ok;
12161 case 0xe300000000caULL: s390_format_RXY_RRRD(s390_irgen_LFH, ovl.fmt.RXY.r1,
12162 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12164 ovl.fmt.RXY.dh2); goto ok;
12165 case 0xe300000000cbULL: s390_format_RXY_RRRD(s390_irgen_STFH, ovl.fmt.RXY.r1,
12166 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12168 ovl.fmt.RXY.dh2); goto ok;
12169 case 0xe300000000cdULL: s390_format_RXY_RRRD(s390_irgen_CHF, ovl.fmt.RXY.r1,
12170 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12172 ovl.fmt.RXY.dh2); goto ok;
12173 case 0xe300000000cfULL: s390_format_RXY_RRRD(s390_irgen_CLHF, ovl.fmt.RXY.r1,
12174 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12176 ovl.fmt.RXY.dh2); goto ok;
12177 case 0xeb0000000004ULL: s390_format_RSY_RRRD(s390_irgen_LMG, ovl.fmt.RSY.r1,
12178 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12180 ovl.fmt.RSY.dh2); goto ok;
12181 case 0xeb000000000aULL: s390_format_RSY_RRRD(s390_irgen_SRAG, ovl.fmt.RSY.r1,
12182 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12184 ovl.fmt.RSY.dh2); goto ok;
12185 case 0xeb000000000bULL: s390_format_RSY_RRRD(s390_irgen_SLAG, ovl.fmt.RSY.r1,
12186 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12188 ovl.fmt.RSY.dh2); goto ok;
12189 case 0xeb000000000cULL: s390_format_RSY_RRRD(s390_irgen_SRLG, ovl.fmt.RSY.r1,
12190 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12192 ovl.fmt.RSY.dh2); goto ok;
12193 case 0xeb000000000dULL: s390_format_RSY_RRRD(s390_irgen_SLLG, ovl.fmt.RSY.r1,
12194 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12196 ovl.fmt.RSY.dh2); goto ok;
12197 case 0xeb000000000fULL: /* TRACG */ goto unimplemented;
12198 case 0xeb0000000014ULL: s390_format_RSY_RRRD(s390_irgen_CSY, ovl.fmt.RSY.r1,
12199 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12201 ovl.fmt.RSY.dh2); goto ok;
12202 case 0xeb000000001cULL: s390_format_RSY_RRRD(s390_irgen_RLLG, ovl.fmt.RSY.r1,
12203 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12205 ovl.fmt.RSY.dh2); goto ok;
12206 case 0xeb000000001dULL: s390_format_RSY_RRRD(s390_irgen_RLL, ovl.fmt.RSY.r1,
12207 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12209 ovl.fmt.RSY.dh2); goto ok;
12210 case 0xeb0000000020ULL: s390_format_RSY_RURD(s390_irgen_CLMH, ovl.fmt.RSY.r1,
12211 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12213 ovl.fmt.RSY.dh2); goto ok;
12214 case 0xeb0000000021ULL: s390_format_RSY_RURD(s390_irgen_CLMY, ovl.fmt.RSY.r1,
12215 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12217 ovl.fmt.RSY.dh2); goto ok;
12218 case 0xeb0000000024ULL: s390_format_RSY_RRRD(s390_irgen_STMG, ovl.fmt.RSY.r1,
12219 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12221 ovl.fmt.RSY.dh2); goto ok;
12222 case 0xeb0000000025ULL: /* STCTG */ goto unimplemented;
12223 case 0xeb0000000026ULL: s390_format_RSY_RRRD(s390_irgen_STMH, ovl.fmt.RSY.r1,
12224 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12226 ovl.fmt.RSY.dh2); goto ok;
12227 case 0xeb000000002cULL: s390_format_RSY_RURD(s390_irgen_STCMH,
12228 ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
12229 ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
12230 ovl.fmt.RSY.dh2); goto ok;
12231 case 0xeb000000002dULL: s390_format_RSY_RURD(s390_irgen_STCMY,
12232 ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
12233 ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
12234 ovl.fmt.RSY.dh2); goto ok;
12235 case 0xeb000000002fULL: /* LCTLG */ goto unimplemented;
12236 case 0xeb0000000030ULL: s390_format_RSY_RRRD(s390_irgen_CSG, ovl.fmt.RSY.r1,
12237 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12239 ovl.fmt.RSY.dh2); goto ok;
12240 case 0xeb0000000031ULL: /* CDSY */ goto unimplemented;
12241 case 0xeb000000003eULL: /* CDSG */ goto unimplemented;
12242 case 0xeb0000000044ULL: s390_format_RSY_RRRD(s390_irgen_BXHG, ovl.fmt.RSY.r1,
12243 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12245 ovl.fmt.RSY.dh2); goto ok;
12246 case 0xeb0000000045ULL: s390_format_RSY_RRRD(s390_irgen_BXLEG,
12247 ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
12248 ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
12249 ovl.fmt.RSY.dh2); goto ok;
12250 case 0xeb000000004cULL: /* ECAG */ goto unimplemented;
12251 case 0xeb0000000051ULL: s390_format_SIY_URD(s390_irgen_TMY, ovl.fmt.SIY.i2,
12252 ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
12253 ovl.fmt.SIY.dh1); goto ok;
12254 case 0xeb0000000052ULL: s390_format_SIY_URD(s390_irgen_MVIY, ovl.fmt.SIY.i2,
12255 ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
12256 ovl.fmt.SIY.dh1); goto ok;
12257 case 0xeb0000000054ULL: s390_format_SIY_URD(s390_irgen_NIY, ovl.fmt.SIY.i2,
12258 ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
12259 ovl.fmt.SIY.dh1); goto ok;
12260 case 0xeb0000000055ULL: s390_format_SIY_URD(s390_irgen_CLIY, ovl.fmt.SIY.i2,
12261 ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
12262 ovl.fmt.SIY.dh1); goto ok;
12263 case 0xeb0000000056ULL: s390_format_SIY_URD(s390_irgen_OIY, ovl.fmt.SIY.i2,
12264 ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
12265 ovl.fmt.SIY.dh1); goto ok;
12266 case 0xeb0000000057ULL: s390_format_SIY_URD(s390_irgen_XIY, ovl.fmt.SIY.i2,
12267 ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
12268 ovl.fmt.SIY.dh1); goto ok;
12269 case 0xeb000000006aULL: s390_format_SIY_IRD(s390_irgen_ASI, ovl.fmt.SIY.i2,
12270 ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
12271 ovl.fmt.SIY.dh1); goto ok;
12272 case 0xeb000000006eULL: s390_format_SIY_IRD(s390_irgen_ALSI, ovl.fmt.SIY.i2,
12273 ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
12274 ovl.fmt.SIY.dh1); goto ok;
12275 case 0xeb000000007aULL: s390_format_SIY_IRD(s390_irgen_AGSI, ovl.fmt.SIY.i2,
12276 ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
12277 ovl.fmt.SIY.dh1); goto ok;
12278 case 0xeb000000007eULL: s390_format_SIY_IRD(s390_irgen_ALGSI, ovl.fmt.SIY.i2,
12279 ovl.fmt.SIY.b1, ovl.fmt.SIY.dl1,
12280 ovl.fmt.SIY.dh1); goto ok;
12281 case 0xeb0000000080ULL: s390_format_RSY_RURD(s390_irgen_ICMH, ovl.fmt.RSY.r1,
12282 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12284 ovl.fmt.RSY.dh2); goto ok;
12285 case 0xeb0000000081ULL: s390_format_RSY_RURD(s390_irgen_ICMY, ovl.fmt.RSY.r1,
12286 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12288 ovl.fmt.RSY.dh2); goto ok;
12289 case 0xeb000000008eULL: /* MVCLU */ goto unimplemented;
12290 case 0xeb000000008fULL: /* CLCLU */ goto unimplemented;
12291 case 0xeb0000000090ULL: s390_format_RSY_RRRD(s390_irgen_STMY, ovl.fmt.RSY.r1,
12292 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12294 ovl.fmt.RSY.dh2); goto ok;
12295 case 0xeb0000000096ULL: s390_format_RSY_RRRD(s390_irgen_LMH, ovl.fmt.RSY.r1,
12296 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12298 ovl.fmt.RSY.dh2); goto ok;
12299 case 0xeb0000000098ULL: s390_format_RSY_RRRD(s390_irgen_LMY, ovl.fmt.RSY.r1,
12300 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12302 ovl.fmt.RSY.dh2); goto ok;
12303 case 0xeb000000009aULL: s390_format_RSY_AARD(s390_irgen_LAMY, ovl.fmt.RSY.r1,
12304 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12306 ovl.fmt.RSY.dh2); goto ok;
12307 case 0xeb000000009bULL: s390_format_RSY_AARD(s390_irgen_STAMY,
12308 ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
12309 ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
12310 ovl.fmt.RSY.dh2); goto ok;
12311 case 0xeb00000000c0ULL: /* TP */ goto unimplemented;
12312 case 0xeb00000000dcULL: s390_format_RSY_RRRD(s390_irgen_SRAK, ovl.fmt.RSY.r1,
12313 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12315 ovl.fmt.RSY.dh2); goto ok;
12316 case 0xeb00000000ddULL: s390_format_RSY_RRRD(s390_irgen_SLAK, ovl.fmt.RSY.r1,
12317 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12319 ovl.fmt.RSY.dh2); goto ok;
12320 case 0xeb00000000deULL: s390_format_RSY_RRRD(s390_irgen_SRLK, ovl.fmt.RSY.r1,
12321 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12323 ovl.fmt.RSY.dh2); goto ok;
12324 case 0xeb00000000dfULL: s390_format_RSY_RRRD(s390_irgen_SLLK, ovl.fmt.RSY.r1,
12325 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12327 ovl.fmt.RSY.dh2); goto ok;
12328 case 0xeb00000000e2ULL: s390_format_RSY_RDRM(s390_irgen_LOCG, ovl.fmt.RSY.r1,
12329 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12332 S390_XMNM_LOCG); goto ok;
12333 case 0xeb00000000e3ULL: s390_format_RSY_RDRM(s390_irgen_STOCG,
12334 ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
12335 ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
12337 S390_XMNM_STOCG); goto ok;
12338 case 0xeb00000000e4ULL: s390_format_RSY_RRRD(s390_irgen_LANG, ovl.fmt.RSY.r1,
12339 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12341 ovl.fmt.RSY.dh2); goto ok;
12342 case 0xeb00000000e6ULL: s390_format_RSY_RRRD(s390_irgen_LAOG, ovl.fmt.RSY.r1,
12343 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12345 ovl.fmt.RSY.dh2); goto ok;
12346 case 0xeb00000000e7ULL: s390_format_RSY_RRRD(s390_irgen_LAXG, ovl.fmt.RSY.r1,
12347 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12349 ovl.fmt.RSY.dh2); goto ok;
12350 case 0xeb00000000e8ULL: s390_format_RSY_RRRD(s390_irgen_LAAG, ovl.fmt.RSY.r1,
12351 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12353 ovl.fmt.RSY.dh2); goto ok;
12354 case 0xeb00000000eaULL: s390_format_RSY_RRRD(s390_irgen_LAALG,
12355 ovl.fmt.RSY.r1, ovl.fmt.RSY.r3,
12356 ovl.fmt.RSY.b2, ovl.fmt.RSY.dl2,
12357 ovl.fmt.RSY.dh2); goto ok;
12358 case 0xeb00000000f2ULL: s390_format_RSY_RDRM(s390_irgen_LOC, ovl.fmt.RSY.r1,
12359 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12361 ovl.fmt.RSY.dh2, S390_XMNM_LOC);
12363 case 0xeb00000000f3ULL: s390_format_RSY_RDRM(s390_irgen_STOC, ovl.fmt.RSY.r1,
12364 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12367 S390_XMNM_STOC); goto ok;
12368 case 0xeb00000000f4ULL: s390_format_RSY_RRRD(s390_irgen_LAN, ovl.fmt.RSY.r1,
12369 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12371 ovl.fmt.RSY.dh2); goto ok;
12372 case 0xeb00000000f6ULL: s390_format_RSY_RRRD(s390_irgen_LAO, ovl.fmt.RSY.r1,
12373 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12375 ovl.fmt.RSY.dh2); goto ok;
12376 case 0xeb00000000f7ULL: s390_format_RSY_RRRD(s390_irgen_LAX, ovl.fmt.RSY.r1,
12377 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12379 ovl.fmt.RSY.dh2); goto ok;
12380 case 0xeb00000000f8ULL: s390_format_RSY_RRRD(s390_irgen_LAA, ovl.fmt.RSY.r1,
12381 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12383 ovl.fmt.RSY.dh2); goto ok;
12384 case 0xeb00000000faULL: s390_format_RSY_RRRD(s390_irgen_LAAL, ovl.fmt.RSY.r1,
12385 ovl.fmt.RSY.r3, ovl.fmt.RSY.b2,
12387 ovl.fmt.RSY.dh2); goto ok;
12388 case 0xec0000000044ULL: s390_format_RIE_RRP(s390_irgen_BRXHG, ovl.fmt.RIE.r1,
12389 ovl.fmt.RIE.r3, ovl.fmt.RIE.i2);
12391 case 0xec0000000045ULL: s390_format_RIE_RRP(s390_irgen_BRXLG, ovl.fmt.RIE.r1,
12392 ovl.fmt.RIE.r3, ovl.fmt.RIE.i2);
12394 case 0xec0000000051ULL: /* RISBLG */ goto unimplemented;
12395 case 0xec0000000054ULL: s390_format_RIE_RRUUU(s390_irgen_RNSBG,
12396 ovl.fmt.RIE_RRUUU.r1,
12397 ovl.fmt.RIE_RRUUU.r2,
12398 ovl.fmt.RIE_RRUUU.i3,
12399 ovl.fmt.RIE_RRUUU.i4,
12400 ovl.fmt.RIE_RRUUU.i5);
12402 case 0xec0000000055ULL: s390_format_RIE_RRUUU(s390_irgen_RISBG,
12403 ovl.fmt.RIE_RRUUU.r1,
12404 ovl.fmt.RIE_RRUUU.r2,
12405 ovl.fmt.RIE_RRUUU.i3,
12406 ovl.fmt.RIE_RRUUU.i4,
12407 ovl.fmt.RIE_RRUUU.i5);
12409 case 0xec0000000056ULL: s390_format_RIE_RRUUU(s390_irgen_ROSBG,
12410 ovl.fmt.RIE_RRUUU.r1,
12411 ovl.fmt.RIE_RRUUU.r2,
12412 ovl.fmt.RIE_RRUUU.i3,
12413 ovl.fmt.RIE_RRUUU.i4,
12414 ovl.fmt.RIE_RRUUU.i5);
12416 case 0xec0000000057ULL: s390_format_RIE_RRUUU(s390_irgen_RXSBG,
12417 ovl.fmt.RIE_RRUUU.r1,
12418 ovl.fmt.RIE_RRUUU.r2,
12419 ovl.fmt.RIE_RRUUU.i3,
12420 ovl.fmt.RIE_RRUUU.i4,
12421 ovl.fmt.RIE_RRUUU.i5);
12423 case 0xec000000005dULL: /* RISBHG */ goto unimplemented;
12424 case 0xec0000000064ULL: s390_format_RIE_RRPU(s390_irgen_CGRJ,
12425 ovl.fmt.RIE_RRPU.r1,
12426 ovl.fmt.RIE_RRPU.r2,
12427 ovl.fmt.RIE_RRPU.i4,
12428 ovl.fmt.RIE_RRPU.m3); goto ok;
12429 case 0xec0000000065ULL: s390_format_RIE_RRPU(s390_irgen_CLGRJ,
12430 ovl.fmt.RIE_RRPU.r1,
12431 ovl.fmt.RIE_RRPU.r2,
12432 ovl.fmt.RIE_RRPU.i4,
12433 ovl.fmt.RIE_RRPU.m3); goto ok;
12434 case 0xec0000000070ULL: /* CGIT */ goto unimplemented;
12435 case 0xec0000000071ULL: /* CLGIT */ goto unimplemented;
12436 case 0xec0000000072ULL: /* CIT */ goto unimplemented;
12437 case 0xec0000000073ULL: /* CLFIT */ goto unimplemented;
12438 case 0xec0000000076ULL: s390_format_RIE_RRPU(s390_irgen_CRJ,
12439 ovl.fmt.RIE_RRPU.r1,
12440 ovl.fmt.RIE_RRPU.r2,
12441 ovl.fmt.RIE_RRPU.i4,
12442 ovl.fmt.RIE_RRPU.m3); goto ok;
12443 case 0xec0000000077ULL: s390_format_RIE_RRPU(s390_irgen_CLRJ,
12444 ovl.fmt.RIE_RRPU.r1,
12445 ovl.fmt.RIE_RRPU.r2,
12446 ovl.fmt.RIE_RRPU.i4,
12447 ovl.fmt.RIE_RRPU.m3); goto ok;
12448 case 0xec000000007cULL: s390_format_RIE_RUPI(s390_irgen_CGIJ,
12452 ovl.fmt.RIEv3.i2); goto ok;
12453 case 0xec000000007dULL: s390_format_RIE_RUPU(s390_irgen_CLGIJ,
12457 ovl.fmt.RIEv3.i2); goto ok;
12458 case 0xec000000007eULL: s390_format_RIE_RUPI(s390_irgen_CIJ,
12462 ovl.fmt.RIEv3.i2); goto ok;
12463 case 0xec000000007fULL: s390_format_RIE_RUPU(s390_irgen_CLIJ,
12467 ovl.fmt.RIEv3.i2); goto ok;
12468 case 0xec00000000d8ULL: s390_format_RIE_RRI0(s390_irgen_AHIK, ovl.fmt.RIE.r1,
12469 ovl.fmt.RIE.r3, ovl.fmt.RIE.i2);
12471 case 0xec00000000d9ULL: s390_format_RIE_RRI0(s390_irgen_AGHIK,
12472 ovl.fmt.RIE.r1, ovl.fmt.RIE.r3,
12473 ovl.fmt.RIE.i2); goto ok;
12474 case 0xec00000000daULL: s390_format_RIE_RRI0(s390_irgen_ALHSIK,
12475 ovl.fmt.RIE.r1, ovl.fmt.RIE.r3,
12476 ovl.fmt.RIE.i2); goto ok;
12477 case 0xec00000000dbULL: s390_format_RIE_RRI0(s390_irgen_ALGHSIK,
12478 ovl.fmt.RIE.r1, ovl.fmt.RIE.r3,
12479 ovl.fmt.RIE.i2); goto ok;
12480 case 0xec00000000e4ULL: s390_format_RRS(s390_irgen_CGRB, ovl.fmt.RRS.r1,
12481 ovl.fmt.RRS.r2, ovl.fmt.RRS.b4,
12482 ovl.fmt.RRS.d4, ovl.fmt.RRS.m3);
12484 case 0xec00000000e5ULL: s390_format_RRS(s390_irgen_CLGRB, ovl.fmt.RRS.r1,
12485 ovl.fmt.RRS.r2, ovl.fmt.RRS.b4,
12486 ovl.fmt.RRS.d4, ovl.fmt.RRS.m3);
12488 case 0xec00000000f6ULL: s390_format_RRS(s390_irgen_CRB, ovl.fmt.RRS.r1,
12489 ovl.fmt.RRS.r2, ovl.fmt.RRS.b4,
12490 ovl.fmt.RRS.d4, ovl.fmt.RRS.m3);
12492 case 0xec00000000f7ULL: s390_format_RRS(s390_irgen_CLRB, ovl.fmt.RRS.r1,
12493 ovl.fmt.RRS.r2, ovl.fmt.RRS.b4,
12494 ovl.fmt.RRS.d4, ovl.fmt.RRS.m3);
12496 case 0xec00000000fcULL: s390_format_RIS_RURDI(s390_irgen_CGIB,
12497 ovl.fmt.RIS.r1, ovl.fmt.RIS.m3,
12498 ovl.fmt.RIS.b4, ovl.fmt.RIS.d4,
12499 ovl.fmt.RIS.i2); goto ok;
12500 case 0xec00000000fdULL: s390_format_RIS_RURDU(s390_irgen_CLGIB,
12501 ovl.fmt.RIS.r1, ovl.fmt.RIS.m3,
12502 ovl.fmt.RIS.b4, ovl.fmt.RIS.d4,
12503 ovl.fmt.RIS.i2); goto ok;
12504 case 0xec00000000feULL: s390_format_RIS_RURDI(s390_irgen_CIB, ovl.fmt.RIS.r1,
12505 ovl.fmt.RIS.m3, ovl.fmt.RIS.b4,
12507 ovl.fmt.RIS.i2); goto ok;
12508 case 0xec00000000ffULL: s390_format_RIS_RURDU(s390_irgen_CLIB,
12509 ovl.fmt.RIS.r1, ovl.fmt.RIS.m3,
12510 ovl.fmt.RIS.b4, ovl.fmt.RIS.d4,
12511 ovl.fmt.RIS.i2); goto ok;
12512 case 0xed0000000004ULL: s390_format_RXE_FRRD(s390_irgen_LDEB, ovl.fmt.RXE.r1,
12513 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12514 ovl.fmt.RXE.d2); goto ok;
12515 case 0xed0000000005ULL: s390_format_RXE_FRRD(s390_irgen_LXDB, ovl.fmt.RXE.r1,
12516 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12517 ovl.fmt.RXE.d2); goto ok;
12518 case 0xed0000000006ULL: s390_format_RXE_FRRD(s390_irgen_LXEB, ovl.fmt.RXE.r1,
12519 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12520 ovl.fmt.RXE.d2); goto ok;
12521 case 0xed0000000007ULL: /* MXDB */ goto unimplemented;
12522 case 0xed0000000008ULL: /* KEB */ goto unimplemented;
12523 case 0xed0000000009ULL: s390_format_RXE_FRRD(s390_irgen_CEB, ovl.fmt.RXE.r1,
12524 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12525 ovl.fmt.RXE.d2); goto ok;
12526 case 0xed000000000aULL: s390_format_RXE_FRRD(s390_irgen_AEB, ovl.fmt.RXE.r1,
12527 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12528 ovl.fmt.RXE.d2); goto ok;
12529 case 0xed000000000bULL: s390_format_RXE_FRRD(s390_irgen_SEB, ovl.fmt.RXE.r1,
12530 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12531 ovl.fmt.RXE.d2); goto ok;
12532 case 0xed000000000cULL: /* MDEB */ goto unimplemented;
12533 case 0xed000000000dULL: s390_format_RXE_FRRD(s390_irgen_DEB, ovl.fmt.RXE.r1,
12534 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12535 ovl.fmt.RXE.d2); goto ok;
12536 case 0xed000000000eULL: s390_format_RXF_FRRDF(s390_irgen_MAEB,
12537 ovl.fmt.RXF.r3, ovl.fmt.RXF.x2,
12538 ovl.fmt.RXF.b2, ovl.fmt.RXF.d2,
12539 ovl.fmt.RXF.r1); goto ok;
12540 case 0xed000000000fULL: s390_format_RXF_FRRDF(s390_irgen_MSEB,
12541 ovl.fmt.RXF.r3, ovl.fmt.RXF.x2,
12542 ovl.fmt.RXF.b2, ovl.fmt.RXF.d2,
12543 ovl.fmt.RXF.r1); goto ok;
12544 case 0xed0000000010ULL: s390_format_RXE_FRRD(s390_irgen_TCEB, ovl.fmt.RXE.r1,
12545 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12546 ovl.fmt.RXE.d2); goto ok;
12547 case 0xed0000000011ULL: s390_format_RXE_FRRD(s390_irgen_TCDB, ovl.fmt.RXE.r1,
12548 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12549 ovl.fmt.RXE.d2); goto ok;
12550 case 0xed0000000012ULL: s390_format_RXE_FRRD(s390_irgen_TCXB, ovl.fmt.RXE.r1,
12551 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12552 ovl.fmt.RXE.d2); goto ok;
12553 case 0xed0000000014ULL: s390_format_RXE_FRRD(s390_irgen_SQEB, ovl.fmt.RXE.r1,
12554 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12555 ovl.fmt.RXE.d2); goto ok;
12556 case 0xed0000000015ULL: s390_format_RXE_FRRD(s390_irgen_SQDB, ovl.fmt.RXE.r1,
12557 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12558 ovl.fmt.RXE.d2); goto ok;
12559 case 0xed0000000017ULL: s390_format_RXE_FRRD(s390_irgen_MEEB, ovl.fmt.RXE.r1,
12560 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12561 ovl.fmt.RXE.d2); goto ok;
12562 case 0xed0000000018ULL: /* KDB */ goto unimplemented;
12563 case 0xed0000000019ULL: s390_format_RXE_FRRD(s390_irgen_CDB, ovl.fmt.RXE.r1,
12564 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12565 ovl.fmt.RXE.d2); goto ok;
12566 case 0xed000000001aULL: s390_format_RXE_FRRD(s390_irgen_ADB, ovl.fmt.RXE.r1,
12567 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12568 ovl.fmt.RXE.d2); goto ok;
12569 case 0xed000000001bULL: s390_format_RXE_FRRD(s390_irgen_SDB, ovl.fmt.RXE.r1,
12570 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12571 ovl.fmt.RXE.d2); goto ok;
12572 case 0xed000000001cULL: s390_format_RXE_FRRD(s390_irgen_MDB, ovl.fmt.RXE.r1,
12573 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12574 ovl.fmt.RXE.d2); goto ok;
12575 case 0xed000000001dULL: s390_format_RXE_FRRD(s390_irgen_DDB, ovl.fmt.RXE.r1,
12576 ovl.fmt.RXE.x2, ovl.fmt.RXE.b2,
12577 ovl.fmt.RXE.d2); goto ok;
12578 case 0xed000000001eULL: s390_format_RXF_FRRDF(s390_irgen_MADB,
12579 ovl.fmt.RXF.r3, ovl.fmt.RXF.x2,
12580 ovl.fmt.RXF.b2, ovl.fmt.RXF.d2,
12581 ovl.fmt.RXF.r1); goto ok;
12582 case 0xed000000001fULL: s390_format_RXF_FRRDF(s390_irgen_MSDB,
12583 ovl.fmt.RXF.r3, ovl.fmt.RXF.x2,
12584 ovl.fmt.RXF.b2, ovl.fmt.RXF.d2,
12585 ovl.fmt.RXF.r1); goto ok;
12586 case 0xed0000000024ULL: /* LDE */ goto unimplemented;
12587 case 0xed0000000025ULL: /* LXD */ goto unimplemented;
12588 case 0xed0000000026ULL: /* LXE */ goto unimplemented;
12589 case 0xed000000002eULL: /* MAE */ goto unimplemented;
12590 case 0xed000000002fULL: /* MSE */ goto unimplemented;
12591 case 0xed0000000034ULL: /* SQE */ goto unimplemented;
12592 case 0xed0000000035ULL: /* SQD */ goto unimplemented;
12593 case 0xed0000000037ULL: /* MEE */ goto unimplemented;
12594 case 0xed0000000038ULL: /* MAYL */ goto unimplemented;
12595 case 0xed0000000039ULL: /* MYL */ goto unimplemented;
12596 case 0xed000000003aULL: /* MAY */ goto unimplemented;
12597 case 0xed000000003bULL: /* MY */ goto unimplemented;
12598 case 0xed000000003cULL: /* MAYH */ goto unimplemented;
12599 case 0xed000000003dULL: /* MYH */ goto unimplemented;
12600 case 0xed000000003eULL: /* MAD */ goto unimplemented;
12601 case 0xed000000003fULL: /* MSD */ goto unimplemented;
12602 case 0xed0000000040ULL: /* SLDT */ goto unimplemented;
12603 case 0xed0000000041ULL: /* SRDT */ goto unimplemented;
12604 case 0xed0000000048ULL: /* SLXT */ goto unimplemented;
12605 case 0xed0000000049ULL: /* SRXT */ goto unimplemented;
12606 case 0xed0000000050ULL: /* TDCET */ goto unimplemented;
12607 case 0xed0000000051ULL: /* TDGET */ goto unimplemented;
12608 case 0xed0000000054ULL: /* TDCDT */ goto unimplemented;
12609 case 0xed0000000055ULL: /* TDGDT */ goto unimplemented;
12610 case 0xed0000000058ULL: /* TDCXT */ goto unimplemented;
12611 case 0xed0000000059ULL: /* TDGXT */ goto unimplemented;
12612 case 0xed0000000064ULL: s390_format_RXY_FRRD(s390_irgen_LEY, ovl.fmt.RXY.r1,
12613 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12615 ovl.fmt.RXY.dh2); goto ok;
12616 case 0xed0000000065ULL: s390_format_RXY_FRRD(s390_irgen_LDY, ovl.fmt.RXY.r1,
12617 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12619 ovl.fmt.RXY.dh2); goto ok;
12620 case 0xed0000000066ULL: s390_format_RXY_FRRD(s390_irgen_STEY, ovl.fmt.RXY.r1,
12621 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12623 ovl.fmt.RXY.dh2); goto ok;
12624 case 0xed0000000067ULL: s390_format_RXY_FRRD(s390_irgen_STDY, ovl.fmt.RXY.r1,
12625 ovl.fmt.RXY.x2, ovl.fmt.RXY.b2,
12627 ovl.fmt.RXY.dh2); goto ok;
12630 switch (((ovl.value >> 16) & 0xff0f00000000ULL) >> 32) {
12631 case 0xc000ULL: s390_format_RIL_RP(s390_irgen_LARL, ovl.fmt.RIL.r1,
12632 ovl.fmt.RIL.i2); goto ok;
12633 case 0xc001ULL: s390_format_RIL_RI(s390_irgen_LGFI, ovl.fmt.RIL.r1,
12634 ovl.fmt.RIL.i2); goto ok;
12635 case 0xc004ULL: s390_format_RIL(s390_irgen_BRCL, ovl.fmt.RIL.r1,
12636 ovl.fmt.RIL.i2); goto ok;
12637 case 0xc005ULL: s390_format_RIL_RP(s390_irgen_BRASL, ovl.fmt.RIL.r1,
12638 ovl.fmt.RIL.i2); goto ok;
12639 case 0xc006ULL: s390_format_RIL_RU(s390_irgen_XIHF, ovl.fmt.RIL.r1,
12640 ovl.fmt.RIL.i2); goto ok;
12641 case 0xc007ULL: s390_format_RIL_RU(s390_irgen_XILF, ovl.fmt.RIL.r1,
12642 ovl.fmt.RIL.i2); goto ok;
12643 case 0xc008ULL: s390_format_RIL_RU(s390_irgen_IIHF, ovl.fmt.RIL.r1,
12644 ovl.fmt.RIL.i2); goto ok;
12645 case 0xc009ULL: s390_format_RIL_RU(s390_irgen_IILF, ovl.fmt.RIL.r1,
12646 ovl.fmt.RIL.i2); goto ok;
12647 case 0xc00aULL: s390_format_RIL_RU(s390_irgen_NIHF, ovl.fmt.RIL.r1,
12648 ovl.fmt.RIL.i2); goto ok;
12649 case 0xc00bULL: s390_format_RIL_RU(s390_irgen_NILF, ovl.fmt.RIL.r1,
12650 ovl.fmt.RIL.i2); goto ok;
12651 case 0xc00cULL: s390_format_RIL_RU(s390_irgen_OIHF, ovl.fmt.RIL.r1,
12652 ovl.fmt.RIL.i2); goto ok;
12653 case 0xc00dULL: s390_format_RIL_RU(s390_irgen_OILF, ovl.fmt.RIL.r1,
12654 ovl.fmt.RIL.i2); goto ok;
12655 case 0xc00eULL: s390_format_RIL_RU(s390_irgen_LLIHF, ovl.fmt.RIL.r1,
12656 ovl.fmt.RIL.i2); goto ok;
12657 case 0xc00fULL: s390_format_RIL_RU(s390_irgen_LLILF, ovl.fmt.RIL.r1,
12658 ovl.fmt.RIL.i2); goto ok;
12659 case 0xc200ULL: s390_format_RIL_RI(s390_irgen_MSGFI, ovl.fmt.RIL.r1,
12660 ovl.fmt.RIL.i2); goto ok;
12661 case 0xc201ULL: s390_format_RIL_RI(s390_irgen_MSFI, ovl.fmt.RIL.r1,
12662 ovl.fmt.RIL.i2); goto ok;
12663 case 0xc204ULL: s390_format_RIL_RU(s390_irgen_SLGFI, ovl.fmt.RIL.r1,
12664 ovl.fmt.RIL.i2); goto ok;
12665 case 0xc205ULL: s390_format_RIL_RU(s390_irgen_SLFI, ovl.fmt.RIL.r1,
12666 ovl.fmt.RIL.i2); goto ok;
12667 case 0xc208ULL: s390_format_RIL_RI(s390_irgen_AGFI, ovl.fmt.RIL.r1,
12668 ovl.fmt.RIL.i2); goto ok;
12669 case 0xc209ULL: s390_format_RIL_RI(s390_irgen_AFI, ovl.fmt.RIL.r1,
12670 ovl.fmt.RIL.i2); goto ok;
12671 case 0xc20aULL: s390_format_RIL_RU(s390_irgen_ALGFI, ovl.fmt.RIL.r1,
12672 ovl.fmt.RIL.i2); goto ok;
12673 case 0xc20bULL: s390_format_RIL_RU(s390_irgen_ALFI, ovl.fmt.RIL.r1,
12674 ovl.fmt.RIL.i2); goto ok;
12675 case 0xc20cULL: s390_format_RIL_RI(s390_irgen_CGFI, ovl.fmt.RIL.r1,
12676 ovl.fmt.RIL.i2); goto ok;
12677 case 0xc20dULL: s390_format_RIL_RI(s390_irgen_CFI, ovl.fmt.RIL.r1,
12678 ovl.fmt.RIL.i2); goto ok;
12679 case 0xc20eULL: s390_format_RIL_RU(s390_irgen_CLGFI, ovl.fmt.RIL.r1,
12680 ovl.fmt.RIL.i2); goto ok;
12681 case 0xc20fULL: s390_format_RIL_RU(s390_irgen_CLFI, ovl.fmt.RIL.r1,
12682 ovl.fmt.RIL.i2); goto ok;
12683 case 0xc402ULL: s390_format_RIL_RP(s390_irgen_LLHRL, ovl.fmt.RIL.r1,
12684 ovl.fmt.RIL.i2); goto ok;
12685 case 0xc404ULL: s390_format_RIL_RP(s390_irgen_LGHRL, ovl.fmt.RIL.r1,
12686 ovl.fmt.RIL.i2); goto ok;
12687 case 0xc405ULL: s390_format_RIL_RP(s390_irgen_LHRL, ovl.fmt.RIL.r1,
12688 ovl.fmt.RIL.i2); goto ok;
12689 case 0xc406ULL: s390_format_RIL_RP(s390_irgen_LLGHRL, ovl.fmt.RIL.r1,
12690 ovl.fmt.RIL.i2); goto ok;
12691 case 0xc407ULL: s390_format_RIL_RP(s390_irgen_STHRL, ovl.fmt.RIL.r1,
12692 ovl.fmt.RIL.i2); goto ok;
12693 case 0xc408ULL: s390_format_RIL_RP(s390_irgen_LGRL, ovl.fmt.RIL.r1,
12694 ovl.fmt.RIL.i2); goto ok;
12695 case 0xc40bULL: s390_format_RIL_RP(s390_irgen_STGRL, ovl.fmt.RIL.r1,
12696 ovl.fmt.RIL.i2); goto ok;
12697 case 0xc40cULL: s390_format_RIL_RP(s390_irgen_LGFRL, ovl.fmt.RIL.r1,
12698 ovl.fmt.RIL.i2); goto ok;
12699 case 0xc40dULL: s390_format_RIL_RP(s390_irgen_LRL, ovl.fmt.RIL.r1,
12700 ovl.fmt.RIL.i2); goto ok;
12701 case 0xc40eULL: s390_format_RIL_RP(s390_irgen_LLGFRL, ovl.fmt.RIL.r1,
12702 ovl.fmt.RIL.i2); goto ok;
12703 case 0xc40fULL: s390_format_RIL_RP(s390_irgen_STRL, ovl.fmt.RIL.r1,
12704 ovl.fmt.RIL.i2); goto ok;
12705 case 0xc600ULL: s390_format_RIL_RP(s390_irgen_EXRL, ovl.fmt.RIL.r1,
12706 ovl.fmt.RIL.i2); goto ok;
12707 case 0xc602ULL: s390_format_RIL_UP(s390_irgen_PFDRL, ovl.fmt.RIL.r1,
12708 ovl.fmt.RIL.i2); goto ok;
12709 case 0xc604ULL: s390_format_RIL_RP(s390_irgen_CGHRL, ovl.fmt.RIL.r1,
12710 ovl.fmt.RIL.i2); goto ok;
12711 case 0xc605ULL: s390_format_RIL_RP(s390_irgen_CHRL, ovl.fmt.RIL.r1,
12712 ovl.fmt.RIL.i2); goto ok;
12713 case 0xc606ULL: s390_format_RIL_RP(s390_irgen_CLGHRL, ovl.fmt.RIL.r1,
12714 ovl.fmt.RIL.i2); goto ok;
12715 case 0xc607ULL: s390_format_RIL_RP(s390_irgen_CLHRL, ovl.fmt.RIL.r1,
12716 ovl.fmt.RIL.i2); goto ok;
12717 case 0xc608ULL: s390_format_RIL_RP(s390_irgen_CGRL, ovl.fmt.RIL.r1,
12718 ovl.fmt.RIL.i2); goto ok;
12719 case 0xc60aULL: s390_format_RIL_RP(s390_irgen_CLGRL, ovl.fmt.RIL.r1,
12720 ovl.fmt.RIL.i2); goto ok;
12721 case 0xc60cULL: s390_format_RIL_RP(s390_irgen_CGFRL, ovl.fmt.RIL.r1,
12722 ovl.fmt.RIL.i2); goto ok;
12723 case 0xc60dULL: s390_format_RIL_RP(s390_irgen_CRL, ovl.fmt.RIL.r1,
12724 ovl.fmt.RIL.i2); goto ok;
12725 case 0xc60eULL: s390_format_RIL_RP(s390_irgen_CLGFRL, ovl.fmt.RIL.r1,
12726 ovl.fmt.RIL.i2); goto ok;
12727 case 0xc60fULL: s390_format_RIL_RP(s390_irgen_CLRL, ovl.fmt.RIL.r1,
12728 ovl.fmt.RIL.i2); goto ok;
12729 case 0xc800ULL: /* MVCOS */ goto unimplemented;
12730 case 0xc801ULL: /* ECTG */ goto unimplemented;
12731 case 0xc802ULL: /* CSST */ goto unimplemented;
12732 case 0xc804ULL: /* LPD */ goto unimplemented;
12733 case 0xc805ULL: /* LPDG */ goto unimplemented;
12734 case 0xcc06ULL: /* BRCTH */ goto unimplemented;
12735 case 0xcc08ULL: s390_format_RIL_RI(s390_irgen_AIH, ovl.fmt.RIL.r1,
12736 ovl.fmt.RIL.i2); goto ok;
12737 case 0xcc0aULL: s390_format_RIL_RI(s390_irgen_ALSIH, ovl.fmt.RIL.r1,
12738 ovl.fmt.RIL.i2); goto ok;
12739 case 0xcc0bULL: s390_format_RIL_RI(s390_irgen_ALSIHN, ovl.fmt.RIL.r1,
12740 ovl.fmt.RIL.i2); goto ok;
12741 case 0xcc0dULL: s390_format_RIL_RI(s390_irgen_CIH, ovl.fmt.RIL.r1,
12742 ovl.fmt.RIL.i2); goto ok;
12743 case 0xcc0fULL: s390_format_RIL_RU(s390_irgen_CLIH, ovl.fmt.RIL.r1,
12744 ovl.fmt.RIL.i2); goto ok;
12747 switch (((ovl.value >> 16) & 0xff0000000000ULL) >> 40) {
12748 case 0xd0ULL: /* TRTR */ goto unimplemented;
12749 case 0xd1ULL: /* MVN */ goto unimplemented;
12750 case 0xd2ULL: s390_format_SS_L0RDRD(s390_irgen_MVC, ovl.fmt.SS.l,
12751 ovl.fmt.SS.b1, ovl.fmt.SS.d1,
12752 ovl.fmt.SS.b2, ovl.fmt.SS.d2); goto ok;
12753 case 0xd3ULL: /* MVZ */ goto unimplemented;
12754 case 0xd4ULL: s390_format_SS_L0RDRD(s390_irgen_NC, ovl.fmt.SS.l,
12755 ovl.fmt.SS.b1, ovl.fmt.SS.d1,
12756 ovl.fmt.SS.b2, ovl.fmt.SS.d2); goto ok;
12757 case 0xd5ULL: s390_format_SS_L0RDRD(s390_irgen_CLC, ovl.fmt.SS.l,
12758 ovl.fmt.SS.b1, ovl.fmt.SS.d1,
12759 ovl.fmt.SS.b2, ovl.fmt.SS.d2); goto ok;
12760 case 0xd6ULL: s390_format_SS_L0RDRD(s390_irgen_OC, ovl.fmt.SS.l,
12761 ovl.fmt.SS.b1, ovl.fmt.SS.d1,
12762 ovl.fmt.SS.b2, ovl.fmt.SS.d2); goto ok;
12764 if (ovl.fmt.SS.b1 == ovl.fmt.SS.b2 && ovl.fmt.SS.d1 == ovl.fmt.SS.d2)
12765 s390_irgen_XC_sameloc(ovl.fmt.SS.l, ovl.fmt.SS.b1, ovl.fmt.SS.d1);
12767 s390_format_SS_L0RDRD(s390_irgen_XC, ovl.fmt.SS.l,
12768 ovl.fmt.SS.b1, ovl.fmt.SS.d1,
12769 ovl.fmt.SS.b2, ovl.fmt.SS.d2);
12771 case 0xd9ULL: /* MVCK */ goto unimplemented;
12772 case 0xdaULL: /* MVCP */ goto unimplemented;
12773 case 0xdbULL: /* MVCS */ goto unimplemented;
12774 case 0xdcULL: /* TR */ goto unimplemented;
12775 case 0xddULL: /* TRT */ goto unimplemented;
12776 case 0xdeULL: /* ED */ goto unimplemented;
12777 case 0xdfULL: /* EDMK */ goto unimplemented;
12778 case 0xe1ULL: /* PKU */ goto unimplemented;
12779 case 0xe2ULL: /* UNPKU */ goto unimplemented;
12780 case 0xe8ULL: /* MVCIN */ goto unimplemented;
12781 case 0xe9ULL: /* PKA */ goto unimplemented;
12782 case 0xeaULL: /* UNPKA */ goto unimplemented;
12783 case 0xeeULL: /* PLO */ goto unimplemented;
12784 case 0xefULL: /* LMD */ goto unimplemented;
12785 case 0xf0ULL: /* SRP */ goto unimplemented;
12786 case 0xf1ULL: /* MVO */ goto unimplemented;
12787 case 0xf2ULL: /* PACK */ goto unimplemented;
12788 case 0xf3ULL: /* UNPK */ goto unimplemented;
12789 case 0xf8ULL: /* ZAP */ goto unimplemented;
12790 case 0xf9ULL: /* CP */ goto unimplemented;
12791 case 0xfaULL: /* AP */ goto unimplemented;
12792 case 0xfbULL: /* SP */ goto unimplemented;
12793 case 0xfcULL: /* MP */ goto unimplemented;
12794 case 0xfdULL: /* DP */ goto unimplemented;
12797 switch (((ovl.value >> 16) & 0xffff00000000ULL) >> 32) {
12798 case 0xe500ULL: /* LASP */ goto unimplemented;
12799 case 0xe501ULL: /* TPROT */ goto unimplemented;
12800 case 0xe502ULL: /* STRAG */ goto unimplemented;
12801 case 0xe50eULL: /* MVCSK */ goto unimplemented;
12802 case 0xe50fULL: /* MVCDK */ goto unimplemented;
12803 case 0xe544ULL: s390_format_SIL_RDI(s390_irgen_MVHHI, ovl.fmt.SIL.b1,
12804 ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
12806 case 0xe548ULL: s390_format_SIL_RDI(s390_irgen_MVGHI, ovl.fmt.SIL.b1,
12807 ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
12809 case 0xe54cULL: s390_format_SIL_RDI(s390_irgen_MVHI, ovl.fmt.SIL.b1,
12810 ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
12812 case 0xe554ULL: s390_format_SIL_RDI(s390_irgen_CHHSI, ovl.fmt.SIL.b1,
12813 ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
12815 case 0xe555ULL: s390_format_SIL_RDU(s390_irgen_CLHHSI, ovl.fmt.SIL.b1,
12816 ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
12818 case 0xe558ULL: s390_format_SIL_RDI(s390_irgen_CGHSI, ovl.fmt.SIL.b1,
12819 ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
12821 case 0xe559ULL: s390_format_SIL_RDU(s390_irgen_CLGHSI, ovl.fmt.SIL.b1,
12822 ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
12824 case 0xe55cULL: s390_format_SIL_RDI(s390_irgen_CHSI, ovl.fmt.SIL.b1,
12825 ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
12827 case 0xe55dULL: s390_format_SIL_RDU(s390_irgen_CLFHSI, ovl.fmt.SIL.b1,
12828 ovl.fmt.SIL.d1, ovl.fmt.SIL.i2);
12832 return S390_DECODE_UNKNOWN_INSN;
12835 return S390_DECODE_OK;
12838 return S390_DECODE_UNIMPLEMENTED_INSN;
12841 /* Handle "special" instructions. */
12842 static s390_decode_t
12843 s390_decode_special_and_irgen(UChar *bytes)
12845 s390_decode_t status = S390_DECODE_OK;
12847 /* Got a "Special" instruction preamble. Which one is it? */
12848 if (bytes[0] == 0x18 && bytes[1] == 0x22 /* lr %r2, %r2 */) {
12849 s390_irgen_client_request();
12850 } else if (bytes[0] == 0x18 && bytes[1] == 0x33 /* lr %r3, %r3 */) {
12851 s390_irgen_guest_NRADDR();
12852 } else if (bytes[0] == 0x18 && bytes[1] == 0x44 /* lr %r4, %r4 */) {
12853 s390_irgen_call_noredir();
12855 /* We don't know what it is. */
12856 return S390_DECODE_UNKNOWN_SPECIAL_INSN;
12859 dis_res->len = S390_SPECIAL_OP_PREAMBLE_SIZE + S390_SPECIAL_OP_SIZE;
12865 /* Function returns # bytes that were decoded or 0 in case of failure */
12867 s390_decode_and_irgen(UChar *bytes, UInt insn_length, DisResult *dres)
12869 s390_decode_t status;
12873 /* Spot the 8-byte preamble: 18ff lr r15,r15
12877 if (bytes[ 0] == 0x18 && bytes[ 1] == 0xff && bytes[ 2] == 0x18 &&
12878 bytes[ 3] == 0x11 && bytes[ 4] == 0x18 && bytes[ 5] == 0x22 &&
12879 bytes[ 6] == 0x18 && bytes[ 7] == 0x33) {
12881 /* Handle special instruction that follows that preamble. */
12882 if (0) vex_printf("special function handling...\n");
12883 bytes += S390_SPECIAL_OP_PREAMBLE_SIZE;
12884 status = s390_decode_special_and_irgen(bytes);
12885 insn_length = S390_SPECIAL_OP_SIZE;
12887 /* Handle normal instructions. */
12888 switch (insn_length) {
12890 status = s390_decode_2byte_and_irgen(bytes);
12894 status = s390_decode_4byte_and_irgen(bytes);
12898 status = s390_decode_6byte_and_irgen(bytes);
12902 status = S390_DECODE_ERROR;
12906 /* next instruction is execute, stop here */
12907 if (irsb->next == NULL && (*(char *)(HWord) guest_IA_next_instr == 0x44)) {
12908 irsb->next = IRExpr_Const(IRConst_U64(guest_IA_next_instr));
12909 dis_res->whatNext = Dis_StopHere;
12912 if (status == S390_DECODE_OK) return insn_length; /* OK */
12914 /* Decoding failed somehow */
12915 vex_printf("vex s390->IR: ");
12917 case S390_DECODE_UNKNOWN_INSN:
12918 vex_printf("unknown insn: ");
12921 case S390_DECODE_UNIMPLEMENTED_INSN:
12922 vex_printf("unimplemented insn: ");
12925 case S390_DECODE_UNKNOWN_SPECIAL_INSN:
12926 vex_printf("unimplemented special insn: ");
12930 case S390_DECODE_ERROR:
12931 vex_printf("decoding error: ");
12935 vex_printf("%02x%02x", bytes[0], bytes[1]);
12936 if (insn_length > 2) {
12937 vex_printf(" %02x%02x", bytes[2], bytes[3]);
12939 if (insn_length > 4) {
12940 vex_printf(" %02x%02x", bytes[4], bytes[5]);
12944 return 0; /* Failed */
12948 /* Generate an IRExpr for an address. */
12949 static __inline__ IRExpr *
12950 mkaddr_expr(Addr64 addr)
12952 return IRExpr_Const(IRConst_U64(addr));
12956 /* Disassemble a single instruction INSN into IR. */
12958 disInstr_S390_WRK(UChar *insn, Bool (*resteerOkFn)(void *, Addr64),
12959 void *callback_data)
12965 /* ---------------------------------------------------- */
12966 /* --- Compute instruction length -- */
12967 /* ---------------------------------------------------- */
12969 /* Get the first byte of the insn. */
12972 /* The leftmost two bits (0:1) encode the length of the insn in bytes.
12973 00 -> 2 bytes, 01 -> 4 bytes, 10 -> 4 bytes, 11 -> 6 bytes. */
12974 insn_length = ((((byte >> 6) + 1) >> 1) + 1) << 1;
12976 guest_IA_next_instr = guest_IA_curr_instr + insn_length;
12978 /* ---------------------------------------------------- */
12979 /* --- Initialise the DisResult data -- */
12980 /* ---------------------------------------------------- */
12981 dres.whatNext = Dis_Continue;
12982 dres.len = insn_length;
12983 dres.continueAt = 0;
12985 /* fixs390: we should probably pass the resteer-function and the callback
12986 data. It's not needed for correctness but improves performance. */
12988 /* Normal and special instruction handling starts here. */
12989 if (s390_decode_and_irgen(insn, insn_length, &dres) == 0) {
12990 /* All decode failures end up here. The decoder has already issued an
12992 Tell the dispatcher that this insn cannot be decoded, and so has
12993 not been executed, and (is currently) the next to be executed.
12994 IA should be up-to-date since it made so at the start of each
12995 insn, but nevertheless be paranoid and update it again right
12997 addStmtToIRSB(irsb, IRStmt_Put(S390_GUEST_OFFSET(guest_IA),
12998 mkaddr_expr(guest_IA_curr_instr)));
13000 irsb->next = mkaddr_expr(guest_IA_next_instr);
13001 irsb->jumpkind = Ijk_NoDecode;
13002 dres.whatNext = Dis_StopHere;
13012 /*------------------------------------------------------------*/
13013 /*--- Top-level fn ---*/
13014 /*------------------------------------------------------------*/
13016 /* Disassemble a single instruction into IR. The instruction
13017 is located in host memory at &guest_code[delta]. */
13020 disInstr_S390(IRSB *irsb_IN,
13022 Bool (*resteerOkFn)(void *, Addr64),
13024 void *callback_opaque,
13028 VexArch guest_arch,
13029 VexArchInfo *archinfo,
13030 VexAbiInfo *abiinfo,
13031 Bool host_bigendian)
13033 vassert(guest_arch == VexArchS390X);
13035 /* The instruction decoder requires a big-endian machine. */
13036 vassert(host_bigendian == True);
13038 /* Set globals (see top of this file) */
13039 guest_IA_curr_instr = guest_IP;
13043 vassert(guest_arch == VexArchS390X);
13045 /* We may be asked to update the guest IA before going further. */
13047 addStmtToIRSB(irsb, IRStmt_Put(S390_GUEST_OFFSET(guest_IA),
13048 mkaddr_expr(guest_IA_curr_instr)));
13050 return disInstr_S390_WRK(guest_code + delta, resteerOkFn, callback_opaque);
13053 /*---------------------------------------------------------------*/
13054 /*--- end guest_s390_toIR.c ---*/
13055 /*---------------------------------------------------------------*/