1 /*
2  * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
3  * Copyright (c) 2016, 2019 SAP SE. All rights reserved.
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This code is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License version 2 only, as
8  * published by the Free Software Foundation.
9  *
10  * This code is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13  * version 2 for more details (a copy is included in the LICENSE file that
14  * accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License version
17  * 2 along with this work; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19  *
20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21  * or visit www.oracle.com if you need additional information or have any
22  * questions.
23  *
24  */
25 
26 #ifndef CPU_S390_ASSEMBLER_S390_HPP
27 #define CPU_S390_ASSEMBLER_S390_HPP
28 
29 #undef  LUCY_DBG
30 
31 // Immediate is an abstraction to represent the various immediate
32 // operands which exist on z/Architecture. Neither this class nor
33 // instances hereof have an own state. It consists of methods only.
34 class Immediate {
35 
36  public:
is_simm(int64_t x,unsigned int nbits)37     static bool is_simm(int64_t x, unsigned int nbits) {
38       // nbits < 2   --> false
39       // nbits >= 64 --> true
40       assert(2 <= nbits && nbits < 64, "Don't call, use statically known result.");
41       const int64_t min      = -(1L << (nbits-1));
42       const int64_t maxplus1 =  (1L << (nbits-1));
43       return min <= x && x < maxplus1;
44     }
is_simm32(int64_t x)45     static bool is_simm32(int64_t x) {
46       return is_simm(x, 32);
47     }
is_simm20(int64_t x)48     static bool is_simm20(int64_t x) {
49       return is_simm(x, 20);
50     }
is_simm16(int64_t x)51     static bool is_simm16(int64_t x) {
52       return is_simm(x, 16);
53     }
is_simm8(int64_t x)54     static bool is_simm8(int64_t x) {
55       return is_simm(x,  8);
56     }
57 
58     // Test if x is within signed immediate range for nbits.
is_uimm(int64_t x,unsigned int nbits)59     static bool is_uimm(int64_t x, unsigned int nbits) {
60       // nbits == 0  --> false
61       // nbits >= 64 --> true
62       assert(1 <= nbits && nbits < 64, "don't call, use statically known result");
63       const uint64_t xu       = (unsigned long)x;
64       const uint64_t maxplus1 = 1UL << nbits;
65       return xu < maxplus1; // Unsigned comparison. Negative inputs appear to be very large.
66     }
is_uimm32(int64_t x)67     static bool is_uimm32(int64_t x) {
68       return is_uimm(x, 32);
69     }
is_uimm16(int64_t x)70     static bool is_uimm16(int64_t x) {
71       return is_uimm(x, 16);
72     }
is_uimm12(int64_t x)73     static bool is_uimm12(int64_t x) {
74       return is_uimm(x, 12);
75     }
is_uimm8(int64_t x)76     static bool is_uimm8(int64_t x) {
77       return is_uimm(x,  8);
78     }
79 };
80 
81 // Displacement is an abstraction to represent the various
82 // displacements which exist with addresses on z/ArchiTecture.
83 // Neither this class nor instances hereof have an own state. It
84 // consists of methods only.
85 class Displacement {
86 
87  public: // These tests are used outside the (Macro)Assembler world, e.g. in ad-file.
88 
is_longDisp(int64_t x)89   static bool is_longDisp(int64_t x) {  // Fits in a 20-bit displacement field.
90     return Immediate::is_simm20(x);
91   }
is_shortDisp(int64_t x)92   static bool is_shortDisp(int64_t x) { // Fits in a 12-bit displacement field.
93     return Immediate::is_uimm12(x);
94   }
is_validDisp(int64_t x)95   static bool is_validDisp(int64_t x) { // Is a valid displacement, regardless of length constraints.
96     return is_longDisp(x);
97   }
98 };
99 
100 // RelAddr is an abstraction to represent relative addresses in the
101 // form they are used on z/Architecture for instructions which access
102 // their operand with pc-relative addresses. Neither this class nor
103 // instances hereof have an own state. It consists of methods only.
104 class RelAddr {
105 
106  private: // No public use at all. Solely for (Macro)Assembler.
107 
is_in_range_of_RelAddr(address target,address pc,bool shortForm)108   static bool is_in_range_of_RelAddr(address target, address pc, bool shortForm) {
109     // Guard against illegal branch targets, e.g. -1. Occurrences in
110     // CompiledStaticCall and ad-file. Do not assert (it's a test
111     // function!). Just return false in case of illegal operands.
112     if ((((uint64_t)target) & 0x0001L) != 0) return false;
113     if ((((uint64_t)pc)     & 0x0001L) != 0) return false;
114 
115     if (shortForm) {
116       return Immediate::is_simm((int64_t)(target-pc), 17); // Relative short addresses can reach +/- 2**16 bytes.
117     } else {
118       return Immediate::is_simm((int64_t)(target-pc), 33); // Relative long addresses can reach +/- 2**32 bytes.
119     }
120   }
121 
is_in_range_of_RelAddr16(address target,address pc)122   static bool is_in_range_of_RelAddr16(address target, address pc) {
123     return is_in_range_of_RelAddr(target, pc, true);
124   }
is_in_range_of_RelAddr16(ptrdiff_t distance)125   static bool is_in_range_of_RelAddr16(ptrdiff_t distance) {
126     return is_in_range_of_RelAddr((address)distance, 0, true);
127   }
128 
is_in_range_of_RelAddr32(address target,address pc)129   static bool is_in_range_of_RelAddr32(address target, address pc) {
130     return is_in_range_of_RelAddr(target, pc, false);
131   }
is_in_range_of_RelAddr32(ptrdiff_t distance)132   static bool is_in_range_of_RelAddr32(ptrdiff_t distance) {
133     return is_in_range_of_RelAddr((address)distance, 0, false);
134   }
135 
pcrel_off(address target,address pc,bool shortForm)136   static int pcrel_off(address target, address pc, bool shortForm) {
137     assert(((uint64_t)target & 0x0001L) == 0, "target of a relative address must be aligned");
138     assert(((uint64_t)pc     & 0x0001L) == 0, "origin of a relative address must be aligned");
139 
140     if ((target == NULL) || (target == pc)) {
141       return 0;  // Yet unknown branch destination.
142     } else {
143       guarantee(is_in_range_of_RelAddr(target, pc, shortForm), "target not within reach");
144       return (int)((target - pc)>>1);
145     }
146   }
147 
pcrel_off16(address target,address pc)148   static int pcrel_off16(address target, address pc) {
149     return pcrel_off(target, pc, true);
150   }
pcrel_off16(ptrdiff_t distance)151   static int pcrel_off16(ptrdiff_t distance) {
152     return pcrel_off((address)distance, 0, true);
153   }
154 
pcrel_off32(address target,address pc)155   static int pcrel_off32(address target, address pc) {
156     return pcrel_off(target, pc, false);
157   }
pcrel_off32(ptrdiff_t distance)158   static int pcrel_off32(ptrdiff_t distance) {
159     return pcrel_off((address)distance, 0, false);
160   }
161 
inv_pcrel_off16(int offset)162   static ptrdiff_t inv_pcrel_off16(int offset) {
163     return ((ptrdiff_t)offset)<<1;
164   }
165 
inv_pcrel_off32(int offset)166   static ptrdiff_t inv_pcrel_off32(int offset) {
167     return ((ptrdiff_t)offset)<<1;
168   }
169 
170   friend class Assembler;
171   friend class MacroAssembler;
172   friend class NativeGeneralJump;
173 };
174 
175 // Address is an abstraction used to represent a memory location
176 // as passed to Z assembler instructions.
177 //
178 // Note: A register location is represented via a Register, not
179 // via an address for efficiency & simplicity reasons.
180 class Address {
181  private:
182   Register _base;    // Base register.
183   Register _index;   // Index register
184   intptr_t _disp;    // Constant displacement.
185 
186  public:
Address()187   Address() :
188     _base(noreg),
189     _index(noreg),
190     _disp(0) {}
191 
Address(Register base,Register index,intptr_t disp=0)192   Address(Register base, Register index, intptr_t disp = 0) :
193     _base(base),
194     _index(index),
195     _disp(disp) {}
196 
Address(Register base,intptr_t disp=0)197   Address(Register base, intptr_t disp = 0) :
198     _base(base),
199     _index(noreg),
200     _disp(disp) {}
201 
Address(Register base,RegisterOrConstant roc,intptr_t disp=0)202   Address(Register base, RegisterOrConstant roc, intptr_t disp = 0) :
203     _base(base),
204     _index(noreg),
205     _disp(disp) {
206     if (roc.is_constant()) _disp += roc.as_constant(); else _index = roc.as_register();
207   }
208 
209 #ifdef ASSERT
210   // ByteSize is only a class when ASSERT is defined, otherwise it's an int.
Address(Register base,ByteSize disp)211   Address(Register base, ByteSize disp) :
212     _base(base),
213     _index(noreg),
214     _disp(in_bytes(disp)) {}
215 
Address(Register base,Register index,ByteSize disp)216   Address(Register base, Register index, ByteSize disp) :
217     _base(base),
218     _index(index),
219     _disp(in_bytes(disp)) {}
220 #endif
221 
222   // Aborts if disp is a register and base and index are set already.
plus_disp(RegisterOrConstant disp) const223   Address plus_disp(RegisterOrConstant disp) const {
224     Address a = (*this);
225     a._disp += disp.constant_or_zero();
226     if (disp.is_register()) {
227       if (a._index == noreg) {
228         a._index = disp.as_register();
229       } else {
230         guarantee(_base == noreg, "can not encode"); a._base = disp.as_register();
231       }
232     }
233     return a;
234   }
235 
236   // A call to this is generated by adlc for replacement variable $xxx$$Address.
237   static Address make_raw(int base, int index, int scale, int disp, relocInfo::relocType disp_reloc);
238 
is_same_address(Address a) const239   bool is_same_address(Address a) const {
240     return _base == a._base && _index == a._index && _disp == a._disp;
241   }
242 
243   // testers
has_base() const244   bool has_base()  const { return _base  != noreg; }
has_index() const245   bool has_index() const { return _index != noreg; }
has_disp() const246   bool has_disp()  const { return true; } // There is no "invalid" value.
247 
is_disp12() const248   bool is_disp12() const { return Immediate::is_uimm12(disp()); }
is_disp20() const249   bool is_disp20() const { return Immediate::is_simm20(disp()); }
is_RSform()250   bool is_RSform()  { return has_base() && !has_index() && is_disp12(); }
is_RSYform()251   bool is_RSYform() { return has_base() && !has_index() && is_disp20(); }
is_RXform()252   bool is_RXform()  { return has_base() &&  has_index() && is_disp12(); }
is_RXYform()253   bool is_RXYform() { return has_base() &&  has_index() && is_disp20(); }
254 
uses(Register r)255   bool uses(Register r) { return _base == r || _index == r; };
256 
257   // accessors
base() const258   Register base()      const { return _base; }
baseOrR0() const259   Register baseOrR0()  const { assert(_base  != Z_R0, ""); return _base  == noreg ? Z_R0 : _base; }
index() const260   Register index()     const { return _index; }
indexOrR0() const261   Register indexOrR0() const { assert(_index != Z_R0, ""); return _index == noreg ? Z_R0 : _index; }
disp() const262   intptr_t disp() const { return _disp; }
263   // Specific version for short displacement instructions.
disp12() const264   int      disp12() const {
265     assert(is_disp12(), "displacement out of range for uimm12");
266     return _disp;
267   }
268   // Specific version for long displacement instructions.
disp20() const269   int      disp20() const {
270     assert(is_disp20(), "displacement out of range for simm20");
271     return _disp;
272   }
value() const273   intptr_t value() const { return _disp; }
274 
275   friend class Assembler;
276 };
277 
278 class AddressLiteral {
279  private:
280   address          _address;
281   RelocationHolder _rspec;
282 
rspec_from_rtype(relocInfo::relocType rtype,address addr)283   RelocationHolder rspec_from_rtype(relocInfo::relocType rtype, address addr) {
284     switch (rtype) {
285     case relocInfo::external_word_type:
286       return external_word_Relocation::spec(addr);
287     case relocInfo::internal_word_type:
288       return internal_word_Relocation::spec(addr);
289     case relocInfo::opt_virtual_call_type:
290       return opt_virtual_call_Relocation::spec();
291     case relocInfo::static_call_type:
292       return static_call_Relocation::spec();
293     case relocInfo::runtime_call_w_cp_type:
294       return runtime_call_w_cp_Relocation::spec();
295     case relocInfo::none:
296       return RelocationHolder();
297     default:
298       ShouldNotReachHere();
299       return RelocationHolder();
300     }
301   }
302 
303  protected:
304   // creation
AddressLiteral()305   AddressLiteral() : _address(NULL), _rspec(NULL) {}
306 
307  public:
AddressLiteral(address addr,RelocationHolder const & rspec)308   AddressLiteral(address addr, RelocationHolder const& rspec)
309     : _address(addr),
310       _rspec(rspec) {}
311 
312   // Some constructors to avoid casting at the call site.
AddressLiteral(jobject obj,RelocationHolder const & rspec)313   AddressLiteral(jobject obj, RelocationHolder const& rspec)
314     : _address((address) obj),
315       _rspec(rspec) {}
316 
AddressLiteral(intptr_t value,RelocationHolder const & rspec)317   AddressLiteral(intptr_t value, RelocationHolder const& rspec)
318     : _address((address) value),
319       _rspec(rspec) {}
320 
AddressLiteral(address addr,relocInfo::relocType rtype=relocInfo::none)321   AddressLiteral(address addr, relocInfo::relocType rtype = relocInfo::none)
322     : _address((address) addr),
323     _rspec(rspec_from_rtype(rtype, (address) addr)) {}
324 
325   // Some constructors to avoid casting at the call site.
AddressLiteral(address * addr,relocInfo::relocType rtype=relocInfo::none)326   AddressLiteral(address* addr, relocInfo::relocType rtype = relocInfo::none)
327     : _address((address) addr),
328     _rspec(rspec_from_rtype(rtype, (address) addr)) {}
329 
AddressLiteral(bool * addr,relocInfo::relocType rtype=relocInfo::none)330   AddressLiteral(bool* addr, relocInfo::relocType rtype = relocInfo::none)
331     : _address((address) addr),
332       _rspec(rspec_from_rtype(rtype, (address) addr)) {}
333 
AddressLiteral(const bool * addr,relocInfo::relocType rtype=relocInfo::none)334   AddressLiteral(const bool* addr, relocInfo::relocType rtype = relocInfo::none)
335     : _address((address) addr),
336       _rspec(rspec_from_rtype(rtype, (address) addr)) {}
337 
AddressLiteral(signed char * addr,relocInfo::relocType rtype=relocInfo::none)338   AddressLiteral(signed char* addr, relocInfo::relocType rtype = relocInfo::none)
339     : _address((address) addr),
340       _rspec(rspec_from_rtype(rtype, (address) addr)) {}
341 
AddressLiteral(int * addr,relocInfo::relocType rtype=relocInfo::none)342   AddressLiteral(int* addr, relocInfo::relocType rtype = relocInfo::none)
343     : _address((address) addr),
344       _rspec(rspec_from_rtype(rtype, (address) addr)) {}
345 
AddressLiteral(intptr_t addr,relocInfo::relocType rtype=relocInfo::none)346   AddressLiteral(intptr_t addr, relocInfo::relocType rtype = relocInfo::none)
347     : _address((address) addr),
348       _rspec(rspec_from_rtype(rtype, (address) addr)) {}
349 
AddressLiteral(intptr_t * addr,relocInfo::relocType rtype=relocInfo::none)350   AddressLiteral(intptr_t* addr, relocInfo::relocType rtype = relocInfo::none)
351     : _address((address) addr),
352       _rspec(rspec_from_rtype(rtype, (address) addr)) {}
353 
AddressLiteral(float * addr,relocInfo::relocType rtype=relocInfo::none)354   AddressLiteral(float* addr, relocInfo::relocType rtype = relocInfo::none)
355     : _address((address) addr),
356       _rspec(rspec_from_rtype(rtype, (address) addr)) {}
357 
AddressLiteral(double * addr,relocInfo::relocType rtype=relocInfo::none)358   AddressLiteral(double* addr, relocInfo::relocType rtype = relocInfo::none)
359     : _address((address) addr),
360       _rspec(rspec_from_rtype(rtype, (address) addr)) {}
361 
value() const362   intptr_t value() const { return (intptr_t) _address; }
363 
rtype() const364   const relocInfo::relocType rtype() const { return _rspec.type(); }
rspec() const365   const RelocationHolder&    rspec() const { return _rspec; }
366 
rspec(int offset) const367   RelocationHolder rspec(int offset) const {
368     return offset == 0 ? _rspec : _rspec.plus(offset);
369   }
370 };
371 
372 // Convenience classes
373 class ExternalAddress: public AddressLiteral {
374  private:
reloc_for_target(address target)375   static relocInfo::relocType reloc_for_target(address target) {
376     // Sometimes ExternalAddress is used for values which aren't
377     // exactly addresses, like the card table base.
378     // External_word_type can't be used for values in the first page
379     // so just skip the reloc in that case.
380     return external_word_Relocation::can_be_relocated(target) ? relocInfo::external_word_type : relocInfo::none;
381   }
382 
383  public:
ExternalAddress(address target)384   ExternalAddress(address target) : AddressLiteral(target, reloc_for_target(          target)) {}
385 };
386 
387 // Argument is an abstraction used to represent an outgoing actual
388 // argument or an incoming formal parameter, whether it resides in
389 // memory or in a register, in a manner consistent with the
390 // z/Architecture Application Binary Interface, or ABI. This is often
391 // referred to as the native or C calling convention.
392 class Argument {
393  private:
394   int _number;
395   bool _is_in;
396 
397  public:
398   enum {
399     // Only 5 registers may contain integer parameters.
400     n_register_parameters = 5,
401     // Can have up to 4 floating registers.
402     n_float_register_parameters = 4
403   };
404 
405   // creation
Argument(int number,bool is_in)406   Argument(int number, bool is_in) : _number(number), _is_in(is_in) {}
Argument(int number)407   Argument(int number) : _number(number) {}
408 
number() const409   int number() const { return _number; }
410 
successor() const411   Argument successor() const { return Argument(number() + 1); }
412 
413   // Locating register-based arguments:
is_register() const414   bool is_register() const { return _number < n_register_parameters; }
415 
416   // Locating Floating Point register-based arguments:
is_float_register() const417   bool is_float_register() const { return _number < n_float_register_parameters; }
418 
as_float_register() const419   FloatRegister as_float_register() const {
420     assert(is_float_register(), "must be a register argument");
421     return as_FloatRegister((number() *2) + 1);
422   }
423 
as_double_register() const424   FloatRegister as_double_register() const {
425     assert(is_float_register(), "must be a register argument");
426     return as_FloatRegister((number() *2));
427   }
428 
as_register() const429   Register as_register() const {
430     assert(is_register(), "must be a register argument");
431     return as_Register(number() + Z_ARG1->encoding());
432   }
433 
434   // debugging
435   const char* name() const;
436 
437   friend class Assembler;
438 };
439 
440 
441 // The z/Architecture Assembler: Pure assembler doing NO optimizations
442 // on the instruction level; i.e., what you write is what you get. The
443 // Assembler is generating code into a CodeBuffer.
444 class Assembler : public AbstractAssembler {
445  protected:
446 
447   friend class AbstractAssembler;
448   friend class AddressLiteral;
449 
450   // Code patchers need various routines like inv_wdisp().
451   friend class NativeInstruction;
452 #ifndef COMPILER2
453   friend class NativeGeneralJump;
454 #endif
455   friend class Relocation;
456 
457  public:
458 
459 // Addressing
460 
461 // address calculation
462 #define LA_ZOPC     (unsigned  int)(0x41  << 24)
463 #define LAY_ZOPC    (unsigned long)(0xe3L << 40 | 0x71L)
464 #define LARL_ZOPC   (unsigned long)(0xc0L << 40 | 0x00L << 32)
465 
466 
467 // Data Transfer
468 
469 // register to register transfer
470 #define LR_ZOPC     (unsigned  int)(24 << 8)
471 #define LBR_ZOPC    (unsigned  int)(0xb926 << 16)
472 #define LHR_ZOPC    (unsigned  int)(0xb927 << 16)
473 #define LGBR_ZOPC   (unsigned  int)(0xb906 << 16)
474 #define LGHR_ZOPC   (unsigned  int)(0xb907 << 16)
475 #define LGFR_ZOPC   (unsigned  int)(0xb914 << 16)
476 #define LGR_ZOPC    (unsigned  int)(0xb904 << 16)
477 
478 #define LLHR_ZOPC   (unsigned  int)(0xb995 << 16)
479 #define LLGCR_ZOPC  (unsigned  int)(0xb984 << 16)
480 #define LLGHR_ZOPC  (unsigned  int)(0xb985 << 16)
481 #define LLGTR_ZOPC  (unsigned  int)(185 << 24 | 23 << 16)
482 #define LLGFR_ZOPC  (unsigned  int)(185 << 24 | 22 << 16)
483 
484 #define LTR_ZOPC    (unsigned  int)(18 << 8)
485 #define LTGFR_ZOPC  (unsigned  int)(185 << 24 | 18 << 16)
486 #define LTGR_ZOPC   (unsigned  int)(185 << 24 | 2 << 16)
487 
488 #define LER_ZOPC    (unsigned  int)(56 << 8)
489 #define LEDBR_ZOPC  (unsigned  int)(179 << 24 | 68 << 16)
490 #define LEXBR_ZOPC  (unsigned  int)(179 << 24 | 70 << 16)
491 #define LDEBR_ZOPC  (unsigned  int)(179 << 24 | 4 << 16)
492 #define LDR_ZOPC    (unsigned  int)(40 << 8)
493 #define LDXBR_ZOPC  (unsigned  int)(179 << 24 | 69 << 16)
494 #define LXEBR_ZOPC  (unsigned  int)(179 << 24 | 6 << 16)
495 #define LXDBR_ZOPC  (unsigned  int)(179 << 24 | 5 << 16)
496 #define LXR_ZOPC    (unsigned  int)(179 << 24 | 101 << 16)
497 #define LTEBR_ZOPC  (unsigned  int)(179 << 24 | 2 << 16)
498 #define LTDBR_ZOPC  (unsigned  int)(179 << 24 | 18 << 16)
499 #define LTXBR_ZOPC  (unsigned  int)(179 << 24 | 66 << 16)
500 
501 #define LRVR_ZOPC   (unsigned  int)(0xb91f << 16)
502 #define LRVGR_ZOPC  (unsigned  int)(0xb90f << 16)
503 
504 #define LDGR_ZOPC   (unsigned  int)(0xb3c1 << 16)                // z10
505 #define LGDR_ZOPC   (unsigned  int)(0xb3cd << 16)                // z10
506 
507 #define LOCR_ZOPC   (unsigned  int)(0xb9f2 << 16)                // z196
508 #define LOCGR_ZOPC  (unsigned  int)(0xb9e2 << 16)                // z196
509 
510 // immediate to register transfer
511 #define IIHH_ZOPC   (unsigned  int)(165 << 24)
512 #define IIHL_ZOPC   (unsigned  int)(165 << 24 | 1 << 16)
513 #define IILH_ZOPC   (unsigned  int)(165 << 24 | 2 << 16)
514 #define IILL_ZOPC   (unsigned  int)(165 << 24 | 3 << 16)
515 #define IIHF_ZOPC   (unsigned long)(0xc0L << 40 | 8L << 32)
516 #define IILF_ZOPC   (unsigned long)(0xc0L << 40 | 9L << 32)
517 #define LLIHH_ZOPC  (unsigned  int)(165 << 24 | 12 << 16)
518 #define LLIHL_ZOPC  (unsigned  int)(165 << 24 | 13 << 16)
519 #define LLILH_ZOPC  (unsigned  int)(165 << 24 | 14 << 16)
520 #define LLILL_ZOPC  (unsigned  int)(165 << 24 | 15 << 16)
521 #define LLIHF_ZOPC  (unsigned long)(0xc0L << 40 | 14L << 32)
522 #define LLILF_ZOPC  (unsigned long)(0xc0L << 40 | 15L << 32)
523 #define LHI_ZOPC    (unsigned  int)(167 << 24 | 8 << 16)
524 #define LGHI_ZOPC   (unsigned  int)(167 << 24 | 9 << 16)
525 #define LGFI_ZOPC   (unsigned long)(0xc0L << 40 | 1L << 32)
526 
527 #define LZER_ZOPC   (unsigned  int)(0xb374 << 16)
528 #define LZDR_ZOPC   (unsigned  int)(0xb375 << 16)
529 
530 // LOAD: memory to register transfer
531 #define LB_ZOPC     (unsigned long)(227L << 40 | 118L)
532 #define LH_ZOPC     (unsigned  int)(72 << 24)
533 #define LHY_ZOPC    (unsigned long)(227L << 40 | 120L)
534 #define L_ZOPC      (unsigned  int)(88 << 24)
535 #define LY_ZOPC     (unsigned long)(227L << 40 | 88L)
536 #define LT_ZOPC     (unsigned long)(0xe3L << 40 | 0x12L)
537 #define LGB_ZOPC    (unsigned long)(227L << 40 | 119L)
538 #define LGH_ZOPC    (unsigned long)(227L << 40 | 21L)
539 #define LGF_ZOPC    (unsigned long)(227L << 40 | 20L)
540 #define LG_ZOPC     (unsigned long)(227L << 40 | 4L)
541 #define LTG_ZOPC    (unsigned long)(0xe3L << 40 | 0x02L)
542 #define LTGF_ZOPC   (unsigned long)(0xe3L << 40 | 0x32L)
543 
544 #define LLC_ZOPC    (unsigned long)(0xe3L << 40 | 0x94L)
545 #define LLH_ZOPC    (unsigned long)(0xe3L << 40 | 0x95L)
546 #define LLGT_ZOPC   (unsigned long)(227L << 40 | 23L)
547 #define LLGC_ZOPC   (unsigned long)(227L << 40 | 144L)
548 #define LLGH_ZOPC   (unsigned long)(227L << 40 | 145L)
549 #define LLGF_ZOPC   (unsigned long)(227L << 40 | 22L)
550 
551 #define IC_ZOPC     (unsigned  int)(0x43  << 24)
552 #define ICY_ZOPC    (unsigned long)(0xe3L << 40 | 0x73L)
553 #define ICM_ZOPC    (unsigned  int)(0xbf  << 24)
554 #define ICMY_ZOPC   (unsigned long)(0xebL << 40 | 0x81L)
555 #define ICMH_ZOPC   (unsigned long)(0xebL << 40 | 0x80L)
556 
557 #define LRVH_ZOPC   (unsigned long)(0xe3L << 40 | 0x1fL)
558 #define LRV_ZOPC    (unsigned long)(0xe3L << 40 | 0x1eL)
559 #define LRVG_ZOPC   (unsigned long)(0xe3L << 40 | 0x0fL)
560 
561 
562 // LOAD relative: memory to register transfer
563 #define LHRL_ZOPC   (unsigned long)(0xc4L << 40 | 0x05L << 32)  // z10
564 #define LRL_ZOPC    (unsigned long)(0xc4L << 40 | 0x0dL << 32)  // z10
565 #define LGHRL_ZOPC  (unsigned long)(0xc4L << 40 | 0x04L << 32)  // z10
566 #define LGFRL_ZOPC  (unsigned long)(0xc4L << 40 | 0x0cL << 32)  // z10
567 #define LGRL_ZOPC   (unsigned long)(0xc4L << 40 | 0x08L << 32)  // z10
568 
569 #define LLHRL_ZOPC  (unsigned long)(0xc4L << 40 | 0x02L << 32)  // z10
570 #define LLGHRL_ZOPC (unsigned long)(0xc4L << 40 | 0x06L << 32)  // z10
571 #define LLGFRL_ZOPC (unsigned long)(0xc4L << 40 | 0x0eL << 32)  // z10
572 
573 #define LOC_ZOPC    (unsigned long)(0xebL << 40 | 0xf2L)        // z196
574 #define LOCG_ZOPC   (unsigned long)(0xebL << 40 | 0xe2L)        // z196
575 
576 
577 // LOAD multiple registers at once
578 #define LM_ZOPC     (unsigned  int)(0x98  << 24)
579 #define LMY_ZOPC    (unsigned long)(0xebL << 40 | 0x98L)
580 #define LMG_ZOPC    (unsigned long)(0xebL << 40 | 0x04L)
581 
582 #define LE_ZOPC     (unsigned  int)(0x78 << 24)
583 #define LEY_ZOPC    (unsigned long)(237L << 40 | 100L)
584 #define LDEB_ZOPC   (unsigned long)(237L << 40 | 4)
585 #define LD_ZOPC     (unsigned  int)(0x68 << 24)
586 #define LDY_ZOPC    (unsigned long)(237L << 40 | 101L)
587 #define LXEB_ZOPC   (unsigned long)(237L << 40 | 6)
588 #define LXDB_ZOPC   (unsigned long)(237L << 40 | 5)
589 
590 // STORE: register to memory transfer
591 #define STC_ZOPC    (unsigned  int)(0x42 << 24)
592 #define STCY_ZOPC   (unsigned long)(227L << 40 | 114L)
593 #define STH_ZOPC    (unsigned  int)(64 << 24)
594 #define STHY_ZOPC   (unsigned long)(227L << 40 | 112L)
595 #define ST_ZOPC     (unsigned  int)(80 << 24)
596 #define STY_ZOPC    (unsigned long)(227L << 40 | 80L)
597 #define STG_ZOPC    (unsigned long)(227L << 40 | 36L)
598 
599 #define STCM_ZOPC   (unsigned long)(0xbeL << 24)
600 #define STCMY_ZOPC  (unsigned long)(0xebL << 40 | 0x2dL)
601 #define STCMH_ZOPC  (unsigned long)(0xebL << 40 | 0x2cL)
602 
603 // STORE relative: memory to register transfer
604 #define STHRL_ZOPC  (unsigned long)(0xc4L << 40 | 0x07L << 32)  // z10
605 #define STRL_ZOPC   (unsigned long)(0xc4L << 40 | 0x0fL << 32)  // z10
606 #define STGRL_ZOPC  (unsigned long)(0xc4L << 40 | 0x0bL << 32)  // z10
607 
608 #define STOC_ZOPC   (unsigned long)(0xebL << 40 | 0xf3L)        // z196
609 #define STOCG_ZOPC  (unsigned long)(0xebL << 40 | 0xe3L)        // z196
610 
611 // STORE multiple registers at once
612 #define STM_ZOPC    (unsigned  int)(0x90  << 24)
613 #define STMY_ZOPC   (unsigned long)(0xebL << 40 | 0x90L)
614 #define STMG_ZOPC   (unsigned long)(0xebL << 40 | 0x24L)
615 
616 #define STE_ZOPC    (unsigned  int)(0x70 << 24)
617 #define STEY_ZOPC   (unsigned long)(237L << 40 | 102L)
618 #define STD_ZOPC    (unsigned  int)(0x60 << 24)
619 #define STDY_ZOPC   (unsigned long)(237L << 40 | 103L)
620 
621 // MOVE: immediate to memory transfer
622 #define MVHHI_ZOPC  (unsigned long)(0xe5L << 40 | 0x44L << 32)   // z10
623 #define MVHI_ZOPC   (unsigned long)(0xe5L << 40 | 0x4cL << 32)   // z10
624 #define MVGHI_ZOPC  (unsigned long)(0xe5L << 40 | 0x48L << 32)   // z10
625 
626 
627 //  ALU operations
628 
629 // Load Positive
630 #define LPR_ZOPC    (unsigned  int)(16 << 8)
631 #define LPGFR_ZOPC  (unsigned  int)(185 << 24 | 16 << 16)
632 #define LPGR_ZOPC   (unsigned  int)(185 << 24)
633 #define LPEBR_ZOPC  (unsigned  int)(179 << 24)
634 #define LPDBR_ZOPC  (unsigned  int)(179 << 24 | 16 << 16)
635 #define LPXBR_ZOPC  (unsigned  int)(179 << 24 | 64 << 16)
636 
637 // Load Negative
638 #define LNR_ZOPC    (unsigned  int)(17 << 8)
639 #define LNGFR_ZOPC  (unsigned  int)(185 << 24 | 17 << 16)
640 #define LNGR_ZOPC   (unsigned  int)(185 << 24 | 1 << 16)
641 #define LNEBR_ZOPC  (unsigned  int)(179 << 24 | 1 << 16)
642 #define LNDBR_ZOPC  (unsigned  int)(179 << 24 | 17 << 16)
643 #define LNXBR_ZOPC  (unsigned  int)(179 << 24 | 65 << 16)
644 
645 // Load Complement
646 #define LCR_ZOPC    (unsigned  int)(19 << 8)
647 #define LCGFR_ZOPC  (unsigned  int)(185 << 24 | 19 << 16)
648 #define LCGR_ZOPC   (unsigned  int)(185 << 24 | 3 << 16)
649 #define LCEBR_ZOPC  (unsigned  int)(179 << 24 | 3 << 16)
650 #define LCDBR_ZOPC  (unsigned  int)(179 << 24 | 19 << 16)
651 #define LCXBR_ZOPC  (unsigned  int)(179 << 24 | 67 << 16)
652 
653 // Add
654 // RR, signed
655 #define AR_ZOPC     (unsigned  int)(26 << 8)
656 #define AGFR_ZOPC   (unsigned  int)(0xb9 << 24 | 0x18 << 16)
657 #define AGR_ZOPC    (unsigned  int)(0xb9 << 24 | 0x08 << 16)
658 // RRF, signed
659 #define ARK_ZOPC    (unsigned  int)(0xb9 << 24 | 0x00f8 << 16)
660 #define AGRK_ZOPC   (unsigned  int)(0xb9 << 24 | 0x00e8 << 16)
661 // RI, signed
662 #define AHI_ZOPC    (unsigned  int)(167 << 24 | 10 << 16)
663 #define AFI_ZOPC    (unsigned long)(0xc2L << 40 | 9L << 32)
664 #define AGHI_ZOPC   (unsigned  int)(167 << 24 | 11 << 16)
665 #define AGFI_ZOPC   (unsigned long)(0xc2L << 40 | 8L << 32)
666 // RIE, signed
667 #define AHIK_ZOPC   (unsigned long)(0xecL << 40 | 0x00d8L)
668 #define AGHIK_ZOPC  (unsigned long)(0xecL << 40 | 0x00d9L)
669 #define AIH_ZOPC    (unsigned long)(0xccL << 40 | 0x08L << 32)
670 // RM, signed
671 #define AHY_ZOPC    (unsigned long)(227L << 40 | 122L)
672 #define A_ZOPC      (unsigned  int)(90 << 24)
673 #define AY_ZOPC     (unsigned long)(227L << 40 | 90L)
674 #define AGF_ZOPC    (unsigned long)(227L << 40 | 24L)
675 #define AG_ZOPC     (unsigned long)(227L << 40 | 8L)
676 // In-memory arithmetic (add signed, add logical with signed immediate).
677 // MI, signed
678 #define ASI_ZOPC    (unsigned long)(0xebL << 40 | 0x6aL)
679 #define AGSI_ZOPC   (unsigned long)(0xebL << 40 | 0x7aL)
680 
681 // RR, Logical
682 #define ALR_ZOPC    (unsigned  int)(30 << 8)
683 #define ALGFR_ZOPC  (unsigned  int)(185 << 24 | 26 << 16)
684 #define ALGR_ZOPC   (unsigned  int)(185 << 24 | 10 << 16)
685 #define ALCGR_ZOPC  (unsigned  int)(185 << 24 | 136 << 16)
686 // RRF, Logical
687 #define ALRK_ZOPC   (unsigned  int)(0xb9 << 24 | 0x00fa << 16)
688 #define ALGRK_ZOPC  (unsigned  int)(0xb9 << 24 | 0x00ea << 16)
689 // RI, Logical
690 #define ALFI_ZOPC   (unsigned long)(0xc2L << 40 | 0x0bL << 32)
691 #define ALGFI_ZOPC  (unsigned long)(0xc2L << 40 | 0x0aL << 32)
692 // RIE, Logical
693 #define ALHSIK_ZOPC (unsigned long)(0xecL << 40 | 0x00daL)
694 #define ALGHSIK_ZOPC (unsigned long)(0xecL << 40 | 0x00dbL)
695 // RM, Logical
696 #define AL_ZOPC     (unsigned  int)(0x5e << 24)
697 #define ALY_ZOPC    (unsigned long)(227L << 40 | 94L)
698 #define ALGF_ZOPC   (unsigned long)(227L << 40 | 26L)
699 #define ALG_ZOPC    (unsigned long)(227L << 40 | 10L)
700 // In-memory arithmetic (add signed, add logical with signed immediate).
701 // MI, Logical
702 #define ALSI_ZOPC   (unsigned long)(0xebL << 40 | 0x6eL)
703 #define ALGSI_ZOPC  (unsigned long)(0xebL << 40 | 0x7eL)
704 
705 // RR, BFP
706 #define AEBR_ZOPC   (unsigned  int)(179 << 24 | 10 << 16)
707 #define ADBR_ZOPC   (unsigned  int)(179 << 24 | 26 << 16)
708 #define AXBR_ZOPC   (unsigned  int)(179 << 24 | 74 << 16)
709 // RM, BFP
710 #define AEB_ZOPC    (unsigned long)(237L << 40 | 10)
711 #define ADB_ZOPC    (unsigned long)(237L << 40 | 26)
712 
713 // Subtract
714 // RR, signed
715 #define SR_ZOPC     (unsigned  int)(27 << 8)
716 #define SGFR_ZOPC   (unsigned  int)(185 << 24 | 25 << 16)
717 #define SGR_ZOPC    (unsigned  int)(185 << 24 | 9 << 16)
718 // RRF, signed
719 #define SRK_ZOPC    (unsigned  int)(0xb9 << 24 | 0x00f9 << 16)
720 #define SGRK_ZOPC   (unsigned  int)(0xb9 << 24 | 0x00e9 << 16)
721 //   RM, signed
722 #define SH_ZOPC     (unsigned  int)(0x4b << 24)
723 #define SHY_ZOPC    (unsigned long)(227L << 40 | 123L)
724 #define S_ZOPC      (unsigned  int)(0x5B << 24)
725 #define SY_ZOPC     (unsigned long)(227L << 40 | 91L)
726 #define SGF_ZOPC    (unsigned long)(227L << 40 | 25)
727 #define SG_ZOPC     (unsigned long)(227L << 40 | 9)
728 // RR, Logical
729 #define SLR_ZOPC    (unsigned  int)(31 << 8)
730 #define SLGFR_ZOPC  (unsigned  int)(185 << 24 | 27 << 16)
731 #define SLGR_ZOPC   (unsigned  int)(185 << 24 | 11 << 16)
732 // RIL, Logical
733 #define SLFI_ZOPC   (unsigned long)(0xc2L << 40 | 0x05L << 32)
734 #define SLGFI_ZOPC  (unsigned long)(0xc2L << 40 | 0x04L << 32)
735 // RRF, Logical
736 #define SLRK_ZOPC   (unsigned  int)(0xb9 << 24 | 0x00fb << 16)
737 #define SLGRK_ZOPC  (unsigned  int)(0xb9 << 24 | 0x00eb << 16)
738 // RM, Logical
739 #define SLY_ZOPC    (unsigned long)(227L << 40 | 95L)
740 #define SLGF_ZOPC   (unsigned long)(227L << 40 | 27L)
741 #define SLG_ZOPC    (unsigned long)(227L << 40 | 11L)
742 
743 // RR, BFP
744 #define SEBR_ZOPC   (unsigned  int)(179 << 24 | 11 << 16)
745 #define SDBR_ZOPC   (unsigned  int)(179 << 24 | 27 << 16)
746 #define SXBR_ZOPC   (unsigned  int)(179 << 24 | 75 << 16)
747 // RM, BFP
748 #define SEB_ZOPC    (unsigned long)(237L << 40 | 11)
749 #define SDB_ZOPC    (unsigned long)(237L << 40 | 27)
750 
751 // Multiply
752 // RR, signed
753 #define MR_ZOPC     (unsigned  int)(28 << 8)
754 #define MSR_ZOPC    (unsigned  int)(178 << 24 | 82 << 16)
755 #define MSGFR_ZOPC  (unsigned  int)(185 << 24 | 28 << 16)
756 #define MSGR_ZOPC   (unsigned  int)(185 << 24 | 12 << 16)
757 // RI, signed
758 #define MHI_ZOPC    (unsigned  int)(167 << 24 | 12 << 16)
759 #define MGHI_ZOPC   (unsigned  int)(167 << 24 | 13 << 16)
760 #define MSFI_ZOPC   (unsigned long)(0xc2L << 40 | 0x01L << 32)   // z10
761 #define MSGFI_ZOPC  (unsigned long)(0xc2L << 40 | 0x00L << 32)   // z10
762 // RM, signed
763 #define M_ZOPC      (unsigned  int)(92 << 24)
764 #define MS_ZOPC     (unsigned  int)(0x71 << 24)
765 #define MHY_ZOPC    (unsigned long)(0xe3L<< 40 | 0x7cL)
766 #define MSY_ZOPC    (unsigned long)(227L << 40 | 81L)
767 #define MSGF_ZOPC   (unsigned long)(227L << 40 | 28L)
768 #define MSG_ZOPC    (unsigned long)(227L << 40 | 12L)
769 // RR, unsigned
770 #define MLR_ZOPC    (unsigned  int)(185 << 24 | 150 << 16)
771 #define MLGR_ZOPC   (unsigned  int)(185 << 24 | 134 << 16)
772 // RM, unsigned
773 #define ML_ZOPC     (unsigned long)(227L << 40 | 150L)
774 #define MLG_ZOPC    (unsigned long)(227L << 40 | 134L)
775 
776 // RR, BFP
777 #define MEEBR_ZOPC  (unsigned  int)(179 << 24 | 23 << 16)
778 #define MDEBR_ZOPC  (unsigned  int)(179 << 24 | 12 << 16)
779 #define MDBR_ZOPC   (unsigned  int)(179 << 24 | 28 << 16)
780 #define MXDBR_ZOPC  (unsigned  int)(179 << 24 | 7 << 16)
781 #define MXBR_ZOPC   (unsigned  int)(179 << 24 | 76 << 16)
782 // RM, BFP
783 #define MEEB_ZOPC   (unsigned long)(237L << 40 | 23)
784 #define MDEB_ZOPC   (unsigned long)(237L << 40 | 12)
785 #define MDB_ZOPC    (unsigned long)(237L << 40 | 28)
786 #define MXDB_ZOPC   (unsigned long)(237L << 40 | 7)
787 
788 // Multiply-Add
789 #define MAEBR_ZOPC  (unsigned  int)(179 << 24 | 14 << 16)
790 #define MADBR_ZOPC  (unsigned  int)(179 << 24 | 30 << 16)
791 #define MSEBR_ZOPC  (unsigned  int)(179 << 24 | 15 << 16)
792 #define MSDBR_ZOPC  (unsigned  int)(179 << 24 | 31 << 16)
793 #define MAEB_ZOPC   (unsigned long)(237L << 40 | 14)
794 #define MADB_ZOPC   (unsigned long)(237L << 40 | 30)
795 #define MSEB_ZOPC   (unsigned long)(237L << 40 | 15)
796 #define MSDB_ZOPC   (unsigned long)(237L << 40 | 31)
797 
798 // Divide
799 // RR, signed
800 #define DSGFR_ZOPC  (unsigned  int)(0xb91d << 16)
801 #define DSGR_ZOPC   (unsigned  int)(0xb90d << 16)
802 // RM, signed
803 #define D_ZOPC      (unsigned  int)(93 << 24)
804 #define DSGF_ZOPC   (unsigned long)(227L << 40 | 29L)
805 #define DSG_ZOPC    (unsigned long)(227L << 40 | 13L)
806 // RR, unsigned
807 #define DLR_ZOPC    (unsigned  int)(185 << 24 | 151 << 16)
808 #define DLGR_ZOPC   (unsigned  int)(185 << 24 | 135 << 16)
809 // RM, unsigned
810 #define DL_ZOPC     (unsigned long)(227L << 40 | 151L)
811 #define DLG_ZOPC    (unsigned long)(227L << 40 | 135L)
812 
813 // RR, BFP
814 #define DEBR_ZOPC   (unsigned  int)(179 << 24 | 13 << 16)
815 #define DDBR_ZOPC   (unsigned  int)(179 << 24 | 29 << 16)
816 #define DXBR_ZOPC   (unsigned  int)(179 << 24 | 77 << 16)
817 // RM, BFP
818 #define DEB_ZOPC    (unsigned long)(237L << 40 | 13)
819 #define DDB_ZOPC    (unsigned long)(237L << 40 | 29)
820 
821 // Square Root
822 // RR, BFP
823 #define SQEBR_ZOPC  (unsigned  int)(0xb314 << 16)
824 #define SQDBR_ZOPC  (unsigned  int)(0xb315 << 16)
825 #define SQXBR_ZOPC  (unsigned  int)(0xb316 << 16)
826 // RM, BFP
827 #define SQEB_ZOPC   (unsigned long)(237L << 40 | 20)
828 #define SQDB_ZOPC   (unsigned long)(237L << 40 | 21)
829 
830 // Compare and Test
831 // RR, signed
832 #define CR_ZOPC     (unsigned  int)(25 << 8)
833 #define CGFR_ZOPC   (unsigned  int)(185 << 24 | 48 << 16)
834 #define CGR_ZOPC    (unsigned  int)(185 << 24 | 32 << 16)
835 // RI, signed
836 #define CHI_ZOPC    (unsigned  int)(167 << 24 | 14 << 16)
837 #define CFI_ZOPC    (unsigned long)(0xc2L << 40 | 0xdL << 32)
838 #define CGHI_ZOPC   (unsigned  int)(167 << 24 | 15 << 16)
839 #define CGFI_ZOPC   (unsigned long)(0xc2L << 40 | 0xcL << 32)
840 // RM, signed
841 #define CH_ZOPC     (unsigned  int)(0x49 << 24)
842 #define CHY_ZOPC    (unsigned long)(227L << 40 | 121L)
843 #define C_ZOPC      (unsigned  int)(0x59 << 24)
844 #define CY_ZOPC     (unsigned long)(227L << 40 | 89L)
845 #define CGF_ZOPC    (unsigned long)(227L << 40 | 48L)
846 #define CG_ZOPC     (unsigned long)(227L << 40 | 32L)
847 // RR, unsigned
848 #define CLR_ZOPC    (unsigned  int)(21 << 8)
849 #define CLGFR_ZOPC  (unsigned  int)(185 << 24 | 49 << 16)
850 #define CLGR_ZOPC   (unsigned  int)(185 << 24 | 33 << 16)
851 // RIL, unsigned
852 #define CLFI_ZOPC   (unsigned long)(0xc2L << 40 | 0xfL << 32)
853 #define CLGFI_ZOPC  (unsigned long)(0xc2L << 40 | 0xeL << 32)
854 // RM, unsigned
855 #define CL_ZOPC     (unsigned  int)(0x55 << 24)
856 #define CLY_ZOPC    (unsigned long)(227L << 40 | 85L)
857 #define CLGF_ZOPC   (unsigned long)(227L << 40 | 49L)
858 #define CLG_ZOPC    (unsigned long)(227L << 40 | 33L)
859 // RI, unsigned
860 #define TMHH_ZOPC   (unsigned  int)(167 << 24 | 2 << 16)
861 #define TMHL_ZOPC   (unsigned  int)(167 << 24 | 3 << 16)
862 #define TMLH_ZOPC   (unsigned  int)(167 << 24)
863 #define TMLL_ZOPC   (unsigned  int)(167 << 24 | 1 << 16)
864 
865 // RR, BFP
866 #define CEBR_ZOPC   (unsigned  int)(179 << 24 | 9 << 16)
867 #define CDBR_ZOPC   (unsigned  int)(179 << 24 | 25 << 16)
868 #define CXBR_ZOPC   (unsigned  int)(179 << 24 | 73 << 16)
869 // RM, BFP
870 #define CEB_ZOPC    (unsigned long)(237L << 40 | 9)
871 #define CDB_ZOPC    (unsigned long)(237L << 40 | 25)
872 
873 // Shift
874 // arithmetic
875 #define SLA_ZOPC    (unsigned  int)(0x8b  << 24)
876 #define SLAK_ZOPC   (unsigned long)(0xebL << 40 | 0xddL)
877 #define SLAG_ZOPC   (unsigned long)(0xebL << 40 | 0x0bL)
878 #define SRA_ZOPC    (unsigned  int)(0x8a  << 24)
879 #define SRAK_ZOPC   (unsigned long)(0xebL << 40 | 0xdcL)
880 #define SRAG_ZOPC   (unsigned long)(0xebL << 40 | 0x0aL)
881 // logical
882 #define SLL_ZOPC    (unsigned  int)(0x89  << 24)
883 #define SLLK_ZOPC   (unsigned long)(0xebL << 40 | 0xdfL)
884 #define SLLG_ZOPC   (unsigned long)(0xebL << 40 | 0x0dL)
885 #define SRL_ZOPC    (unsigned  int)(0x88  << 24)
886 #define SRLK_ZOPC   (unsigned long)(0xebL << 40 | 0xdeL)
887 #define SRLG_ZOPC   (unsigned long)(0xebL << 40 | 0x0cL)
888 
889 // Rotate, then AND/XOR/OR/insert
890 // rotate
891 #define RLL_ZOPC    (unsigned long)(0xebL << 40 | 0x1dL)         // z10
892 #define RLLG_ZOPC   (unsigned long)(0xebL << 40 | 0x1cL)         // z10
893 // rotate and {AND|XOR|OR|INS}
894 #define RNSBG_ZOPC  (unsigned long)(0xecL << 40 | 0x54L)         // z196
895 #define RXSBG_ZOPC  (unsigned long)(0xecL << 40 | 0x57L)         // z196
896 #define ROSBG_ZOPC  (unsigned long)(0xecL << 40 | 0x56L)         // z196
897 #define RISBG_ZOPC  (unsigned long)(0xecL << 40 | 0x55L)         // z196
898 
899 // AND
900 // RR, signed
901 #define NR_ZOPC     (unsigned  int)(20 << 8)
902 #define NGR_ZOPC    (unsigned  int)(185 << 24 | 128 << 16)
903 // RRF, signed
904 #define NRK_ZOPC    (unsigned  int)(0xb9 << 24 | 0x00f4 << 16)
905 #define NGRK_ZOPC   (unsigned  int)(0xb9 << 24 | 0x00e4 << 16)
906 // RI, signed
907 #define NIHH_ZOPC   (unsigned  int)(165 << 24 | 4 << 16)
908 #define NIHL_ZOPC   (unsigned  int)(165 << 24 | 5 << 16)
909 #define NILH_ZOPC   (unsigned  int)(165 << 24 | 6 << 16)
910 #define NILL_ZOPC   (unsigned  int)(165 << 24 | 7 << 16)
911 #define NIHF_ZOPC   (unsigned long)(0xc0L << 40 | 10L << 32)
912 #define NILF_ZOPC   (unsigned long)(0xc0L << 40 | 11L << 32)
913 // RM, signed
914 #define N_ZOPC      (unsigned  int)(0x54 << 24)
915 #define NY_ZOPC     (unsigned long)(227L << 40 | 84L)
916 #define NG_ZOPC     (unsigned long)(227L << 40 | 128L)
917 
918 // OR
919 // RR, signed
920 #define OR_ZOPC     (unsigned  int)(22 << 8)
921 #define OGR_ZOPC    (unsigned  int)(185 << 24 | 129 << 16)
922 // RRF, signed
923 #define ORK_ZOPC    (unsigned  int)(0xb9 << 24 | 0x00f6 << 16)
924 #define OGRK_ZOPC   (unsigned  int)(0xb9 << 24 | 0x00e6 << 16)
925 // RI, signed
926 #define OIHH_ZOPC   (unsigned  int)(165 << 24 | 8 << 16)
927 #define OIHL_ZOPC   (unsigned  int)(165 << 24 | 9 << 16)
928 #define OILH_ZOPC   (unsigned  int)(165 << 24 | 10 << 16)
929 #define OILL_ZOPC   (unsigned  int)(165 << 24 | 11 << 16)
930 #define OIHF_ZOPC   (unsigned long)(0xc0L << 40 | 12L << 32)
931 #define OILF_ZOPC   (unsigned long)(0xc0L << 40 | 13L << 32)
932 // RM, signed
933 #define O_ZOPC      (unsigned  int)(0x56 << 24)
934 #define OY_ZOPC     (unsigned long)(227L << 40 | 86L)
935 #define OG_ZOPC     (unsigned long)(227L << 40 | 129L)
936 
937 // XOR
938 // RR, signed
939 #define XR_ZOPC     (unsigned  int)(23 << 8)
940 #define XGR_ZOPC    (unsigned  int)(185 << 24 | 130 << 16)
941 // RRF, signed
942 #define XRK_ZOPC    (unsigned  int)(0xb9 << 24 | 0x00f7 << 16)
943 #define XGRK_ZOPC   (unsigned  int)(0xb9 << 24 | 0x00e7 << 16)
944 // RI, signed
945 #define XIHF_ZOPC   (unsigned long)(0xc0L << 40 | 6L << 32)
946 #define XILF_ZOPC   (unsigned long)(0xc0L << 40 | 7L << 32)
947 // RM, signed
948 #define X_ZOPC      (unsigned  int)(0x57 << 24)
949 #define XY_ZOPC     (unsigned long)(227L << 40 | 87L)
950 #define XG_ZOPC     (unsigned long)(227L << 40 | 130L)
951 
952 
953 // Data Conversion
954 
955 // INT to BFP
956 #define CEFBR_ZOPC  (unsigned  int)(179 << 24 | 148 << 16)
957 #define CDFBR_ZOPC  (unsigned  int)(179 << 24 | 149 << 16)
958 #define CXFBR_ZOPC  (unsigned  int)(179 << 24 | 150 << 16)
959 #define CEGBR_ZOPC  (unsigned  int)(179 << 24 | 164 << 16)
960 #define CDGBR_ZOPC  (unsigned  int)(179 << 24 | 165 << 16)
961 #define CXGBR_ZOPC  (unsigned  int)(179 << 24 | 166 << 16)
962 // BFP to INT
963 #define CFEBR_ZOPC  (unsigned  int)(179 << 24 | 152 << 16)
964 #define CFDBR_ZOPC  (unsigned  int)(179 << 24 | 153 << 16)
965 #define CFXBR_ZOPC  (unsigned  int)(179 << 24 | 154 << 16)
966 #define CGEBR_ZOPC  (unsigned  int)(179 << 24 | 168 << 16)
967 #define CGDBR_ZOPC  (unsigned  int)(179 << 24 | 169 << 16)
968 #define CGXBR_ZOPC  (unsigned  int)(179 << 24 | 170 << 16)
969 // INT to DEC
970 #define CVD_ZOPC    (unsigned  int)(0x4e << 24)
971 #define CVDY_ZOPC   (unsigned long)(0xe3L << 40 | 0x26L)
972 #define CVDG_ZOPC   (unsigned long)(0xe3L << 40 | 0x2eL)
973 
974 
975 // BFP Control
976 
977 #define SRNM_ZOPC   (unsigned  int)(178 << 24 | 153 << 16)
978 #define EFPC_ZOPC   (unsigned  int)(179 << 24 | 140 << 16)
979 #define SFPC_ZOPC   (unsigned  int)(179 << 24 | 132 << 16)
980 #define STFPC_ZOPC  (unsigned  int)(178 << 24 | 156 << 16)
981 #define LFPC_ZOPC   (unsigned  int)(178 << 24 | 157 << 16)
982 
983 
984 // Branch Instructions
985 
986 // Register
987 #define BCR_ZOPC    (unsigned  int)(7 << 8)
988 #define BALR_ZOPC   (unsigned  int)(5 << 8)
989 #define BASR_ZOPC   (unsigned  int)(13 << 8)
990 #define BCTGR_ZOPC  (unsigned long)(0xb946 << 16)
991 // Absolute
992 #define BC_ZOPC     (unsigned  int)(71 << 24)
993 #define BAL_ZOPC    (unsigned  int)(69 << 24)
994 #define BAS_ZOPC    (unsigned  int)(77 << 24)
995 #define BXH_ZOPC    (unsigned  int)(134 << 24)
996 #define BXHG_ZOPC   (unsigned long)(235L << 40 | 68)
997 // Relative
998 #define BRC_ZOPC    (unsigned  int)(167 << 24 | 4 << 16)
999 #define BRCL_ZOPC   (unsigned long)(192L << 40 | 4L << 32)
1000 #define BRAS_ZOPC   (unsigned  int)(167 << 24 | 5 << 16)
1001 #define BRASL_ZOPC  (unsigned long)(192L << 40 | 5L << 32)
1002 #define BRCT_ZOPC   (unsigned  int)(167 << 24 | 6 << 16)
1003 #define BRCTG_ZOPC  (unsigned  int)(167 << 24 | 7 << 16)
1004 #define BRXH_ZOPC   (unsigned  int)(132 << 24)
1005 #define BRXHG_ZOPC  (unsigned long)(236L << 40 | 68)
1006 #define BRXLE_ZOPC  (unsigned  int)(133 << 24)
1007 #define BRXLG_ZOPC  (unsigned long)(236L << 40 | 69)
1008 
1009 
1010 // Compare and Branch Instructions
1011 
1012 // signed comp reg/reg, branch Absolute
1013 #define CRB_ZOPC    (unsigned long)(0xecL << 40 | 0xf6L)         // z10
1014 #define CGRB_ZOPC   (unsigned long)(0xecL << 40 | 0xe4L)         // z10
1015 // signed comp reg/reg, branch Relative
1016 #define CRJ_ZOPC    (unsigned long)(0xecL << 40 | 0x76L)         // z10
1017 #define CGRJ_ZOPC   (unsigned long)(0xecL << 40 | 0x64L)         // z10
1018 // signed comp reg/imm, branch absolute
1019 #define CIB_ZOPC    (unsigned long)(0xecL << 40 | 0xfeL)         // z10
1020 #define CGIB_ZOPC   (unsigned long)(0xecL << 40 | 0xfcL)         // z10
1021 // signed comp reg/imm, branch relative
1022 #define CIJ_ZOPC    (unsigned long)(0xecL << 40 | 0x7eL)         // z10
1023 #define CGIJ_ZOPC   (unsigned long)(0xecL << 40 | 0x7cL)         // z10
1024 
1025 // unsigned comp reg/reg, branch Absolute
1026 #define CLRB_ZOPC   (unsigned long)(0xecL << 40 | 0xf7L)         // z10
1027 #define CLGRB_ZOPC  (unsigned long)(0xecL << 40 | 0xe5L)         // z10
1028 // unsigned comp reg/reg, branch Relative
1029 #define CLRJ_ZOPC   (unsigned long)(0xecL << 40 | 0x77L)         // z10
1030 #define CLGRJ_ZOPC  (unsigned long)(0xecL << 40 | 0x65L)         // z10
1031 // unsigned comp reg/imm, branch absolute
1032 #define CLIB_ZOPC   (unsigned long)(0xecL << 40 | 0xffL)         // z10
1033 #define CLGIB_ZOPC  (unsigned long)(0xecL << 40 | 0xfdL)         // z10
1034 // unsigned comp reg/imm, branch relative
1035 #define CLIJ_ZOPC   (unsigned long)(0xecL << 40 | 0x7fL)         // z10
1036 #define CLGIJ_ZOPC  (unsigned long)(0xecL << 40 | 0x7dL)         // z10
1037 
1038 // comp reg/reg, trap
1039 #define CRT_ZOPC    (unsigned  int)(0xb972 << 16)                // z10
1040 #define CGRT_ZOPC   (unsigned  int)(0xb960 << 16)                // z10
1041 #define CLRT_ZOPC   (unsigned  int)(0xb973 << 16)                // z10
1042 #define CLGRT_ZOPC  (unsigned  int)(0xb961 << 16)                // z10
1043 // comp reg/imm, trap
1044 #define CIT_ZOPC    (unsigned long)(0xecL << 40 | 0x72L)         // z10
1045 #define CGIT_ZOPC   (unsigned long)(0xecL << 40 | 0x70L)         // z10
1046 #define CLFIT_ZOPC  (unsigned long)(0xecL << 40 | 0x73L)         // z10
1047 #define CLGIT_ZOPC  (unsigned long)(0xecL << 40 | 0x71L)         // z10
1048 
1049 
1050 // Direct Memory Operations
1051 
1052 // Compare
1053 #define CLI_ZOPC    (unsigned  int)(0x95  << 24)
1054 #define CLIY_ZOPC   (unsigned long)(0xebL << 40 | 0x55L)
1055 #define CLC_ZOPC    (unsigned long)(0xd5L << 40)
1056 #define CLCL_ZOPC   (unsigned  int)(0x0f  <<  8)
1057 #define CLCLE_ZOPC  (unsigned  int)(0xa9  << 24)
1058 #define CLCLU_ZOPC  (unsigned long)(0xebL << 40 | 0x8fL)
1059 
1060 // Move
1061 #define MVI_ZOPC    (unsigned  int)(0x92  << 24)
1062 #define MVIY_ZOPC   (unsigned long)(0xebL << 40 | 0x52L)
1063 #define MVC_ZOPC    (unsigned long)(0xd2L << 40)
1064 #define MVCL_ZOPC   (unsigned  int)(0x0e  <<  8)
1065 #define MVCLE_ZOPC  (unsigned  int)(0xa8  << 24)
1066 
1067 // Test
1068 #define TM_ZOPC     (unsigned  int)(0x91  << 24)
1069 #define TMY_ZOPC    (unsigned long)(0xebL << 40 | 0x51L)
1070 
1071 // AND
1072 #define NI_ZOPC     (unsigned  int)(0x94  << 24)
1073 #define NIY_ZOPC    (unsigned long)(0xebL << 40 | 0x54L)
1074 #define NC_ZOPC     (unsigned long)(0xd4L << 40)
1075 
1076 // OR
1077 #define OI_ZOPC     (unsigned  int)(0x96  << 24)
1078 #define OIY_ZOPC    (unsigned long)(0xebL << 40 | 0x56L)
1079 #define OC_ZOPC     (unsigned long)(0xd6L << 40)
1080 
1081 // XOR
1082 #define XI_ZOPC     (unsigned  int)(0x97  << 24)
1083 #define XIY_ZOPC    (unsigned long)(0xebL << 40 | 0x57L)
1084 #define XC_ZOPC     (unsigned long)(0xd7L << 40)
1085 
1086 // Search String
1087 #define SRST_ZOPC   (unsigned  int)(178 << 24 | 94 << 16)
1088 #define SRSTU_ZOPC  (unsigned  int)(185 << 24 | 190 << 16)
1089 
1090 // Translate characters
1091 #define TROO_ZOPC   (unsigned  int)(0xb9 << 24 | 0x93 << 16)
1092 #define TROT_ZOPC   (unsigned  int)(0xb9 << 24 | 0x92 << 16)
1093 #define TRTO_ZOPC   (unsigned  int)(0xb9 << 24 | 0x91 << 16)
1094 #define TRTT_ZOPC   (unsigned  int)(0xb9 << 24 | 0x90 << 16)
1095 
1096 
1097 //---------------------------
1098 //--  Vector Instructions  --
1099 //---------------------------
1100 
1101 //---<  Vector Support Instructions  >---
1102 
1103 //---  Load (memory)  ---
1104 
1105 #define VLM_ZOPC    (unsigned long)(0xe7L << 40 | 0x36L << 0)   // load full vreg range (n * 128 bit)
1106 #define VL_ZOPC     (unsigned long)(0xe7L << 40 | 0x06L << 0)   // load full vreg (128 bit)
1107 #define VLEB_ZOPC   (unsigned long)(0xe7L << 40 | 0x00L << 0)   // load vreg element (8 bit)
1108 #define VLEH_ZOPC   (unsigned long)(0xe7L << 40 | 0x01L << 0)   // load vreg element (16 bit)
1109 #define VLEF_ZOPC   (unsigned long)(0xe7L << 40 | 0x03L << 0)   // load vreg element (32 bit)
1110 #define VLEG_ZOPC   (unsigned long)(0xe7L << 40 | 0x02L << 0)   // load vreg element (64 bit)
1111 
1112 #define VLREP_ZOPC  (unsigned long)(0xe7L << 40 | 0x05L << 0)   // load and replicate into all vector elements
1113 #define VLLEZ_ZOPC  (unsigned long)(0xe7L << 40 | 0x04L << 0)   // load logical element and zero.
1114 
1115 // vector register gather
1116 #define VGEF_ZOPC   (unsigned long)(0xe7L << 40 | 0x13L << 0)   // gather element (32 bit), V1(M3) = [D2(V2(M3),B2)]
1117 #define VGEG_ZOPC   (unsigned long)(0xe7L << 40 | 0x12L << 0)   // gather element (64 bit), V1(M3) = [D2(V2(M3),B2)]
1118 // vector register scatter
1119 #define VSCEF_ZOPC  (unsigned long)(0xe7L << 40 | 0x1bL << 0)   // vector scatter element FW
1120 #define VSCEG_ZOPC  (unsigned long)(0xe7L << 40 | 0x1aL << 0)   // vector scatter element DW
1121 
1122 #define VLBB_ZOPC   (unsigned long)(0xe7L << 40 | 0x07L << 0)   // load vreg to block boundary (load to alignment).
1123 #define VLL_ZOPC    (unsigned long)(0xe7L << 40 | 0x37L << 0)   // load vreg with length.
1124 
1125 //---  Load (register)  ---
1126 
1127 #define VLR_ZOPC    (unsigned long)(0xe7L << 40 | 0x56L << 0)   // copy full vreg (128 bit)
1128 #define VLGV_ZOPC   (unsigned long)(0xe7L << 40 | 0x21L << 0)   // copy vreg element -> GR
1129 #define VLVG_ZOPC   (unsigned long)(0xe7L << 40 | 0x22L << 0)   // copy GR -> vreg element
1130 #define VLVGP_ZOPC  (unsigned long)(0xe7L << 40 | 0x62L << 0)   // copy GR2, GR3 (disjoint pair) -> vreg
1131 
1132 // vector register pack: cut in half the size the source vector elements
1133 #define VPK_ZOPC    (unsigned long)(0xe7L << 40 | 0x94L << 0)   // just cut
1134 #define VPKS_ZOPC   (unsigned long)(0xe7L << 40 | 0x97L << 0)   // saturate as signed values
1135 #define VPKLS_ZOPC  (unsigned long)(0xe7L << 40 | 0x95L << 0)   // saturate as unsigned values
1136 
1137 // vector register unpack: double in size the source vector elements
1138 #define VUPH_ZOPC   (unsigned long)(0xe7L << 40 | 0xd7L << 0)   // signed, left half of the source vector elements
1139 #define VUPLH_ZOPC  (unsigned long)(0xe7L << 40 | 0xd5L << 0)   // unsigned, left half of the source vector elements
1140 #define VUPL_ZOPC   (unsigned long)(0xe7L << 40 | 0xd6L << 0)   // signed, right half of the source vector elements
1141 #define VUPLL_ZOPC  (unsigned long)(0xe7L << 40 | 0xd4L << 0)   // unsigned, right half of the source vector element
1142 
1143 // vector register merge
1144 #define VMRH_ZOPC   (unsigned long)(0xe7L << 40 | 0x61L << 0)   // register merge high (left half of source registers)
1145 #define VMRL_ZOPC   (unsigned long)(0xe7L << 40 | 0x60L << 0)   // register merge low (right half of source registers)
1146 
1147 // vector register permute
1148 #define VPERM_ZOPC  (unsigned long)(0xe7L << 40 | 0x8cL << 0)   // vector permute
1149 #define VPDI_ZOPC   (unsigned long)(0xe7L << 40 | 0x84L << 0)   // vector permute DW immediate
1150 
1151 // vector register replicate
1152 #define VREP_ZOPC   (unsigned long)(0xe7L << 40 | 0x4dL << 0)   // vector replicate
1153 #define VREPI_ZOPC  (unsigned long)(0xe7L << 40 | 0x45L << 0)   // vector replicate immediate
1154 #define VSEL_ZOPC   (unsigned long)(0xe7L << 40 | 0x8dL << 0)   // vector select
1155 
1156 #define VSEG_ZOPC   (unsigned long)(0xe7L << 40 | 0x5fL << 0)   // vector sign-extend to DW (rightmost element in each DW).
1157 
1158 //---  Load (immediate)  ---
1159 
1160 #define VLEIB_ZOPC  (unsigned long)(0xe7L << 40 | 0x40L << 0)   // load vreg element (16 bit imm to 8 bit)
1161 #define VLEIH_ZOPC  (unsigned long)(0xe7L << 40 | 0x41L << 0)   // load vreg element (16 bit imm to 16 bit)
1162 #define VLEIF_ZOPC  (unsigned long)(0xe7L << 40 | 0x43L << 0)   // load vreg element (16 bit imm to 32 bit)
1163 #define VLEIG_ZOPC  (unsigned long)(0xe7L << 40 | 0x42L << 0)   // load vreg element (16 bit imm to 64 bit)
1164 
1165 //---  Store  ---
1166 
1167 #define VSTM_ZOPC   (unsigned long)(0xe7L << 40 | 0x3eL << 0)   // store full vreg range (n * 128 bit)
1168 #define VST_ZOPC    (unsigned long)(0xe7L << 40 | 0x0eL << 0)   // store full vreg (128 bit)
1169 #define VSTEB_ZOPC  (unsigned long)(0xe7L << 40 | 0x08L << 0)   // store vreg element (8 bit)
1170 #define VSTEH_ZOPC  (unsigned long)(0xe7L << 40 | 0x09L << 0)   // store vreg element (16 bit)
1171 #define VSTEF_ZOPC  (unsigned long)(0xe7L << 40 | 0x0bL << 0)   // store vreg element (32 bit)
1172 #define VSTEG_ZOPC  (unsigned long)(0xe7L << 40 | 0x0aL << 0)   // store vreg element (64 bit)
1173 #define VSTL_ZOPC   (unsigned long)(0xe7L << 40 | 0x3fL << 0)   // store vreg with length.
1174 
1175 //---  Misc  ---
1176 
1177 #define VGM_ZOPC    (unsigned long)(0xe7L << 40 | 0x46L << 0)   // generate bit  mask, [start..end] = '1', else '0'
1178 #define VGBM_ZOPC   (unsigned long)(0xe7L << 40 | 0x44L << 0)   // generate byte mask, bits(imm16) -> bytes
1179 
1180 //---<  Vector Arithmetic Instructions  >---
1181 
1182 // Load
1183 #define VLC_ZOPC    (unsigned long)(0xe7L << 40 | 0xdeL << 0)   // V1 := -V2,   element size = 2**m
1184 #define VLP_ZOPC    (unsigned long)(0xe7L << 40 | 0xdfL << 0)   // V1 := |V2|,  element size = 2**m
1185 
1186 // ADD
1187 #define VA_ZOPC     (unsigned long)(0xe7L << 40 | 0xf3L << 0)   // V1 := V2 + V3, element size = 2**m
1188 #define VACC_ZOPC   (unsigned long)(0xe7L << 40 | 0xf1L << 0)   // V1 := carry(V2 + V3), element size = 2**m
1189 
1190 // SUB
1191 #define VS_ZOPC     (unsigned long)(0xe7L << 40 | 0xf7L << 0)   // V1 := V2 - V3, element size = 2**m
1192 #define VSCBI_ZOPC  (unsigned long)(0xe7L << 40 | 0xf5L << 0)   // V1 := borrow(V2 - V3), element size = 2**m
1193 
1194 // MUL
1195 #define VML_ZOPC    (unsigned long)(0xe7L << 40 | 0xa2L << 0)   // V1 := V2 * V3, element size = 2**m
1196 #define VMH_ZOPC    (unsigned long)(0xe7L << 40 | 0xa3L << 0)   // V1 := V2 * V3, element size = 2**m
1197 #define VMLH_ZOPC   (unsigned long)(0xe7L << 40 | 0xa1L << 0)   // V1 := V2 * V3, element size = 2**m, unsigned
1198 #define VME_ZOPC    (unsigned long)(0xe7L << 40 | 0xa6L << 0)   // V1 := V2 * V3, element size = 2**m
1199 #define VMLE_ZOPC   (unsigned long)(0xe7L << 40 | 0xa4L << 0)   // V1 := V2 * V3, element size = 2**m, unsigned
1200 #define VMO_ZOPC    (unsigned long)(0xe7L << 40 | 0xa7L << 0)   // V1 := V2 * V3, element size = 2**m
1201 #define VMLO_ZOPC   (unsigned long)(0xe7L << 40 | 0xa5L << 0)   // V1 := V2 * V3, element size = 2**m, unsigned
1202 
1203 // MUL & ADD
1204 #define VMAL_ZOPC   (unsigned long)(0xe7L << 40 | 0xaaL << 0)   // V1 := V2 * V3 + V4, element size = 2**m
1205 #define VMAH_ZOPC   (unsigned long)(0xe7L << 40 | 0xabL << 0)   // V1 := V2 * V3 + V4, element size = 2**m
1206 #define VMALH_ZOPC  (unsigned long)(0xe7L << 40 | 0xa9L << 0)   // V1 := V2 * V3 + V4, element size = 2**m, unsigned
1207 #define VMAE_ZOPC   (unsigned long)(0xe7L << 40 | 0xaeL << 0)   // V1 := V2 * V3 + V4, element size = 2**m
1208 #define VMALE_ZOPC  (unsigned long)(0xe7L << 40 | 0xacL << 0)   // V1 := V2 * V3 + V4, element size = 2**m, unsigned
1209 #define VMAO_ZOPC   (unsigned long)(0xe7L << 40 | 0xafL << 0)   // V1 := V2 * V3 + V4, element size = 2**m
1210 #define VMALO_ZOPC  (unsigned long)(0xe7L << 40 | 0xadL << 0)   // V1 := V2 * V3 + V4, element size = 2**m, unsigned
1211 
1212 // Vector SUM
1213 #define VSUM_ZOPC   (unsigned long)(0xe7L << 40 | 0x64L << 0)   // V1[j] := toFW(sum(V2[i]) + V3[j]), subelements: byte or HW
1214 #define VSUMG_ZOPC  (unsigned long)(0xe7L << 40 | 0x65L << 0)   // V1[j] := toDW(sum(V2[i]) + V3[j]), subelements: HW or FW
1215 #define VSUMQ_ZOPC  (unsigned long)(0xe7L << 40 | 0x67L << 0)   // V1[j] := toQW(sum(V2[i]) + V3[j]), subelements: FW or DW
1216 
1217 // Average
1218 #define VAVG_ZOPC   (unsigned long)(0xe7L << 40 | 0xf2L << 0)   // V1 := (V2+V3+1)/2, signed,   element size = 2**m
1219 #define VAVGL_ZOPC  (unsigned long)(0xe7L << 40 | 0xf0L << 0)   // V1 := (V2+V3+1)/2, unsigned, element size = 2**m
1220 
1221 // VECTOR Galois Field Multiply Sum
1222 #define VGFM_ZOPC   (unsigned long)(0xe7L << 40 | 0xb4L << 0)
1223 #define VGFMA_ZOPC  (unsigned long)(0xe7L << 40 | 0xbcL << 0)
1224 
1225 //---<  Vector Logical Instructions  >---
1226 
1227 // AND
1228 #define VN_ZOPC     (unsigned long)(0xe7L << 40 | 0x68L << 0)   // V1 := V2 & V3,  element size = 2**m
1229 #define VNC_ZOPC    (unsigned long)(0xe7L << 40 | 0x69L << 0)   // V1 := V2 & ~V3, element size = 2**m
1230 
1231 // XOR
1232 #define VX_ZOPC     (unsigned long)(0xe7L << 40 | 0x6dL << 0)   // V1 := V2 ^ V3,  element size = 2**m
1233 
1234 // NOR
1235 #define VNO_ZOPC    (unsigned long)(0xe7L << 40 | 0x6bL << 0)   // V1 := !(V2 | V3),  element size = 2**m
1236 
1237 // OR
1238 #define VO_ZOPC     (unsigned long)(0xe7L << 40 | 0x6aL << 0)   // V1 := V2 | V3,  element size = 2**m
1239 
1240 // Comparison (element-wise)
1241 #define VCEQ_ZOPC   (unsigned long)(0xe7L << 40 | 0xf8L << 0)   // V1 := (V2 == V3) ? 0xffff : 0x0000, element size = 2**m
1242 #define VCH_ZOPC    (unsigned long)(0xe7L << 40 | 0xfbL << 0)   // V1 := (V2  > V3) ? 0xffff : 0x0000, element size = 2**m, signed
1243 #define VCHL_ZOPC   (unsigned long)(0xe7L << 40 | 0xf9L << 0)   // V1 := (V2  > V3) ? 0xffff : 0x0000, element size = 2**m, unsigned
1244 
1245 // Max/Min (element-wise)
1246 #define VMX_ZOPC    (unsigned long)(0xe7L << 40 | 0xffL << 0)   // V1 := (V2 > V3) ? V2 : V3, element size = 2**m, signed
1247 #define VMXL_ZOPC   (unsigned long)(0xe7L << 40 | 0xfdL << 0)   // V1 := (V2 > V3) ? V2 : V3, element size = 2**m, unsigned
1248 #define VMN_ZOPC    (unsigned long)(0xe7L << 40 | 0xfeL << 0)   // V1 := (V2 < V3) ? V2 : V3, element size = 2**m, signed
1249 #define VMNL_ZOPC   (unsigned long)(0xe7L << 40 | 0xfcL << 0)   // V1 := (V2 < V3) ? V2 : V3, element size = 2**m, unsigned
1250 
1251 // Leading/Trailing Zeros, population count
1252 #define VCLZ_ZOPC   (unsigned long)(0xe7L << 40 | 0x53L << 0)   // V1 := leadingzeros(V2),  element size = 2**m
1253 #define VCTZ_ZOPC   (unsigned long)(0xe7L << 40 | 0x52L << 0)   // V1 := trailingzeros(V2), element size = 2**m
1254 #define VPOPCT_ZOPC (unsigned long)(0xe7L << 40 | 0x50L << 0)   // V1 := popcount(V2), bytewise!!
1255 
1256 // Rotate/Shift
1257 #define VERLLV_ZOPC (unsigned long)(0xe7L << 40 | 0x73L << 0)   // V1 := rotateleft(V2), rotate count in V3 element
1258 #define VERLL_ZOPC  (unsigned long)(0xe7L << 40 | 0x33L << 0)   // V1 := rotateleft(V3), rotate count from d2(b2).
1259 #define VERIM_ZOPC  (unsigned long)(0xe7L << 40 | 0x72L << 0)   // Rotate then insert under mask. Read Principles of Operation!!
1260 
1261 #define VESLV_ZOPC  (unsigned long)(0xe7L << 40 | 0x70L << 0)   // V1 := SLL(V2, V3), unsigned, element-wise
1262 #define VESL_ZOPC   (unsigned long)(0xe7L << 40 | 0x30L << 0)   // V1 := SLL(V3), unsigned, shift count from d2(b2).
1263 
1264 #define VESRAV_ZOPC (unsigned long)(0xe7L << 40 | 0x7AL << 0)   // V1 := SRA(V2, V3), signed, element-wise
1265 #define VESRA_ZOPC  (unsigned long)(0xe7L << 40 | 0x3AL << 0)   // V1 := SRA(V3), signed, shift count from d2(b2).
1266 #define VESRLV_ZOPC (unsigned long)(0xe7L << 40 | 0x78L << 0)   // V1 := SRL(V2, V3), unsigned, element-wise
1267 #define VESRL_ZOPC  (unsigned long)(0xe7L << 40 | 0x38L << 0)   // V1 := SRL(V3), unsigned, shift count from d2(b2).
1268 
1269 #define VSL_ZOPC    (unsigned long)(0xe7L << 40 | 0x74L << 0)   // V1 := SLL(V2), unsigned, bit-count
1270 #define VSLB_ZOPC   (unsigned long)(0xe7L << 40 | 0x75L << 0)   // V1 := SLL(V2), unsigned, byte-count
1271 #define VSLDB_ZOPC  (unsigned long)(0xe7L << 40 | 0x77L << 0)   // V1 := SLL((V2,V3)), unsigned, byte-count
1272 
1273 #define VSRA_ZOPC   (unsigned long)(0xe7L << 40 | 0x7eL << 0)   // V1 := SRA(V2), signed, bit-count
1274 #define VSRAB_ZOPC  (unsigned long)(0xe7L << 40 | 0x7fL << 0)   // V1 := SRA(V2), signed, byte-count
1275 #define VSRL_ZOPC   (unsigned long)(0xe7L << 40 | 0x7cL << 0)   // V1 := SRL(V2), unsigned, bit-count
1276 #define VSRLB_ZOPC  (unsigned long)(0xe7L << 40 | 0x7dL << 0)   // V1 := SRL(V2), unsigned, byte-count
1277 
1278 // Test under Mask
1279 #define VTM_ZOPC    (unsigned long)(0xe7L << 40 | 0xd8L << 0)   // Like TM, set CC according to state of selected bits.
1280 
1281 //---<  Vector String Instructions  >---
1282 #define VFAE_ZOPC   (unsigned long)(0xe7L << 40 | 0x82L << 0)   // Find any element
1283 #define VFEE_ZOPC   (unsigned long)(0xe7L << 40 | 0x80L << 0)   // Find element equal
1284 #define VFENE_ZOPC  (unsigned long)(0xe7L << 40 | 0x81L << 0)   // Find element not equal
1285 #define VSTRC_ZOPC  (unsigned long)(0xe7L << 40 | 0x8aL << 0)   // String range compare
1286 #define VISTR_ZOPC  (unsigned long)(0xe7L << 40 | 0x5cL << 0)   // Isolate String
1287 
1288 
1289 //--------------------------------
1290 //--  Miscellaneous Operations  --
1291 //--------------------------------
1292 
1293 // Execute
1294 #define EX_ZOPC     (unsigned  int)(68L << 24)
1295 #define EXRL_ZOPC   (unsigned long)(0xc6L << 40 | 0x00L << 32)  // z10
1296 
1297 // Compare and Swap
1298 #define CS_ZOPC     (unsigned  int)(0xba << 24)
1299 #define CSY_ZOPC    (unsigned long)(0xebL << 40 | 0x14L)
1300 #define CSG_ZOPC    (unsigned long)(0xebL << 40 | 0x30L)
1301 
1302 // Interlocked-Update
1303 #define LAA_ZOPC    (unsigned long)(0xebL << 40 | 0xf8L)         // z196
1304 #define LAAG_ZOPC   (unsigned long)(0xebL << 40 | 0xe8L)         // z196
1305 #define LAAL_ZOPC   (unsigned long)(0xebL << 40 | 0xfaL)         // z196
1306 #define LAALG_ZOPC  (unsigned long)(0xebL << 40 | 0xeaL)         // z196
1307 #define LAN_ZOPC    (unsigned long)(0xebL << 40 | 0xf4L)         // z196
1308 #define LANG_ZOPC   (unsigned long)(0xebL << 40 | 0xe4L)         // z196
1309 #define LAX_ZOPC    (unsigned long)(0xebL << 40 | 0xf7L)         // z196
1310 #define LAXG_ZOPC   (unsigned long)(0xebL << 40 | 0xe7L)         // z196
1311 #define LAO_ZOPC    (unsigned long)(0xebL << 40 | 0xf6L)         // z196
1312 #define LAOG_ZOPC   (unsigned long)(0xebL << 40 | 0xe6L)         // z196
1313 
1314 // System Functions
1315 #define STCKF_ZOPC  (unsigned  int)(0xb2 << 24 | 0x7c << 16)
1316 #define STFLE_ZOPC  (unsigned  int)(0xb2 << 24 | 0xb0 << 16)
1317 #define ECTG_ZOPC   (unsigned long)(0xc8L <<40 | 0x01L << 32)    // z10
1318 #define ECAG_ZOPC   (unsigned long)(0xebL <<40 | 0x4cL)          // z10
1319 
1320 // Execution Prediction
1321 #define PFD_ZOPC    (unsigned long)(0xe3L <<40 | 0x36L)          // z10
1322 #define PFDRL_ZOPC  (unsigned long)(0xc6L <<40 | 0x02L << 32)    // z10
1323 #define BPP_ZOPC    (unsigned long)(0xc7L <<40)                  // branch prediction preload  -- EC12
1324 #define BPRP_ZOPC   (unsigned long)(0xc5L <<40)                  // branch prediction preload  -- EC12
1325 
1326 // Transaction Control
1327 #define TBEGIN_ZOPC  (unsigned long)(0xe560L << 32)              // tx begin                   -- EC12
1328 #define TBEGINC_ZOPC (unsigned long)(0xe561L << 32)              // tx begin (constrained)     -- EC12
1329 #define TEND_ZOPC    (unsigned  int)(0xb2f8  << 16)              // tx end                     -- EC12
1330 #define TABORT_ZOPC  (unsigned  int)(0xb2fc  << 16)              // tx abort                   -- EC12
1331 #define ETND_ZOPC    (unsigned  int)(0xb2ec  << 16)              // tx nesting depth           -- EC12
1332 #define PPA_ZOPC     (unsigned  int)(0xb2e8  << 16)              // tx processor assist        -- EC12
1333 
1334 // Crypto and Checksum
1335 #define CKSM_ZOPC   (unsigned  int)(0xb2 << 24 | 0x41 << 16)     // checksum. This is NOT CRC32
1336 #define KM_ZOPC     (unsigned  int)(0xb9 << 24 | 0x2e << 16)     // cipher
1337 #define KMC_ZOPC    (unsigned  int)(0xb9 << 24 | 0x2f << 16)     // cipher
1338 #define KIMD_ZOPC   (unsigned  int)(0xb9 << 24 | 0x3e << 16)     // SHA (msg digest)
1339 #define KLMD_ZOPC   (unsigned  int)(0xb9 << 24 | 0x3f << 16)     // SHA (msg digest)
1340 #define KMAC_ZOPC   (unsigned  int)(0xb9 << 24 | 0x1e << 16)     // Message Authentication Code
1341 
1342 // Various
1343 #define TCEB_ZOPC   (unsigned long)(237L << 40 | 16)
1344 #define TCDB_ZOPC   (unsigned long)(237L << 40 | 17)
1345 #define TAM_ZOPC    (unsigned long)(267)
1346 
1347 #define FLOGR_ZOPC  (unsigned  int)(0xb9 << 24 | 0x83 << 16)
1348 #define POPCNT_ZOPC (unsigned  int)(0xb9e1 << 16)
1349 #define AHHHR_ZOPC  (unsigned  int)(0xb9c8 << 16)
1350 #define AHHLR_ZOPC  (unsigned  int)(0xb9d8 << 16)
1351 
1352 
1353 // OpCode field masks
1354 
1355 #define RI_MASK     (unsigned  int)(0xff  << 24 | 0x0f << 16)
1356 #define RRE_MASK    (unsigned  int)(0xff  << 24 | 0xff << 16)
1357 #define RSI_MASK    (unsigned  int)(0xff  << 24)
1358 #define RIE_MASK    (unsigned long)(0xffL << 40 | 0xffL)
1359 #define RIL_MASK    (unsigned long)(0xffL << 40 | 0x0fL << 32)
1360 
1361 #define BASR_MASK   (unsigned  int)(0xff << 8)
1362 #define BCR_MASK    (unsigned  int)(0xff << 8)
1363 #define BRC_MASK    (unsigned  int)(0xff << 24 | 0x0f << 16)
1364 #define LGHI_MASK   (unsigned  int)(0xff << 24 | 0x0f << 16)
1365 #define LLI_MASK    (unsigned  int)(0xff << 24 | 0x0f << 16)
1366 #define II_MASK     (unsigned  int)(0xff << 24 | 0x0f << 16)
1367 #define LLIF_MASK   (unsigned long)(0xffL << 40 | 0x0fL << 32)
1368 #define IIF_MASK    (unsigned long)(0xffL << 40 | 0x0fL << 32)
1369 #define BRASL_MASK  (unsigned long)(0xffL << 40 | 0x0fL << 32)
1370 #define TM_MASK     (unsigned  int)(0xff << 24)
1371 #define TMY_MASK    (unsigned long)(0xffL << 40 | 0xffL)
1372 #define LB_MASK     (unsigned long)(0xffL << 40 | 0xffL)
1373 #define LH_MASK     (unsigned int)(0xff << 24)
1374 #define L_MASK      (unsigned int)(0xff << 24)
1375 #define LY_MASK     (unsigned long)(0xffL << 40 | 0xffL)
1376 #define LG_MASK     (unsigned long)(0xffL << 40 | 0xffL)
1377 #define LLGH_MASK   (unsigned long)(0xffL << 40 | 0xffL)
1378 #define LLGF_MASK   (unsigned long)(0xffL << 40 | 0xffL)
1379 #define SLAG_MASK   (unsigned long)(0xffL << 40 | 0xffL)
1380 #define LARL_MASK   (unsigned long)(0xff0fL << 32)
1381 #define LGRL_MASK   (unsigned long)(0xff0fL << 32)
1382 #define LE_MASK     (unsigned int)(0xff << 24)
1383 #define LD_MASK     (unsigned int)(0xff << 24)
1384 #define ST_MASK     (unsigned int)(0xff << 24)
1385 #define STC_MASK    (unsigned int)(0xff << 24)
1386 #define STG_MASK    (unsigned long)(0xffL << 40 | 0xffL)
1387 #define STH_MASK    (unsigned int)(0xff << 24)
1388 #define STE_MASK    (unsigned int)(0xff << 24)
1389 #define STD_MASK    (unsigned int)(0xff << 24)
1390 #define CMPBRANCH_MASK (unsigned long)(0xffL << 40 | 0xffL)
1391 #define REL_LONG_MASK  (unsigned long)(0xff0fL << 32)
1392 
1393  public:
1394   // Condition code masks. Details:
1395   // - Mask bit#3 must be zero for all compare and branch/trap instructions to ensure
1396   //   future compatibility.
1397   // - For all arithmetic instructions which set the condition code, mask bit#3
1398   //   indicates overflow ("unordered" in float operations).
1399   // - "unordered" float comparison results have to be treated as low.
1400   // - When overflow/unordered is detected, none of the branch conditions is true,
1401   //   except for bcondOverflow/bcondNotOrdered and bcondAlways.
1402   // - For INT comparisons, the inverse condition can be calculated as (14-cond).
1403   // - For FLOAT comparisons, the inverse condition can be calculated as (15-cond).
1404   enum branch_condition {
1405     bcondNever       =  0,
1406     bcondAlways      = 15,
1407 
1408     // Specific names. Make use of lightweight sync.
1409     // Full and lightweight sync operation.
1410     bcondFullSync    = 15,
1411     bcondLightSync   = 14,
1412     bcondNop         =  0,
1413 
1414     // arithmetic compare instructions
1415     // arithmetic load and test, insert instructions
1416     // Mask bit#3 must be zero for future compatibility.
1417     bcondEqual       =  8,
1418     bcondNotEqual    =  6,
1419     bcondLow         =  4,
1420     bcondNotLow      = 10,
1421     bcondHigh        =  2,
1422     bcondNotHigh     = 12,
1423     // arithmetic calculation instructions
1424     // Mask bit#3 indicates overflow if detected by instr.
1425     // Mask bit#3 = 0 (overflow is not handled by compiler).
1426     bcondOverflow    =  1,
1427     bcondNotOverflow = 14,
1428     bcondZero        =  bcondEqual,
1429     bcondNotZero     =  bcondNotEqual,
1430     bcondNegative    =  bcondLow,
1431     bcondNotNegative =  bcondNotLow,
1432     bcondPositive    =  bcondHigh,
1433     bcondNotPositive =  bcondNotHigh,
1434     bcondNotOrdered  =  1,  // float comparisons
1435     bcondOrdered     = 14,  // float comparisons
1436     bcondLowOrNotOrdered  =  bcondLow  | bcondNotOrdered,  // float comparisons
1437     bcondHighOrNotOrdered =  bcondHigh | bcondNotOrdered,  // float comparisons
1438     bcondNotLowOrNotOrdered   =  bcondNotLow   | bcondNotOrdered,  // float comparisons
1439     bcondNotHighOrNotOrdered  =  bcondNotHigh  | bcondNotOrdered,  // float comparisons
1440     bcondNotEqualOrNotOrdered =  bcondNotEqual | bcondNotOrdered,  // float comparisons
1441     // unsigned arithmetic calculation instructions
1442     // Mask bit#0 is not used by these instructions.
1443     // There is no indication of overflow for these instr.
1444     bcondLogZero_NoCarry     =  8,
1445     bcondLogZero_Carry       =  2,
1446     // bcondLogZero_Borrow      =  8,  // This CC is never generated.
1447     bcondLogZero_NoBorrow    =  2,
1448     bcondLogZero             =  bcondLogZero_Carry | bcondLogZero_NoCarry,
1449     bcondLogNotZero_NoCarry  =  4,
1450     bcondLogNotZero_Carry    =  1,
1451     bcondLogNotZero_Borrow   =  4,
1452     bcondLogNotZero_NoBorrow =  1,
1453     bcondLogNotZero          =  bcondLogNotZero_Carry | bcondLogNotZero_NoCarry,
1454     bcondLogCarry            =  bcondLogZero_Carry | bcondLogNotZero_Carry,
1455     bcondLogBorrow           =  /* bcondLogZero_Borrow | */ bcondLogNotZero_Borrow,
1456     // Vector compare instructions
1457     bcondVAlltrue    =  8,  // All  vector elements evaluate true
1458     bcondVMixed      =  4,  // Some vector elements evaluate true, some false
1459     bcondVAllfalse   =  1,  // All  vector elements evaluate false
1460     // string search instructions
1461     bcondFound       =  4,
1462     bcondNotFound    =  2,
1463     bcondInterrupted =  1,
1464     // bit test instructions
1465     bcondAllZero     =  8,
1466     bcondMixed       =  6,
1467     bcondAllOne      =  1,
1468     bcondNotAllZero  =  7 // for tmll
1469   };
1470 
1471   enum Condition {
1472     // z/Architecture
1473     negative         = 0,
1474     less             = 0,
1475     positive         = 1,
1476     greater          = 1,
1477     zero             = 2,
1478     equal            = 2,
1479     summary_overflow = 3,
1480   };
1481 
1482   // Rounding mode for float-2-int conversions.
1483   enum RoundingMode {
1484     current_mode      = 0,   // Mode taken from FPC register.
1485     biased_to_nearest = 1,
1486     to_nearest        = 4,
1487     to_zero           = 5,
1488     to_plus_infinity  = 6,
1489     to_minus_infinity = 7
1490   };
1491 
1492   // Vector Register Element Type.
1493   enum VRegElemType {
1494     VRET_BYTE   = 0,
1495     VRET_HW     = 1,
1496     VRET_FW     = 2,
1497     VRET_DW     = 3,
1498     VRET_QW     = 4
1499   };
1500 
1501   // Vector Operation Result Control.
1502   //   This is a set of flags used in some vector instructions to control
1503   //   the result (side) effects of instruction execution.
1504   enum VOpRC {
1505     VOPRC_CCSET    = 0b0001, // set the CC.
1506     VOPRC_CCIGN    = 0b0000, // ignore, don't set CC.
1507     VOPRC_ZS       = 0b0010, // Zero Search. Additional, elementwise, comparison against zero.
1508     VOPRC_NOZS     = 0b0000, // No Zero Search.
1509     VOPRC_RTBYTEIX = 0b0100, // generate byte index to lowest element with true comparison.
1510     VOPRC_RTBITVEC = 0b0000, // generate bit vector, all 1s for true, all 0s for false element comparisons.
1511     VOPRC_INVERT   = 0b1000, // invert comparison results.
1512     VOPRC_NOINVERT = 0b0000  // use comparison results as is, do not invert.
1513   };
1514 
1515   // Inverse condition code, i.e. determine "15 - cc" for a given condition code cc.
1516   static branch_condition inverse_condition(branch_condition cc);
1517   static branch_condition inverse_float_condition(branch_condition cc);
1518 
1519 
1520   //-----------------------------------------------
1521   // instruction property getter methods
1522   //-----------------------------------------------
1523 
1524   // Calculate length of instruction.
1525   static unsigned int instr_len(unsigned char *instr);
1526 
1527   // Longest instructions are 6 bytes on z/Architecture.
instr_maxlen()1528   static unsigned int instr_maxlen() { return 6; }
1529 
1530   // Average instruction is 4 bytes on z/Architecture (just a guess).
instr_avglen()1531   static unsigned int instr_avglen() { return 4; }
1532 
1533   // Shortest instructions are 2 bytes on z/Architecture.
instr_minlen()1534   static unsigned int instr_minlen() { return 2; }
1535 
1536   // Move instruction at pc right-justified into passed long int.
1537   // Return instr len in bytes as function result.
1538   static unsigned int get_instruction(unsigned char *pc, unsigned long *instr);
1539 
1540   // Move instruction in passed (long int) into storage at pc.
1541   // This code is _NOT_ MT-safe!!
set_instruction(unsigned char * pc,unsigned long instr,unsigned int len)1542   static void set_instruction(unsigned char *pc, unsigned long instr, unsigned int len) {
1543     memcpy(pc, ((unsigned char *)&instr)+sizeof(unsigned long)-len, len);
1544   }
1545 
1546 
1547   //------------------------------------------
1548   // instruction field test methods
1549   //------------------------------------------
1550 
1551   // Only used once in s390.ad to implement Matcher::is_short_branch_offset().
is_within_range_of_RelAddr16(address target,address origin)1552   static bool is_within_range_of_RelAddr16(address target, address origin) {
1553     return RelAddr::is_in_range_of_RelAddr16(target, origin);
1554   }
1555 
1556 
1557   //----------------------------------
1558   // some diagnostic output
1559   //----------------------------------
1560 
1561   static void print_dbg_msg(outputStream* out, unsigned long inst, const char* msg, int ilen) PRODUCT_RETURN;
1562   static void dump_code_range(outputStream* out, address pc, const unsigned int range, const char* msg = " ") PRODUCT_RETURN;
1563 
1564  protected:
1565 
1566   //-------------------------------------------------------
1567   // instruction field helper methods (internal)
1568   //-------------------------------------------------------
1569 
1570   // Return a mask of 1s between hi_bit and lo_bit (inclusive).
fmask(unsigned int hi_bit,unsigned int lo_bit)1571   static long fmask(unsigned int hi_bit, unsigned int lo_bit) {
1572     assert(hi_bit >= lo_bit && hi_bit < 48, "bad bits");
1573     return ((1L<<(hi_bit-lo_bit+1)) - 1) << lo_bit;
1574   }
1575 
1576   // extract u_field
1577   // unsigned value
inv_u_field(long x,int hi_bit,int lo_bit)1578   static long inv_u_field(long x, int hi_bit, int lo_bit) {
1579     return (x & fmask(hi_bit, lo_bit)) >> lo_bit;
1580   }
1581 
1582   // extract s_field
1583   // Signed value, may need sign extension.
inv_s_field(long x,int hi_bit,int lo_bit)1584   static long inv_s_field(long x, int hi_bit, int lo_bit) {
1585     x = inv_u_field(x, hi_bit, lo_bit);
1586     // Highest extracted bit set -> sign extension.
1587     return (x >= (1L<<(hi_bit-lo_bit)) ? x | ((-1L)<<(hi_bit-lo_bit)) : x);
1588   }
1589 
1590   // Extract primary opcode from instruction.
z_inv_op(int x)1591   static int z_inv_op(int  x) { return inv_u_field(x, 31, 24); }
z_inv_op(long x)1592   static int z_inv_op(long x) { return inv_u_field(x, 47, 40); }
1593 
inv_reg(long x,int s,int len)1594   static int inv_reg( long x, int s, int len) { return inv_u_field(x, (len-s)-1, (len-s)-4); }  // Regs are encoded in 4 bits.
inv_mask(long x,int s,int len)1595   static int inv_mask(long x, int s, int len) { return inv_u_field(x, (len-s)-1, (len-s)-8); }  // Mask is 8 bits long.
inv_simm16_48(long x)1596   static int inv_simm16_48(long x) { return (inv_s_field(x, 31, 16)); }                         // 6-byte instructions only
inv_simm16(long x)1597   static int inv_simm16(long x)    { return (inv_s_field(x, 15,  0)); }                         // 4-byte instructions only
inv_simm20(long x)1598   static int inv_simm20(long x)    { return (inv_u_field(x, 27, 16) |                           // 6-byte instructions only
1599                                              inv_s_field(x, 15, 8)<<12); }
inv_simm32(long x)1600   static int inv_simm32(long x)    { return (inv_s_field(x, 31,  0)); }                         // 6-byte instructions only
inv_uimm12(long x)1601   static int inv_uimm12(long x)    { return (inv_u_field(x, 11,  0)); }                         // 4-byte instructions only
1602 
1603   // Encode u_field from long value.
u_field(long x,int hi_bit,int lo_bit)1604   static long u_field(long x, int hi_bit, int lo_bit) {
1605     long r = x << lo_bit;
1606     assert((r & ~fmask(hi_bit, lo_bit))   == 0, "value out of range");
1607     assert(inv_u_field(r, hi_bit, lo_bit) == x, "just checking");
1608     return r;
1609   }
1610 
rsmask_48(Address a)1611   static int64_t rsmask_48( Address a) { assert(a.is_RSform(),  "bad address format"); return rsmask_48( a.disp12(), a.base()); }
rxmask_48(Address a)1612   static int64_t rxmask_48( Address a) {      if (a.is_RXform())  { return rxmask_48( a.disp12(), a.index(), a.base()); }
1613                                          else if (a.is_RSform())  { return rsmask_48( a.disp12(),            a.base()); }
1614                                          else                     { guarantee(false, "bad address format");  return 0;  }
1615                                        }
rsymask_48(Address a)1616   static int64_t rsymask_48(Address a) { assert(a.is_RSYform(), "bad address format"); return rsymask_48(a.disp20(), a.base()); }
rxymask_48(Address a)1617   static int64_t rxymask_48(Address a) {      if (a.is_RXYform()) { return rxymask_48( a.disp20(), a.index(), a.base()); }
1618                                          else if (a.is_RSYform()) { return rsymask_48( a.disp20(),            a.base()); }
1619                                          else                     { guarantee(false, "bad address format");  return 0;   }
1620                                        }
1621 
rsmask_48(int64_t d2,Register b2)1622   static int64_t rsmask_48( int64_t d2, Register b2)              { return uimm12(d2, 20, 48)                   | regz(b2, 16, 48); }
rxmask_48(int64_t d2,Register x2,Register b2)1623   static int64_t rxmask_48( int64_t d2, Register x2, Register b2) { return uimm12(d2, 20, 48) | reg(x2, 12, 48) | regz(b2, 16, 48); }
rsymask_48(int64_t d2,Register b2)1624   static int64_t rsymask_48(int64_t d2, Register b2)              { return simm20(d2)                           | regz(b2, 16, 48); }
rxymask_48(int64_t d2,Register x2,Register b2)1625   static int64_t rxymask_48(int64_t d2, Register x2, Register b2) { return simm20(d2)         | reg(x2, 12, 48) | regz(b2, 16, 48); }
1626 
1627   // Address calculated from d12(vx,b) - vx is vector index register.
rvmask_48(int64_t d2,VectorRegister x2,Register b2)1628   static int64_t rvmask_48( int64_t d2, VectorRegister x2, Register b2) { return uimm12(d2, 20, 48) | vreg(x2, 12) | regz(b2, 16, 48); }
1629 
vreg_mask(VectorRegister v,int pos)1630   static int64_t vreg_mask(VectorRegister v, int pos) {
1631     return vreg(v, pos) | v->RXB_mask(pos);
1632   }
1633 
1634   // Vector Element Size Control. 4-bit field which indicates the size of the vector elements.
vesc_mask(int64_t size,int min_size,int max_size,int pos)1635   static int64_t vesc_mask(int64_t size, int min_size, int max_size, int pos) {
1636     // min_size - minimum element size. Not all instructions support element sizes beginning with "byte".
1637     // max_size - maximum element size. Not all instructions support element sizes up to "QW".
1638     assert((min_size <= size) && (size <= max_size), "element size control out of range");
1639     return uimm4(size, pos, 48);
1640   }
1641 
1642   // Vector Element IndeX. 4-bit field which indexes the target vector element.
veix_mask(int64_t ix,int el_size,int pos)1643   static int64_t veix_mask(int64_t ix, int el_size, int pos) {
1644     // el_size - size of the vector element. This is a VRegElemType enum value.
1645     // ix      - vector element index.
1646     int max_ix = -1;
1647     switch (el_size) {
1648       case VRET_BYTE: max_ix = 15; break;
1649       case VRET_HW:   max_ix =  7; break;
1650       case VRET_FW:   max_ix =  3; break;
1651       case VRET_DW:   max_ix =  1; break;
1652       case VRET_QW:   max_ix =  0; break;
1653       default:        guarantee(false, "bad vector element size %d", el_size); break;
1654     }
1655     assert((0 <= ix) && (ix <= max_ix), "element size out of range (0 <= %ld <= %d)", ix, max_ix);
1656     return uimm4(ix, pos, 48);
1657   }
1658 
1659   // Vector Operation Result Control. 4-bit field.
voprc_any(int64_t flags,int pos,int64_t allowed_flags=0b1111)1660   static int64_t voprc_any(int64_t flags, int pos, int64_t allowed_flags = 0b1111) {
1661     assert((flags & allowed_flags) == flags, "Invalid VOPRC_* flag combination: %d", (int)flags);
1662     return uimm4(flags, pos, 48);
1663   }
1664 
1665   // Vector Operation Result Control. Condition code setting.
voprc_ccmask(int64_t flags,int pos)1666   static int64_t voprc_ccmask(int64_t flags, int pos) {
1667     return voprc_any(flags, pos, VOPRC_CCIGN | VOPRC_CCSET);
1668   }
1669 
1670  public:
1671 
1672   //--------------------------------------------------
1673   // instruction field construction methods
1674   //--------------------------------------------------
1675 
1676   // Compute relative address (32 bit) for branch.
1677   // Only used once in nativeInst_s390.cpp.
z_pcrel_off(address dest,address pc)1678   static intptr_t z_pcrel_off(address dest, address pc) {
1679     return RelAddr::pcrel_off32(dest, pc);
1680   }
1681 
1682   // Extract 20-bit signed displacement.
1683   // Only used in disassembler_s390.cpp for temp enhancements.
inv_simm20_xx(address iLoc)1684   static int inv_simm20_xx(address iLoc) {
1685     unsigned long instr = 0;
1686     unsigned long iLen  = get_instruction(iLoc, &instr);
1687     return inv_simm20(instr);
1688   }
1689 
1690   // unsigned immediate, in low bits, nbits long
uimm(long x,int nbits)1691   static long uimm(long x, int nbits) {
1692     assert(Immediate::is_uimm(x, nbits), "unsigned constant out of range");
1693     return x & fmask(nbits - 1, 0);
1694   }
1695 
1696   // Cast '1' to long to avoid sign extension if nbits = 32.
1697   // signed immediate, in low bits, nbits long
simm(long x,int nbits)1698   static long simm(long x, int nbits) {
1699     assert(Immediate::is_simm(x, nbits), "value out of range");
1700     return x & fmask(nbits - 1, 0);
1701   }
1702 
imm(int64_t x,int nbits)1703   static long imm(int64_t x, int nbits) {
1704     // Assert that x can be represented with nbits bits ignoring the sign bits,
1705     // i.e. the more higher bits should all be 0 or 1.
1706     assert((x >> nbits) == 0 || (x >> nbits) == -1, "value out of range");
1707     return x & fmask(nbits-1, 0);
1708   }
1709 
1710   // A 20-bit displacement is only in instructions of the
1711   // RSY, RXY, or SIY format. In these instructions, the D
1712   // field consists of a DL (low) field in bit positions 20-31
1713   // and of a DH (high) field in bit positions 32-39. The
1714   // value of the displacement is formed by appending the
1715   // contents of the DH field to the left of the contents of
1716   // the DL field.
simm20(int64_t ui20)1717   static long simm20(int64_t ui20) {
1718     assert(Immediate::is_simm(ui20, 20), "value out of range");
1719     return ( ((ui20        & 0xfffL) << (48-32)) |  // DL
1720             (((ui20 >> 12) &  0xffL) << (48-40)));  // DH
1721   }
1722 
reg(Register r,int s,int len)1723   static long reg(Register r, int s, int len)  { return u_field(r->encoding(), (len-s)-1, (len-s)-4); }
reg(int r,int s,int len)1724   static long reg(int r, int s, int len)       { return u_field(r,             (len-s)-1, (len-s)-4); }
regt(Register r,int s,int len)1725   static long regt(Register r, int s, int len) { return reg(r, s, len); }
regz(Register r,int s,int len)1726   static long regz(Register r, int s, int len) { assert(r != Z_R0, "cannot use register R0 in memory access"); return reg(r, s, len); }
1727 
uimm4(int64_t ui4,int s,int len)1728   static long uimm4( int64_t ui4,  int s, int len) { return uimm(ui4,   4) << (len-s-4);  }
uimm6(int64_t ui6,int s,int len)1729   static long uimm6( int64_t ui6,  int s, int len) { return uimm(ui6,   6) << (len-s-6);  }
uimm8(int64_t ui8,int s,int len)1730   static long uimm8( int64_t ui8,  int s, int len) { return uimm(ui8,   8) << (len-s-8);  }
uimm12(int64_t ui12,int s,int len)1731   static long uimm12(int64_t ui12, int s, int len) { return uimm(ui12, 12) << (len-s-12); }
uimm16(int64_t ui16,int s,int len)1732   static long uimm16(int64_t ui16, int s, int len) { return uimm(ui16, 16) << (len-s-16); }
uimm32(int64_t ui32,int s,int len)1733   static long uimm32(int64_t ui32, int s, int len) { return uimm((unsigned)ui32, 32) << (len-s-32); } // prevent sign extension
1734 
simm8(int64_t si8,int s,int len)1735   static long simm8( int64_t si8,  int s, int len) { return simm(si8,   8) << (len-s-8);  }
simm12(int64_t si12,int s,int len)1736   static long simm12(int64_t si12, int s, int len) { return simm(si12, 12) << (len-s-12); }
simm16(int64_t si16,int s,int len)1737   static long simm16(int64_t si16, int s, int len) { return simm(si16, 16) << (len-s-16); }
simm24(int64_t si24,int s,int len)1738   static long simm24(int64_t si24, int s, int len) { return simm(si24, 24) << (len-s-24); }
simm32(int64_t si32,int s,int len)1739   static long simm32(int64_t si32, int s, int len) { return simm(si32, 32) << (len-s-32); }
1740 
imm8(int64_t i8,int s,int len)1741   static long imm8( int64_t i8,  int s, int len)   { return imm(i8,   8) << (len-s-8);  }
imm12(int64_t i12,int s,int len)1742   static long imm12(int64_t i12, int s, int len)   { return imm(i12, 12) << (len-s-12); }
imm16(int64_t i16,int s,int len)1743   static long imm16(int64_t i16, int s, int len)   { return imm(i16, 16) << (len-s-16); }
imm24(int64_t i24,int s,int len)1744   static long imm24(int64_t i24, int s, int len)   { return imm(i24, 24) << (len-s-24); }
imm32(int64_t i32,int s,int len)1745   static long imm32(int64_t i32, int s, int len)   { return imm(i32, 32) << (len-s-32); }
1746 
vreg(VectorRegister v,int pos)1747   static long vreg(VectorRegister v, int pos)      { const int len = 48; return u_field(v->encoding()&0x0f, (len-pos)-1, (len-pos)-4) | v->RXB_mask(pos); }
1748 
fregt(FloatRegister r,int s,int len)1749   static long fregt(FloatRegister r, int s, int len) { return freg(r,s,len); }
freg(FloatRegister r,int s,int len)1750   static long freg( FloatRegister r, int s, int len) { return u_field(r->encoding(), (len-s)-1, (len-s)-4); }
1751 
1752   // Rounding mode for float-2-int conversions.
rounding_mode(RoundingMode m,int s,int len)1753   static long rounding_mode(RoundingMode m, int s, int len) {
1754     assert(m != 2 && m != 3, "invalid mode");
1755     return uimm(m, 4) << (len-s-4);
1756   }
1757 
1758   //--------------------------------------------
1759   // instruction field getter methods
1760   //--------------------------------------------
1761 
get_imm32(address a,int instruction_number)1762   static int get_imm32(address a, int instruction_number) {
1763     int imm;
1764     int *p =((int *)(a + 2 + 6 * instruction_number));
1765     imm = *p;
1766     return imm;
1767   }
1768 
get_imm16(address a,int instruction_number)1769   static short get_imm16(address a, int instruction_number) {
1770     short imm;
1771     short *p =((short *)a) + 2 * instruction_number + 1;
1772     imm = *p;
1773     return imm;
1774   }
1775 
1776 
1777   //--------------------------------------------
1778   // instruction field setter methods
1779   //--------------------------------------------
1780 
set_imm32(address a,int64_t s)1781   static void set_imm32(address a, int64_t s) {
1782     assert(Immediate::is_simm32(s) || Immediate::is_uimm32(s), "to big");
1783     int* p = (int *) (a + 2);
1784     *p = s;
1785   }
1786 
set_imm16(int * instr,int64_t s)1787   static void set_imm16(int* instr, int64_t s) {
1788     assert(Immediate::is_simm16(s) || Immediate::is_uimm16(s), "to big");
1789     short* p = ((short *)instr) + 1;
1790     *p = s;
1791   }
1792 
1793  public:
1794 
align(unsigned int x,unsigned int a)1795   static unsigned int align(unsigned int x, unsigned int a) { return ((x + (a - 1)) & ~(a - 1)); }
is_aligned(unsigned int x,unsigned int a)1796   static bool    is_aligned(unsigned int x, unsigned int a) { return (0 == x % a); }
1797 
1798   inline void emit_16(int x);
1799   inline void emit_32(int x);
1800   inline void emit_48(long x);
1801 
1802   // Compare and control flow instructions
1803   // =====================================
1804 
1805   // See also commodity routines compare64_and_branch(), compare32_and_branch().
1806 
1807   // compare instructions
1808   // compare register
1809   inline void z_cr(  Register r1, Register r2);                          // compare (r1, r2)        ; int32
1810   inline void z_cgr( Register r1, Register r2);                          // compare (r1, r2)        ; int64
1811   inline void z_cgfr(Register r1, Register r2);                          // compare (r1, r2)        ; int64 <--> int32
1812    // compare immediate
1813   inline void z_chi( Register r1, int64_t i2);                           // compare (r1, i2_imm16)  ; int32
1814   inline void z_cfi( Register r1, int64_t i2);                           // compare (r1, i2_imm32)  ; int32
1815   inline void z_cghi(Register r1, int64_t i2);                           // compare (r1, i2_imm16)  ; int64
1816   inline void z_cgfi(Register r1, int64_t i2);                           // compare (r1, i2_imm32)  ; int64
1817    // compare memory
1818   inline void z_ch(  Register r1, const Address &a);                     // compare (r1, *(a))               ; int32 <--> int16
1819   inline void z_ch(  Register r1, int64_t d2, Register x2, Register b2); // compare (r1, *(d2_uimm12+x2+b2)) ; int32 <--> int16
1820   inline void z_c(   Register r1, const Address &a);                     // compare (r1, *(a))               ; int32
1821   inline void z_c(   Register r1, int64_t d2, Register x2, Register b2); // compare (r1, *(d2_uimm12+x2+b2)) ; int32
1822   inline void z_cy(  Register r1, int64_t d2, Register x2, Register b2); // compare (r1, *(d2_uimm20+x2+b2)) ; int32
1823   inline void z_cy(  Register r1, int64_t d2, Register b2);              // compare (r1, *(d2_uimm20+x2+b2)) ; int32
1824   inline void z_cy(  Register r1, const Address& a);                     // compare (r1, *(a))               ; int32
1825    //inline void z_cgf(Register r1,const Address &a);                    // compare (r1, *(a))               ; int64 <--> int32
1826    //inline void z_cgf(Register r1,int64_t d2, Register x2, Register b2);// compare (r1, *(d2_uimm12+x2+b2)) ; int64 <--> int32
1827   inline void z_cg(  Register r1, const Address &a);                     // compare (r1, *(a))               ; int64
1828   inline void z_cg(  Register r1, int64_t d2, Register x2, Register b2); // compare (r1, *(d2_imm20+x2+b2))  ; int64
1829 
1830    // compare logical instructions
1831    // compare register
1832   inline void z_clr(  Register r1, Register r2);                         // compare (r1, r2)                 ; uint32
1833   inline void z_clgr( Register r1, Register r2);                         // compare (r1, r2)                 ; uint64
1834    // compare immediate
1835   inline void z_clfi( Register r1, int64_t i2);                          // compare (r1, i2_uimm32)          ; uint32
1836   inline void z_clgfi(Register r1, int64_t i2);                          // compare (r1, i2_uimm32)          ; uint64
1837   inline void z_cl(   Register r1, const Address &a);                    // compare (r1, *(a)                ; uint32
1838   inline void z_cl(   Register r1, int64_t d2, Register x2, Register b2);// compare (r1, *(d2_uimm12+x2+b2)  ; uint32
1839   inline void z_cly(  Register r1, int64_t d2, Register x2, Register b2);// compare (r1, *(d2_uimm20+x2+b2)) ; uint32
1840   inline void z_cly(  Register r1, int64_t d2, Register b2);             // compare (r1, *(d2_uimm20+x2+b2)) ; uint32
1841   inline void z_cly(  Register r1, const Address& a);                    // compare (r1, *(a))               ; uint32
1842   inline void z_clg(  Register r1, const Address &a);                    // compare (r1, *(a)                ; uint64
1843   inline void z_clg(  Register r1, int64_t d2, Register x2, Register b2);// compare (r1, *(d2_imm20+x2+b2)   ; uint64
1844 
1845   // test under mask
1846   inline void z_tmll(Register r1, int64_t i2);           // test under mask, see docu
1847   inline void z_tmlh(Register r1, int64_t i2);           // test under mask, see docu
1848   inline void z_tmhl(Register r1, int64_t i2);           // test under mask, see docu
1849   inline void z_tmhh(Register r1, int64_t i2);           // test under mask, see docu
1850 
1851   // branch instructions
1852   inline void z_bc(  branch_condition m1, int64_t d2, Register x2, Register b2);// branch  m1 ? pc = (d2_uimm12+x2+b2)
1853   inline void z_bcr( branch_condition m1, Register r2);                         // branch (m1 && r2!=R0) ? pc = r2
1854   inline void z_brc( branch_condition i1, int64_t i2);                          // branch  i1 ? pc = pc + i2_imm16
1855   inline void z_brc( branch_condition i1, address a);                           // branch  i1 ? pc = a
1856   inline void z_brc( branch_condition i1, Label& L);                            // branch  i1 ? pc = Label
1857   //inline void z_brcl(branch_condition i1, int64_t i2);                        // branch  i1 ? pc = pc + i2_imm32
1858   inline void z_brcl(branch_condition i1, address a);                           // branch  i1 ? pc = a
1859   inline void z_brcl(branch_condition i1, Label& L);                            // branch  i1 ? pc = Label
1860   inline void z_bctgr(Register r1, Register r2);         // branch on count r1 -= 1; (r1!=0) ? pc = r2  ; r1 is int64
1861 
1862   // branch unconditional / always
1863   inline void z_br(Register r2);                         // branch to r2, nop if r2 == Z_R0
1864 
1865 
1866   // See also commodity routines compare64_and_branch(), compare32_and_branch().
1867   // signed comparison and branch
1868   inline void z_crb( Register r1, Register r2, branch_condition m3, int64_t d4, Register b4); // (r1 m3 r2) ? goto b4+d4      ; int32  -- z10
1869   inline void z_cgrb(Register r1, Register r2, branch_condition m3, int64_t d4, Register b4); // (r1 m3 r2) ? goto b4+d4      ; int64  -- z10
1870   inline void z_crj( Register r1, Register r2, branch_condition m3, Label& L);                // (r1 m3 r2) ? goto L          ; int32  -- z10
1871   inline void z_crj( Register r1, Register r2, branch_condition m3, address a4);              // (r1 m3 r2) ? goto (pc+a4<<1) ; int32  -- z10
1872   inline void z_cgrj(Register r1, Register r2, branch_condition m3, Label& L);                // (r1 m3 r2) ? goto L          ; int64  -- z10
1873   inline void z_cgrj(Register r1, Register r2, branch_condition m3, address a4);              // (r1 m3 r2) ? goto (pc+a4<<1) ; int64  -- z10
1874   inline void z_cib( Register r1, int64_t i2, branch_condition m3, int64_t d4, Register b4);  // (r1 m3 i2_imm8) ? goto b4+d4      ; int32  -- z10
1875   inline void z_cgib(Register r1, int64_t i2, branch_condition m3, int64_t d4, Register b4);  // (r1 m3 i2_imm8) ? goto b4+d4      ; int64  -- z10
1876   inline void z_cij( Register r1, int64_t i2, branch_condition m3, Label& L);                 // (r1 m3 i2_imm8) ? goto L          ; int32  -- z10
1877   inline void z_cij( Register r1, int64_t i2, branch_condition m3, address a4);               // (r1 m3 i2_imm8) ? goto (pc+a4<<1) ; int32  -- z10
1878   inline void z_cgij(Register r1, int64_t i2, branch_condition m3, Label& L);                 // (r1 m3 i2_imm8) ? goto L          ; int64  -- z10
1879   inline void z_cgij(Register r1, int64_t i2, branch_condition m3, address a4);               // (r1 m3 i2_imm8) ? goto (pc+a4<<1) ; int64  -- z10
1880   // unsigned comparison and branch
1881   inline void z_clrb( Register r1, Register r2, branch_condition m3, int64_t d4, Register b4);// (r1 m3 r2) ? goto b4+d4      ; uint32  -- z10
1882   inline void z_clgrb(Register r1, Register r2, branch_condition m3, int64_t d4, Register b4);// (r1 m3 r2) ? goto b4+d4      ; uint64  -- z10
1883   inline void z_clrj( Register r1, Register r2, branch_condition m3, Label& L);               // (r1 m3 r2) ? goto L          ; uint32  -- z10
1884   inline void z_clrj( Register r1, Register r2, branch_condition m3, address a4);             // (r1 m3 r2) ? goto (pc+a4<<1) ; uint32  -- z10
1885   inline void z_clgrj(Register r1, Register r2, branch_condition m3, Label& L);               // (r1 m3 r2) ? goto L          ; uint64  -- z10
1886   inline void z_clgrj(Register r1, Register r2, branch_condition m3, address a4);             // (r1 m3 r2) ? goto (pc+a4<<1) ; uint64  -- z10
1887   inline void z_clib( Register r1, int64_t i2, branch_condition m3, int64_t d4, Register b4); // (r1 m3 i2_uimm8) ? goto b4+d4      ; uint32  -- z10
1888   inline void z_clgib(Register r1, int64_t i2, branch_condition m3, int64_t d4, Register b4); // (r1 m3 i2_uimm8) ? goto b4+d4      ; uint64  -- z10
1889   inline void z_clij( Register r1, int64_t i2, branch_condition m3, Label& L);                // (r1 m3 i2_uimm8) ? goto L          ; uint32  -- z10
1890   inline void z_clij( Register r1, int64_t i2, branch_condition m3, address a4);              // (r1 m3 i2_uimm8) ? goto (pc+a4<<1) ; uint32  -- z10
1891   inline void z_clgij(Register r1, int64_t i2, branch_condition m3, Label& L);                // (r1 m3 i2_uimm8) ? goto L          ; uint64  -- z10
1892   inline void z_clgij(Register r1, int64_t i2, branch_condition m3, address a4);              // (r1 m3 i2_uimm8) ? goto (pc+a4<<1) ; uint64  -- z10
1893 
1894   // Compare and trap instructions.
1895   // signed comparison
1896   inline void z_crt(Register r1,  Register r2, int64_t m3);  // (r1 m3 r2)        ? trap ; int32  -- z10
1897   inline void z_cgrt(Register r1, Register r2, int64_t m3);  // (r1 m3 r2)        ? trap ; int64  -- z10
1898   inline void z_cit(Register r1,  int64_t i2, int64_t m3);   // (r1 m3 i2_imm16)  ? trap ; int32  -- z10
1899   inline void z_cgit(Register r1, int64_t i2, int64_t m3);   // (r1 m3 i2_imm16)  ? trap ; int64  -- z10
1900   // unsigned comparison
1901   inline void z_clrt(Register r1,  Register r2, int64_t m3); // (r1 m3 r2)        ? trap ; uint32 -- z10
1902   inline void z_clgrt(Register r1, Register r2, int64_t m3); // (r1 m3 r2)        ? trap ; uint64 -- z10
1903   inline void z_clfit(Register r1,  int64_t i2, int64_t m3); // (r1 m3 i2_uimm16) ? trap ; uint32 -- z10
1904   inline void z_clgit(Register r1, int64_t i2, int64_t m3);  // (r1 m3 i2_uimm16) ? trap ; uint64 -- z10
1905 
1906   inline void z_illtrap();
1907   inline void z_illtrap(int id);
1908   inline void z_illtrap_eyecatcher(unsigned short xpattern, unsigned short pattern);
1909 
1910 
1911   // load address, add for addresses
1912   // ===============================
1913 
1914   // The versions without suffix z assert that the base reg is != Z_R0.
1915   // Z_R0 is interpreted as constant '0'. The variants with Address operand
1916   // check this automatically, so no two versions are needed.
1917   inline void z_layz(Register r1, int64_t d2, Register x2, Register b2); // Special version. Allows Z_R0 as base reg.
1918   inline void z_lay(Register r1, const Address &a);                      // r1 = a
1919   inline void z_lay(Register r1, int64_t d2, Register x2, Register b2);  // r1 = d2_imm20+x2+b2
1920   inline void z_laz(Register r1, int64_t d2, Register x2, Register b2);  // Special version. Allows Z_R0 as base reg.
1921   inline void z_la(Register r1, const Address &a);                       // r1 = a                ; unsigned immediate!
1922   inline void z_la(Register r1, int64_t d2, Register x2, Register b2);   // r1 = d2_uimm12+x2+b2  ; unsigned immediate!
1923   inline void z_larl(Register r1, int64_t i2);                           // r1 = pc + i2_imm32<<1;
1924   inline void z_larl(Register r1, address a2);                           // r1 = pc + i2_imm32<<1;
1925 
1926   // Load instructions for integers
1927   // ==============================
1928 
1929   // Address as base + index + offset
1930   inline void z_lb( Register r1, const Address &a);                     // load r1 = *(a)              ; int32 <- int8
1931   inline void z_lb( Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int32 <- int8
1932   inline void z_lh( Register r1, const Address &a);                     // load r1 = *(a)              ; int32 <- int16
1933   inline void z_lh( Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_uimm12+x2+b2); int32 <- int16
1934   inline void z_lhy(Register r1, const Address &a);                     // load r1 = *(a)              ; int32 <- int16
1935   inline void z_lhy(Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int32 <- int16
1936   inline void z_l(  Register r1, const Address& a);                     // load r1 = *(a)              ; int32
1937   inline void z_l(  Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_uimm12+x2+b2); int32
1938   inline void z_ly( Register r1, const Address& a);                     // load r1 = *(a)              ; int32
1939   inline void z_ly( Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int32
1940 
1941   inline void z_lgb(Register r1, const Address &a);                     // load r1 = *(a)              ; int64 <- int8
1942   inline void z_lgb(Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int64 <- int8
1943   inline void z_lgh(Register r1, const Address &a);                     // load r1 = *(a)              ; int64 <- int16
1944   inline void z_lgh(Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm12+x2+b2) ; int64 <- int16
1945   inline void z_lgf(Register r1, const Address &a);                     // load r1 = *(a)              ; int64 <- int32
1946   inline void z_lgf(Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int64 <- int32
1947   inline void z_lg( Register r1, const Address& a);                     // load r1 = *(a)              ; int64 <- int64
1948   inline void z_lg( Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int64 <- int64
1949 
1950   // load and test
1951   inline void z_lt(  Register r1, const Address &a);                    // load and test r1 = *(a)              ; int32
1952   inline void z_lt(  Register r1, int64_t d2, Register x2, Register b2);// load and test r1 = *(d2_imm20+x2+b2) ; int32
1953   inline void z_ltg( Register r1, const Address &a);                    // load and test r1 = *(a)              ; int64
1954   inline void z_ltg( Register r1, int64_t d2, Register x2, Register b2);// load and test r1 = *(d2_imm20+x2+b2) ; int64
1955   inline void z_ltgf(Register r1, const Address &a);                    // load and test r1 = *(a)              ; int64 <- int32
1956   inline void z_ltgf(Register r1, int64_t d2, Register x2, Register b2);// load and test r1 = *(d2_imm20+x2+b2) ; int64 <- int32
1957 
1958   // load unsigned integer - zero extended
1959   inline void z_llc( Register r1, const Address& a);                    // load r1 = *(a)              ; uint32 <- uint8
1960   inline void z_llc( Register r1, int64_t d2, Register x2, Register b2);// load r1 = *(d2_imm20+x2+b2) ; uint32 <- uint8
1961   inline void z_llh( Register r1, const Address& a);                    // load r1 = *(a)              ; uint32 <- uint16
1962   inline void z_llh( Register r1, int64_t d2, Register x2, Register b2);// load r1 = *(d2_imm20+x2+b2) ; uint32 <- uint16
1963   inline void z_llgc(Register r1, const Address& a);                    // load r1 = *(a)              ; uint64 <- uint8
1964   inline void z_llgc(Register r1, int64_t d2, Register x2, Register b2);// load r1 = *(d2_imm20+x2+b2) ; uint64 <- uint8
1965   inline void z_llgc( Register r1, int64_t d2, Register b2);            // load r1 = *(d2_imm20+b2)    ; uint64 <- uint8
1966   inline void z_llgh(Register r1, const Address& a);                    // load r1 = *(a)              ; uint64 <- uint16
1967   inline void z_llgh(Register r1, int64_t d2, Register x2, Register b2);// load r1 = *(d2_imm20+x2+b2) ; uint64 <- uint16
1968   inline void z_llgf(Register r1, const Address& a);                    // load r1 = *(a)              ; uint64 <- uint32
1969   inline void z_llgf(Register r1, int64_t d2, Register x2, Register b2);// load r1 = *(d2_imm20+x2+b2) ; uint64 <- uint32
1970 
1971   // pc relative addressing
1972   inline void z_lhrl( Register r1, int64_t i2);   // load r1 = *(pc + i2_imm32<<1) ; int32 <- int16    -- z10
1973   inline void z_lrl(  Register r1, int64_t i2);   // load r1 = *(pc + i2_imm32<<1) ; int32             -- z10
1974   inline void z_lghrl(Register r1, int64_t i2);   // load r1 = *(pc + i2_imm32<<1) ; int64 <- int16    -- z10
1975   inline void z_lgfrl(Register r1, int64_t i2);   // load r1 = *(pc + i2_imm32<<1) ; int64 <- int32    -- z10
1976   inline void z_lgrl( Register r1, int64_t i2);   // load r1 = *(pc + i2_imm32<<1) ; int64             -- z10
1977 
1978   inline void z_llhrl( Register r1, int64_t i2);  // load r1 = *(pc + i2_imm32<<1) ; uint32 <- uint16  -- z10
1979   inline void z_llghrl(Register r1, int64_t i2);  // load r1 = *(pc + i2_imm32<<1) ; uint64 <- uint16  -- z10
1980   inline void z_llgfrl(Register r1, int64_t i2);  // load r1 = *(pc + i2_imm32<<1) ; uint64 <- uint32  -- z10
1981 
1982   // Store instructions for integers
1983   // ===============================
1984 
1985   // Address as base + index + offset
1986   inline void z_stc( Register r1, const Address &d);                     // store *(a)               = r1  ; int8
1987   inline void z_stc( Register r1, int64_t d2, Register x2, Register b2); // store *(d2_uimm12+x2+b2) = r1  ; int8
1988   inline void z_stcy(Register r1, const Address &d);                     // store *(a)               = r1  ; int8
1989   inline void z_stcy(Register r1, int64_t d2, Register x2, Register b2); // store *(d2_imm20+x2+b2)  = r1  ; int8
1990   inline void z_sth( Register r1, const Address &d);                     // store *(a)               = r1  ; int16
1991   inline void z_sth( Register r1, int64_t d2, Register x2, Register b2); // store *(d2_uimm12+x2+b2) = r1  ; int16
1992   inline void z_sthy(Register r1, const Address &d);                     // store *(a)               = r1  ; int16
1993   inline void z_sthy(Register r1, int64_t d2, Register x2, Register b2); // store *(d2_imm20+x2+b2)  = r1  ; int16
1994   inline void z_st(  Register r1, const Address &d);                     // store *(a)               = r1  ; int32
1995   inline void z_st(  Register r1, int64_t d2, Register x2, Register b2); // store *(d2_uimm12+x2+b2) = r1  ; int32
1996   inline void z_sty( Register r1, const Address &d);                     // store *(a)               = r1  ; int32
1997   inline void z_sty( Register r1, int64_t d2, Register x2, Register b2); // store *(d2_imm20+x2+b2)  = r1  ; int32
1998   inline void z_stg( Register r1, const Address &d);                     // store *(a)               = r1  ; int64
1999   inline void z_stg( Register r1, int64_t d2, Register x2, Register b2); // store *(d2_uimm12+x2+b2) = r1  ; int64
2000 
2001   inline void z_stcm( Register r1, int64_t m3, int64_t d2, Register b2); // store character under mask
2002   inline void z_stcmy(Register r1, int64_t m3, int64_t d2, Register b2); // store character under mask
2003   inline void z_stcmh(Register r1, int64_t m3, int64_t d2, Register b2); // store character under mask
2004 
2005   // pc relative addressing
2006   inline void z_sthrl(Register r1, int64_t i2);   // store *(pc + i2_imm32<<1) = r1 ; int16  -- z10
2007   inline void z_strl( Register r1, int64_t i2);   // store *(pc + i2_imm32<<1) = r1 ; int32  -- z10
2008   inline void z_stgrl(Register r1, int64_t i2);   // store *(pc + i2_imm32<<1) = r1 ; int64  -- z10
2009 
2010 
2011   // Load and store immediates
2012   // =========================
2013 
2014   // load immediate
2015   inline void z_lhi( Register r1, int64_t i2);                  // r1 = i2_imm16    ; int32 <- int16
2016   inline void z_lghi(Register r1, int64_t i2);                  // r1 = i2_imm16    ; int64 <- int16
2017   inline void z_lgfi(Register r1, int64_t i2);                  // r1 = i2_imm32    ; int64 <- int32
2018 
2019   inline void z_llihf(Register r1, int64_t i2);                 // r1 = i2_imm32    ; uint64 <- (uint32<<32)
2020   inline void z_llilf(Register r1, int64_t i2);                 // r1 = i2_imm32    ; uint64 <- uint32
2021   inline void z_llihh(Register r1, int64_t i2);                 // r1 = i2_imm16    ; uint64 <- (uint16<<48)
2022   inline void z_llihl(Register r1, int64_t i2);                 // r1 = i2_imm16    ; uint64 <- (uint16<<32)
2023   inline void z_llilh(Register r1, int64_t i2);                 // r1 = i2_imm16    ; uint64 <- (uint16<<16)
2024   inline void z_llill(Register r1, int64_t i2);                 // r1 = i2_imm16    ; uint64 <- uint16
2025 
2026   // insert immediate
2027   inline void z_ic(  Register r1, int64_t d2, Register x2, Register b2); // insert character
2028   inline void z_icy( Register r1, int64_t d2, Register x2, Register b2); // insert character
2029   inline void z_icm( Register r1, int64_t m3, int64_t d2, Register b2);  // insert character under mask
2030   inline void z_icmy(Register r1, int64_t m3, int64_t d2, Register b2);  // insert character under mask
2031   inline void z_icmh(Register r1, int64_t m3, int64_t d2, Register b2);  // insert character under mask
2032 
2033   inline void z_iihh(Register r1, int64_t i2);                  // insert immediate  r1[ 0-15] = i2_imm16
2034   inline void z_iihl(Register r1, int64_t i2);                  // insert immediate  r1[16-31] = i2_imm16
2035   inline void z_iilh(Register r1, int64_t i2);                  // insert immediate  r1[32-47] = i2_imm16
2036   inline void z_iill(Register r1, int64_t i2);                  // insert immediate  r1[48-63] = i2_imm16
2037   inline void z_iihf(Register r1, int64_t i2);                  // insert immediate  r1[32-63] = i2_imm32
2038   inline void z_iilf(Register r1, int64_t i2);                  // insert immediate  r1[ 0-31] = i2_imm32
2039 
2040   // store immediate
2041   inline void z_mvhhi(const Address &d, int64_t i2);            // store *(d)           = i2_imm16 ; int16
2042   inline void z_mvhhi(int64_t d1, Register b1, int64_t i2);     // store *(d1_imm12+b1) = i2_imm16 ; int16
2043   inline void z_mvhi( const Address &d, int64_t i2);            // store *(d)           = i2_imm16 ; int32
2044   inline void z_mvhi( int64_t d1, Register b1, int64_t i2);     // store *(d1_imm12+b1) = i2_imm16 ; int32
2045   inline void z_mvghi(const Address &d, int64_t i2);            // store *(d)           = i2_imm16 ; int64
2046   inline void z_mvghi(int64_t d1, Register b1, int64_t i2);     // store *(d1_imm12+b1) = i2_imm16 ; int64
2047 
2048   // Move and Convert instructions
2049   // =============================
2050 
2051   // move, sign extend
2052   inline void z_lbr(Register r1, Register r2);             // move r1 = r2 ; int32  <- int8
2053   inline void z_lhr( Register r1, Register r2);            // move r1 = r2 ; int32  <- int16
2054   inline void z_lr(Register r1, Register r2);              // move r1 = r2 ; int32, no sign extension
2055   inline void z_lgbr(Register r1, Register r2);            // move r1 = r2 ; int64  <- int8
2056   inline void z_lghr(Register r1, Register r2);            // move r1 = r2 ; int64  <- int16
2057   inline void z_lgfr(Register r1, Register r2);            // move r1 = r2 ; int64  <- int32
2058   inline void z_lgr(Register r1, Register r2);             // move r1 = r2 ; int64
2059   // move, zero extend
2060   inline void z_llhr( Register r1, Register r2);           // move r1 = r2 ; uint32 <- uint16
2061   inline void z_llgcr(Register r1, Register r2);           // move r1 = r2 ; uint64 <- uint8
2062   inline void z_llghr(Register r1, Register r2);           // move r1 = r2 ; uint64 <- uint16
2063   inline void z_llgfr(Register r1, Register r2);           // move r1 = r2 ; uint64 <- uint32
2064 
2065   // move and test register
2066   inline void z_ltr(Register r1, Register r2);             // load/move and test r1 = r2; int32
2067   inline void z_ltgr(Register r1, Register r2);            // load/move and test r1 = r2; int64
2068   inline void z_ltgfr(Register r1, Register r2);           // load/move and test r1 = r2; int64 <-- int32
2069 
2070   // move and byte-reverse
2071   inline void z_lrvr( Register r1, Register r2);           // move and reverse byte order r1 = r2; int32
2072   inline void z_lrvgr(Register r1, Register r2);           // move and reverse byte order r1 = r2; int64
2073 
2074 
2075   // Arithmetic instructions (Integer only)
2076   // ======================================
2077   // For float arithmetic instructions scroll further down
2078   // Add logical differs in the condition codes set!
2079 
2080   // add registers
2081   inline void z_ar(   Register r1, Register r2);                      // add         r1 = r1 + r2  ; int32
2082   inline void z_agr(  Register r1, Register r2);                      // add         r1 = r1 + r2  ; int64
2083   inline void z_agfr( Register r1, Register r2);                      // add         r1 = r1 + r2  ; int64 <- int32
2084   inline void z_ark(  Register r1, Register r2, Register r3);         // add         r1 = r2 + r3  ; int32
2085   inline void z_agrk( Register r1, Register r2, Register r3);         // add         r1 = r2 + r3  ; int64
2086 
2087   inline void z_alr(  Register r1, Register r2);                      // add logical r1 = r1 + r2  ; int32
2088   inline void z_algr( Register r1, Register r2);                      // add logical r1 = r1 + r2  ; int64
2089   inline void z_algfr(Register r1, Register r2);                      // add logical r1 = r1 + r2  ; int64 <- int32
2090   inline void z_alrk( Register r1, Register r2, Register r3);         // add logical r1 = r2 + r3  ; int32
2091   inline void z_algrk(Register r1, Register r2, Register r3);         // add logical r1 = r2 + r3  ; int64
2092   inline void z_alcgr(Register r1, Register r2);                      // add logical with carry r1 = r1 + r2 + c  ; int64
2093 
2094   // add immediate
2095   inline void z_ahi(  Register r1, int64_t i2);                       // add         r1 = r1 + i2_imm16 ; int32
2096   inline void z_afi(  Register r1, int64_t i2);                       // add         r1 = r1 + i2_imm32 ; int32
2097   inline void z_alfi( Register r1, int64_t i2);                       // add         r1 = r1 + i2_imm32 ; int32
2098   inline void z_aghi( Register r1, int64_t i2);                       // add logical r1 = r1 + i2_imm16 ; int64
2099   inline void z_agfi( Register r1, int64_t i2);                       // add         r1 = r1 + i2_imm32 ; int64
2100   inline void z_algfi(Register r1, int64_t i2);                       // add logical r1 = r1 + i2_imm32 ; int64
2101   inline void z_ahik( Register r1, Register r3, int64_t i2);          // add         r1 = r3 + i2_imm16 ; int32
2102   inline void z_aghik(Register r1, Register r3, int64_t i2);          // add         r1 = r3 + i2_imm16 ; int64
2103   inline void z_aih(  Register r1, int64_t i2);                       // add         r1 = r1 + i2_imm32 ; int32 (HiWord)
2104 
2105   // add memory
2106   inline void z_a( Register r1, int64_t d2, Register x2, Register b2);  // add r1 = r1 + *(d2_uimm12+s2+b2) ; int32
2107   inline void z_ay(  Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+s2+b2)  ; int32
2108   inline void z_ag(  Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+s2+b2)  ; int64
2109   inline void z_agf( Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+x2+b2)  ; int64 <- int32
2110   inline void z_al(  Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_uimm12+x2+b2) ; int32
2111   inline void z_aly( Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+x2+b2)  ; int32
2112   inline void z_alg( Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+x2+b2)  ; int64
2113   inline void z_algf(Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+x2+b2)  ; int64 <- int32
2114   inline void z_a(   Register r1, const Address& a);                  // add r1 = r1 + *(a)               ; int32
2115   inline void z_ay(  Register r1, const Address& a);                  // add r1 = r1 + *(a)               ; int32
2116   inline void z_al(  Register r1, const Address& a);                  // add r1 = r1 + *(a)               ; int32
2117   inline void z_aly( Register r1, const Address& a);                  // add r1 = r1 + *(a)               ; int32
2118   inline void z_ag(  Register r1, const Address& a);                  // add r1 = r1 + *(a)               ; int64
2119   inline void z_agf( Register r1, const Address& a);                  // add r1 = r1 + *(a)               ; int64 <- int32
2120   inline void z_alg( Register r1, const Address& a);                  // add r1 = r1 + *(a)               ; int64
2121   inline void z_algf(Register r1, const Address& a);                  // add r1 = r1 + *(a)               ; int64 <- int32
2122 
2123 
2124   inline void z_alhsik( Register r1, Register r3, int64_t i2);    // add logical r1 = r3 + i2_imm16   ; int32
2125   inline void z_alghsik(Register r1, Register r3, int64_t i2);    // add logical r1 = r3 + i2_imm16   ; int64
2126 
2127   inline void z_asi(  int64_t d1, Register b1, int64_t i2);       // add           *(d1_imm20+b1) += i2_imm8 ; int32   -- z10
2128   inline void z_agsi( int64_t d1, Register b1, int64_t i2);       // add           *(d1_imm20+b1) += i2_imm8 ; int64   -- z10
2129   inline void z_alsi( int64_t d1, Register b1, int64_t i2);       // add logical   *(d1_imm20+b1) += i2_imm8 ; uint32  -- z10
2130   inline void z_algsi(int64_t d1, Register b1, int64_t i2);       // add logical   *(d1_imm20+b1) += i2_imm8 ; uint64  -- z10
2131   inline void z_asi(  const Address& d, int64_t i2);              // add           *(d) += i2_imm8           ; int32   -- z10
2132   inline void z_agsi( const Address& d, int64_t i2);              // add           *(d) += i2_imm8           ; int64   -- z10
2133   inline void z_alsi( const Address& d, int64_t i2);              // add logical   *(d) += i2_imm8           ; uint32  -- z10
2134   inline void z_algsi(const Address& d, int64_t i2);              // add logical   *(d) += i2_imm8           ; uint64  -- z10
2135 
2136   // sign adjustment
2137   inline void z_lcr(  Register r1, Register r2 = noreg);              // neg r1 = -r2   ; int32
2138   inline void z_lcgr( Register r1, Register r2 = noreg);              // neg r1 = -r2   ; int64
2139   inline void z_lcgfr(Register r1, Register r2);                      // neg r1 = -r2   ; int64 <- int32
2140   inline void z_lnr(  Register r1, Register r2 = noreg);              // neg r1 = -|r2| ; int32
2141   inline void z_lngr( Register r1, Register r2 = noreg);              // neg r1 = -|r2| ; int64
2142   inline void z_lngfr(Register r1, Register r2);                      // neg r1 = -|r2| ; int64 <- int32
2143   inline void z_lpr(  Register r1, Register r2 = noreg);              //     r1 =  |r2| ; int32
2144   inline void z_lpgr( Register r1, Register r2 = noreg);              //     r1 =  |r2| ; int64
2145   inline void z_lpgfr(Register r1, Register r2);                      //     r1 =  |r2| ; int64 <- int32
2146 
2147   // subtract intstructions
2148   // sub registers
2149   inline void z_sr(   Register r1, Register r2);                      // sub         r1 = r1 - r2                ; int32
2150   inline void z_sgr(  Register r1, Register r2);                      // sub         r1 = r1 - r2                ; int64
2151   inline void z_sgfr( Register r1, Register r2);                      // sub         r1 = r1 - r2                ; int64 <- int32
2152   inline void z_srk(  Register r1, Register r2, Register r3);         // sub         r1 = r2 - r3                ; int32
2153   inline void z_sgrk( Register r1, Register r2, Register r3);         // sub         r1 = r2 - r3                ; int64
2154 
2155   inline void z_slr(  Register r1, Register r2);                      // sub logical r1 = r1 - r2                ; int32
2156   inline void z_slgr( Register r1, Register r2);                      // sub logical r1 = r1 - r2                ; int64
2157   inline void z_slgfr(Register r1, Register r2);                      // sub logical r1 = r1 - r2                ; int64 <- int32
2158   inline void z_slrk( Register r1, Register r2, Register r3);         // sub logical r1 = r2 - r3                ; int32
2159   inline void z_slgrk(Register r1, Register r2, Register r3);         // sub logical r1 = r2 - r3                ; int64
2160   inline void z_slfi( Register r1, int64_t i2);                       // sub logical r1 = r1 - i2_uimm32         ; int32
2161   inline void z_slgfi(Register r1, int64_t i2);                       // add logical r1 = r1 - i2_uimm32         ; int64
2162 
2163   // sub memory
2164   inline void z_s(   Register r1, int64_t d2, Register x2, Register b2);  // sub         r1 = r1 - *(d2_imm12+x2+b2) ; int32
2165   inline void z_sy(  Register r1, int64_t d2, Register x2, Register b2);  // sub         r1 = r1 + *(d2_imm20+s2+b2) ; int32
2166   inline void z_sg(  Register r1, int64_t d2, Register x2, Register b2);  // sub         r1 = r1 - *(d2_imm12+x2+b2) ; int64
2167   inline void z_sgf( Register r1, int64_t d2, Register x2, Register b2);  // sub         r1 = r1 - *(d2_imm12+x2+b2) ; int64 - int32
2168   inline void z_slg( Register r1, int64_t d2, Register x2, Register b2);  // sub logical r1 = r1 - *(d2_imm20+x2+b2) ; uint64
2169   inline void z_slgf(Register r1, int64_t d2, Register x2, Register b2);  // sub logical r1 = r1 - *(d2_imm20+x2+b2) ; uint64 - uint32
2170   inline void z_s(   Register r1, const Address& a);                      // sub         r1 = r1 - *(a)              ; int32
2171   inline void z_sy(  Register r1, const Address& a);                      // sub         r1 = r1 - *(a)              ; int32
2172   inline void z_sg(  Register r1, const Address& a);                      // sub         r1 = r1 - *(a)              ; int64
2173   inline void z_sgf( Register r1, const Address& a);                      // sub         r1 = r1 - *(a)              ; int64 - int32
2174   inline void z_slg( Register r1, const Address& a);                      // sub         r1 = r1 - *(a)              ; uint64
2175   inline void z_slgf(Register r1, const Address& a);                      // sub         r1 = r1 - *(a)              ; uint64 - uint32
2176 
2177   inline void z_sh(  Register r1, int64_t d2, Register x2, Register b2);  // sub         r1 = r1 - *(d2_imm12+x2+b2) ; int32 - int16
2178   inline void z_shy( Register r1, int64_t d2, Register x2, Register b2);  // sub         r1 = r1 - *(d2_imm20+x2+b2) ; int32 - int16
2179   inline void z_sh(  Register r1, const Address &a);                      // sub         r1 = r1 - *(d2_imm12+x2+b2) ; int32 - int16
2180   inline void z_shy( Register r1, const Address &a);                      // sub         r1 = r1 - *(d2_imm20+x2+b2) ; int32 - int16
2181 
2182   // Multiplication instructions
2183   // mul registers
2184   inline void z_msr(  Register r1, Register r2);                          // mul r1 = r1 * r2          ; int32
2185   inline void z_msgr( Register r1, Register r2);                          // mul r1 = r1 * r2          ; int64
2186   inline void z_msgfr(Register r1, Register r2);                          // mul r1 = r1 * r2          ; int64 <- int32
2187   inline void z_mlr(  Register r1, Register r2);                          // mul r1 = r1 * r2          ; int32 unsigned
2188   inline void z_mlgr( Register r1, Register r2);                          // mul r1 = r1 * r2          ; int64 unsigned
2189   // mul register - memory
2190   inline void z_mhy( Register r1, int64_t d2, Register x2, Register b2);  // mul r1 = r1 * *(d2+x2+b2)
2191   inline void z_msy( Register r1, int64_t d2, Register x2, Register b2);  // mul r1 = r1 * *(d2+x2+b2)
2192   inline void z_msg( Register r1, int64_t d2, Register x2, Register b2);  // mul r1 = r1 * *(d2+x2+b2)
2193   inline void z_msgf(Register r1, int64_t d2, Register x2, Register b2);  // mul r1 = r1 * *(d2+x2+b2)
2194   inline void z_ml(  Register r1, int64_t d2, Register x2, Register b2);  // mul r1 = r1 * *(d2+x2+b2)
2195   inline void z_mlg( Register r1, int64_t d2, Register x2, Register b2);  // mul r1 = r1 * *(d2+x2+b2)
2196   inline void z_mhy( Register r1, const Address& a);                      // mul r1 = r1 * *(a)
2197   inline void z_msy( Register r1, const Address& a);                      // mul r1 = r1 * *(a)
2198   inline void z_msg( Register r1, const Address& a);                      // mul r1 = r1 * *(a)
2199   inline void z_msgf(Register r1, const Address& a);                      // mul r1 = r1 * *(a)
2200   inline void z_ml(  Register r1, const Address& a);                      // mul r1 = r1 * *(a)
2201   inline void z_mlg( Register r1, const Address& a);                      // mul r1 = r1 * *(a)
2202 
2203   inline void z_msfi( Register r1, int64_t i2);   // mult r1 = r1 * i2_imm32;   int32  -- z10
2204   inline void z_msgfi(Register r1, int64_t i2);   // mult r1 = r1 * i2_imm32;   int64  -- z10
2205   inline void z_mhi(  Register r1, int64_t i2);   // mult r1 = r1 * i2_imm16;   int32
2206   inline void z_mghi( Register r1, int64_t i2);   // mult r1 = r1 * i2_imm16;   int64
2207 
2208   // Division instructions
2209   inline void z_dsgr( Register r1, Register r2);      // div  r1 = r1 / r2               ; int64/int32 needs reg pair!
2210   inline void z_dsgfr(Register r1, Register r2);      // div  r1 = r1 / r2               ; int64/int32 needs reg pair!
2211 
2212 
2213   // Logic instructions
2214   // ===================
2215 
2216   // and
2217   inline void z_n(   Register r1, int64_t d2, Register x2, Register b2);
2218   inline void z_ny(  Register r1, int64_t d2, Register x2, Register b2);
2219   inline void z_ng(  Register r1, int64_t d2, Register x2, Register b2);
2220   inline void z_n(   Register r1, const Address& a);
2221   inline void z_ny(  Register r1, const Address& a);
2222   inline void z_ng(  Register r1, const Address& a);
2223 
2224   inline void z_nr(  Register r1, Register r2);               // and r1 = r1 & r2         ; int32
2225   inline void z_ngr( Register r1, Register r2);               // and r1 = r1 & r2         ; int64
2226   inline void z_nrk( Register r1, Register r2, Register r3);  // and r1 = r2 & r3         ; int32
2227   inline void z_ngrk(Register r1, Register r2, Register r3);  // and r1 = r2 & r3         ; int64
2228 
2229   inline void z_nihh(Register r1, int64_t i2);                // and r1 = r1 & i2_imm16   ; and only for bits  0-15
2230   inline void z_nihl(Register r1, int64_t i2);                // and r1 = r1 & i2_imm16   ; and only for bits 16-31
2231   inline void z_nilh(Register r1, int64_t i2);                // and r1 = r1 & i2_imm16   ; and only for bits 32-47
2232   inline void z_nill(Register r1, int64_t i2);                // and r1 = r1 & i2_imm16   ; and only for bits 48-63
2233   inline void z_nihf(Register r1, int64_t i2);                // and r1 = r1 & i2_imm32   ; and only for bits  0-31
2234   inline void z_nilf(Register r1, int64_t i2);                // and r1 = r1 & i2_imm32   ; and only for bits 32-63  see also MacroAssembler::nilf.
2235 
2236   // or
2237   inline void z_o(   Register r1, int64_t d2, Register x2, Register b2);
2238   inline void z_oy(  Register r1, int64_t d2, Register x2, Register b2);
2239   inline void z_og(  Register r1, int64_t d2, Register x2, Register b2);
2240   inline void z_o(   Register r1, const Address& a);
2241   inline void z_oy(  Register r1, const Address& a);
2242   inline void z_og(  Register r1, const Address& a);
2243 
2244   inline void z_or(  Register r1, Register r2);               // or r1 = r1 | r2; int32
2245   inline void z_ogr( Register r1, Register r2);               // or r1 = r1 | r2; int64
2246   inline void z_ork( Register r1, Register r2, Register r3);  // or r1 = r2 | r3         ; int32
2247   inline void z_ogrk(Register r1, Register r2, Register r3);  // or r1 = r2 | r3         ; int64
2248 
2249   inline void z_oihh(Register r1, int64_t i2);                // or r1 = r1 | i2_imm16   ; or only for bits  0-15
2250   inline void z_oihl(Register r1, int64_t i2);                // or r1 = r1 | i2_imm16   ; or only for bits 16-31
2251   inline void z_oilh(Register r1, int64_t i2);                // or r1 = r1 | i2_imm16   ; or only for bits 32-47
2252   inline void z_oill(Register r1, int64_t i2);                // or r1 = r1 | i2_imm16   ; or only for bits 48-63
2253   inline void z_oihf(Register r1, int64_t i2);                // or r1 = r1 | i2_imm32   ; or only for bits  0-31
2254   inline void z_oilf(Register r1, int64_t i2);                // or r1 = r1 | i2_imm32   ; or only for bits 32-63
2255 
2256   // xor
2257   inline void z_x(   Register r1, int64_t d2, Register x2, Register b2);
2258   inline void z_xy(  Register r1, int64_t d2, Register x2, Register b2);
2259   inline void z_xg(  Register r1, int64_t d2, Register x2, Register b2);
2260   inline void z_x(   Register r1, const Address& a);
2261   inline void z_xy(  Register r1, const Address& a);
2262   inline void z_xg(  Register r1, const Address& a);
2263 
2264   inline void z_xr(  Register r1, Register r2);               // xor r1 = r1 ^ r2         ; int32
2265   inline void z_xgr( Register r1, Register r2);               // xor r1 = r1 ^ r2         ; int64
2266   inline void z_xrk( Register r1, Register r2, Register r3);  // xor r1 = r2 ^ r3         ; int32
2267   inline void z_xgrk(Register r1, Register r2, Register r3);  // xor r1 = r2 ^ r3         ; int64
2268 
2269   inline void z_xihf(Register r1, int64_t i2);                // xor r1 = r1 ^ i2_imm32   ; or only for bits  0-31
2270   inline void z_xilf(Register r1, int64_t i2);                // xor r1 = r1 ^ i2_imm32   ; or only for bits 32-63
2271 
2272   // shift
2273   inline void z_sla( Register r1,              int64_t d2, Register b2=Z_R0); // shift left  r1 = r1 << ((d2+b2)&0x3f) ; int32, only 31 bits shifted, sign preserved!
2274   inline void z_slak(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift left  r1 = r3 << ((d2+b2)&0x3f) ; int32, only 31 bits shifted, sign preserved!
2275   inline void z_slag(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift left  r1 = r3 << ((d2+b2)&0x3f) ; int64, only 63 bits shifted, sign preserved!
2276   inline void z_sra( Register r1,              int64_t d2, Register b2=Z_R0); // shift right r1 = r1 >> ((d2+b2)&0x3f) ; int32, sign extended
2277   inline void z_srak(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift right r1 = r3 >> ((d2+b2)&0x3f) ; int32, sign extended
2278   inline void z_srag(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift right r1 = r3 >> ((d2+b2)&0x3f) ; int64, sign extended
2279   inline void z_sll( Register r1,              int64_t d2, Register b2=Z_R0); // shift left  r1 = r1 << ((d2+b2)&0x3f) ; int32, zeros added
2280   inline void z_sllk(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift left  r1 = r3 << ((d2+b2)&0x3f) ; int32, zeros added
2281   inline void z_sllg(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift left  r1 = r3 << ((d2+b2)&0x3f) ; int64, zeros added
2282   inline void z_srl( Register r1,              int64_t d2, Register b2=Z_R0); // shift right r1 = r1 >> ((d2+b2)&0x3f) ; int32, zero extended
2283   inline void z_srlk(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift right r1 = r3 >> ((d2+b2)&0x3f) ; int32, zero extended
2284   inline void z_srlg(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift right r1 = r3 >> ((d2+b2)&0x3f) ; int64, zero extended
2285 
2286   // rotate
2287   inline void z_rll( Register r1, Register r3, int64_t d2, Register b2=Z_R0); // rot r1 = r3 << (d2+b2 & 0x3f) ; int32  -- z10
2288   inline void z_rllg(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // rot r1 = r3 << (d2+b2 & 0x3f) ; int64  -- z10
2289 
2290   // rotate the AND/XOR/OR/insert
2291   inline void z_rnsbg( Register r1, Register r2, int64_t spos3, int64_t epos4, int64_t nrot5, bool test_only = false); // rotate then AND selected bits  -- z196
2292   inline void z_rxsbg( Register r1, Register r2, int64_t spos3, int64_t epos4, int64_t nrot5, bool test_only = false); // rotate then XOR selected bits  -- z196
2293   inline void z_rosbg( Register r1, Register r2, int64_t spos3, int64_t epos4, int64_t nrot5, bool test_only = false); // rotate then OR  selected bits  -- z196
2294   inline void z_risbg( Register r1, Register r2, int64_t spos3, int64_t epos4, int64_t nrot5, bool zero_rest = false); // rotate then INS selected bits  -- z196
2295 
2296 
2297   // memory-immediate instructions (8-bit immediate)
2298   // ===============================================
2299 
2300   inline void z_cli( int64_t d1, Register b1, int64_t i2); // compare *(d1_imm12+b1) ^= i2_imm8           ; int8
2301   inline void z_mvi( int64_t d1, Register b1, int64_t i2); // store   *(d1_imm12+b1)  = i2_imm8           ; int8
2302   inline void z_tm(  int64_t d1, Register b1, int64_t i2); // test    *(d1_imm12+b1) against mask i2_imm8 ; int8
2303   inline void z_ni(  int64_t d1, Register b1, int64_t i2); // store   *(d1_imm12+b1) &= i2_imm8           ; int8
2304   inline void z_oi(  int64_t d1, Register b1, int64_t i2); // store   *(d1_imm12+b1) |= i2_imm8           ; int8
2305   inline void z_xi(  int64_t d1, Register b1, int64_t i2); // store   *(d1_imm12+b1) ^= i2_imm8           ; int8
2306   inline void z_cliy(int64_t d1, Register b1, int64_t i2); // compare *(d1_imm12+b1) ^= i2_imm8           ; int8
2307   inline void z_mviy(int64_t d1, Register b1, int64_t i2); // store   *(d1_imm12+b1)  = i2_imm8           ; int8
2308   inline void z_tmy( int64_t d1, Register b1, int64_t i2); // test    *(d1_imm12+b1) against mask i2_imm8 ; int8
2309   inline void z_niy( int64_t d1, Register b1, int64_t i2); // store   *(d1_imm12+b1) &= i2_imm8           ; int8
2310   inline void z_oiy( int64_t d1, Register b1, int64_t i2); // store   *(d1_imm12+b1) |= i2_imm8           ; int8
2311   inline void z_xiy( int64_t d1, Register b1, int64_t i2); // store   *(d1_imm12+b1) ^= i2_imm8           ; int8
2312   inline void z_cli( const Address& a, int64_t imm8);      // compare *(a)           ^= imm8              ; int8
2313   inline void z_mvi( const Address& a, int64_t imm8);      // store   *(a)            = imm8              ; int8
2314   inline void z_tm(  const Address& a, int64_t imm8);      // test    *(a)           against mask imm8    ; int8
2315   inline void z_ni(  const Address& a, int64_t imm8);      // store   *(a)           &= imm8              ; int8
2316   inline void z_oi(  const Address& a, int64_t imm8);      // store   *(a)           |= imm8              ; int8
2317   inline void z_xi(  const Address& a, int64_t imm8);      // store   *(a)           ^= imm8              ; int8
2318   inline void z_cliy(const Address& a, int64_t imm8);      // compare *(a)           ^= imm8              ; int8
2319   inline void z_mviy(const Address& a, int64_t imm8);      // store   *(a)            = imm8              ; int8
2320   inline void z_tmy( const Address& a, int64_t imm8);      // test    *(a)           against mask imm8    ; int8
2321   inline void z_niy( const Address& a, int64_t imm8);      // store   *(a)           &= imm8              ; int8
2322   inline void z_oiy( const Address& a, int64_t imm8);      // store   *(a)           |= imm8              ; int8
2323   inline void z_xiy( const Address& a, int64_t imm8);      // store   *(a)           ^= imm8              ; int8
2324 
2325 
2326   //------------------------------
2327   // Interlocked-Update
2328   //------------------------------
2329   inline void z_laa(  Register r1, Register r3, int64_t d2, Register b2);   // load and add    int32, signed   -- z196
2330   inline void z_laag( Register r1, Register r3, int64_t d2, Register b2);   // load and add    int64, signed   -- z196
2331   inline void z_laal( Register r1, Register r3, int64_t d2, Register b2);   // load and add    int32, unsigned -- z196
2332   inline void z_laalg(Register r1, Register r3, int64_t d2, Register b2);   // load and add    int64, unsigned -- z196
2333   inline void z_lan(  Register r1, Register r3, int64_t d2, Register b2);   // load and and    int32           -- z196
2334   inline void z_lang( Register r1, Register r3, int64_t d2, Register b2);   // load and and    int64           -- z196
2335   inline void z_lax(  Register r1, Register r3, int64_t d2, Register b2);   // load and xor    int32           -- z196
2336   inline void z_laxg( Register r1, Register r3, int64_t d2, Register b2);   // load and xor    int64           -- z196
2337   inline void z_lao(  Register r1, Register r3, int64_t d2, Register b2);   // load and or     int32           -- z196
2338   inline void z_laog( Register r1, Register r3, int64_t d2, Register b2);   // load and or     int64           -- z196
2339 
2340   inline void z_laa(  Register r1, Register r3, const Address& a);          // load and add    int32, signed   -- z196
2341   inline void z_laag( Register r1, Register r3, const Address& a);          // load and add    int64, signed   -- z196
2342   inline void z_laal( Register r1, Register r3, const Address& a);          // load and add    int32, unsigned -- z196
2343   inline void z_laalg(Register r1, Register r3, const Address& a);          // load and add    int64, unsigned -- z196
2344   inline void z_lan(  Register r1, Register r3, const Address& a);          // load and and    int32           -- z196
2345   inline void z_lang( Register r1, Register r3, const Address& a);          // load and and    int64           -- z196
2346   inline void z_lax(  Register r1, Register r3, const Address& a);          // load and xor    int32           -- z196
2347   inline void z_laxg( Register r1, Register r3, const Address& a);          // load and xor    int64           -- z196
2348   inline void z_lao(  Register r1, Register r3, const Address& a);          // load and or     int32           -- z196
2349   inline void z_laog( Register r1, Register r3, const Address& a);          // load and or     int64           -- z196
2350 
2351   //--------------------------------
2352   // Execution Prediction
2353   //--------------------------------
2354   inline void z_pfd(  int64_t m1, int64_t d2, Register x2, Register b2);  // prefetch
2355   inline void z_pfd(  int64_t m1, Address a);
2356   inline void z_pfdrl(int64_t m1, int64_t i2);                            // prefetch
2357   inline void z_bpp(  int64_t m1, int64_t i2, int64_t d3, Register b3);   // branch prediction    -- EC12
2358   inline void z_bprp( int64_t m1, int64_t i2, int64_t i3);                // branch prediction    -- EC12
2359 
2360   //-------------------------------
2361   // Transaction Control
2362   //-------------------------------
2363   inline void z_tbegin(int64_t d1, Register b1, int64_t i2);          // begin transaction               -- EC12
2364   inline void z_tbeginc(int64_t d1, Register b1, int64_t i2);         // begin transaction (constrained) -- EC12
2365   inline void z_tend();                                               // end transaction                 -- EC12
2366   inline void z_tabort(int64_t d2, Register b2);                      // abort transaction               -- EC12
2367   inline void z_etnd(Register r1);                                    // extract tx nesting depth        -- EC12
2368   inline void z_ppa(Register r1, Register r2, int64_t m3);            // perform processor assist        -- EC12
2369 
2370   //---------------------------------
2371   // Conditional Execution
2372   //---------------------------------
2373   inline void z_locr( Register r1, Register r2, branch_condition cc);             // if (cc) load r1 = r2               ; int32 -- z196
2374   inline void z_locgr(Register r1, Register r2, branch_condition cc);             // if (cc) load r1 = r2               ; int64 -- z196
2375   inline void z_loc(  Register r1, int64_t d2, Register b2, branch_condition cc); // if (cc) load r1 = *(d2_simm20+b2)  ; int32 -- z196
2376   inline void z_locg( Register r1, int64_t d2, Register b2, branch_condition cc); // if (cc) load r1 = *(d2_simm20+b2)  ; int64 -- z196
2377   inline void z_loc(  Register r1, const Address& a, branch_condition cc);        // if (cc) load r1 = *(a)             ; int32 -- z196
2378   inline void z_locg( Register r1, const Address& a, branch_condition cc);        // if (cc) load r1 = *(a)             ; int64 -- z196
2379   inline void z_stoc( Register r1, int64_t d2, Register b2, branch_condition cc); // if (cc) store *(d2_simm20+b2) = r1 ; int32 -- z196
2380   inline void z_stocg(Register r1, int64_t d2, Register b2, branch_condition cc); // if (cc) store *(d2_simm20+b2) = r1 ; int64 -- z196
2381 
2382 
2383   // Complex CISC instructions
2384   // ==========================
2385 
2386   inline void z_cksm(Register r1, Register r2);                       // checksum. This is NOT CRC32
2387   inline void z_km(  Register r1, Register r2);                       // cipher message
2388   inline void z_kmc( Register r1, Register r2);                       // cipher message with chaining
2389   inline void z_kimd(Register r1, Register r2);                       // msg digest (SHA)
2390   inline void z_klmd(Register r1, Register r2);                       // msg digest (SHA)
2391   inline void z_kmac(Register r1, Register r2);                       // msg authentication code
2392 
2393   inline void z_ex(Register r1, int64_t d2, Register x2, Register b2);// execute
2394   inline void z_exrl(Register r1, int64_t i2);                        // execute relative long         -- z10
2395   inline void z_exrl(Register r1, address a2);                        // execute relative long         -- z10
2396 
2397   inline void z_ectg(int64_t d1, Register b1, int64_t d2, Register b2, Register r3);  // extract cpu time
2398   inline void z_ecag(Register r1, Register r3, int64_t d2, Register b2);              // extract CPU attribute
2399 
2400   inline void z_srst(Register r1, Register r2);                       // search string
2401   inline void z_srstu(Register r1, Register r2);                      // search string unicode
2402 
2403   inline void z_mvc(const Address& d, const Address& s, int64_t l);               // move l bytes
2404   inline void z_mvc(int64_t d1, int64_t l, Register b1, int64_t d2, Register b2); // move l+1 bytes
2405   inline void z_mvcle(Register r1, Register r3, int64_t d2, Register b2=Z_R0);    // move region of memory
2406 
2407   inline void z_stfle(int64_t d2, Register b2);                            // store facility list extended
2408 
2409   inline void z_nc(int64_t d1, int64_t l, Register b1, int64_t d2, Register b2);// and *(d1+b1) = *(d1+l+b1) & *(d2+b2) ; d1, d2: uimm12, ands l+1 bytes
2410   inline void z_oc(int64_t d1, int64_t l, Register b1, int64_t d2, Register b2);//  or *(d1+b1) = *(d1+l+b1) | *(d2+b2) ; d1, d2: uimm12,  ors l+1 bytes
2411   inline void z_xc(int64_t d1, int64_t l, Register b1, int64_t d2, Register b2);// xor *(d1+b1) = *(d1+l+b1) ^ *(d2+b2) ; d1, d2: uimm12, xors l+1 bytes
2412   inline void z_nc(Address dst, int64_t len, Address src2);                     // and *dst = *dst & *src2, ands len bytes in memory
2413   inline void z_oc(Address dst, int64_t len, Address src2);                     //  or *dst = *dst | *src2,  ors len bytes in memory
2414   inline void z_xc(Address dst, int64_t len, Address src2);                     // xor *dst = *dst ^ *src2, xors len bytes in memory
2415 
2416   // compare instructions
2417   inline void z_clc(int64_t d1, int64_t l, Register b1, int64_t d2, Register b2);  // compare (*(d1_uimm12+b1), *(d1_uimm12+b1)) ; compare l bytes
2418   inline void z_clcle(Register r1, Register r3, int64_t d2, Register b2);  // compare logical long extended, see docu
2419   inline void z_clclu(Register r1, Register r3, int64_t d2, Register b2);  // compare logical long unicode, see docu
2420 
2421   // Translate characters
2422   inline void z_troo(Register r1, Register r2, int64_t m3);
2423   inline void z_trot(Register r1, Register r2, int64_t m3);
2424   inline void z_trto(Register r1, Register r2, int64_t m3);
2425   inline void z_trtt(Register r1, Register r2, int64_t m3);
2426 
2427 
2428   //---------------------------
2429   //--  Vector Instructions  --
2430   //---------------------------
2431 
2432   //---<  Vector Support Instructions  >---
2433 
2434   // Load (transfer from memory)
2435   inline void z_vlm(   VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2436   inline void z_vl(    VectorRegister v1, int64_t d2, Register x2, Register b2);
2437   inline void z_vleb(  VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
2438   inline void z_vleh(  VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
2439   inline void z_vlef(  VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
2440   inline void z_vleg(  VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
2441 
2442   // Gather/Scatter
2443   inline void z_vgef(  VectorRegister v1, int64_t d2, VectorRegister vx2, Register b2, int64_t m3);
2444   inline void z_vgeg(  VectorRegister v1, int64_t d2, VectorRegister vx2, Register b2, int64_t m3);
2445 
2446   inline void z_vscef( VectorRegister v1, int64_t d2, VectorRegister vx2, Register b2, int64_t m3);
2447   inline void z_vsceg( VectorRegister v1, int64_t d2, VectorRegister vx2, Register b2, int64_t m3);
2448 
2449   // load and replicate
2450   inline void z_vlrep( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
2451   inline void z_vlrepb(VectorRegister v1, int64_t d2, Register x2, Register b2);
2452   inline void z_vlreph(VectorRegister v1, int64_t d2, Register x2, Register b2);
2453   inline void z_vlrepf(VectorRegister v1, int64_t d2, Register x2, Register b2);
2454   inline void z_vlrepg(VectorRegister v1, int64_t d2, Register x2, Register b2);
2455 
2456   inline void z_vllez( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
2457   inline void z_vllezb(VectorRegister v1, int64_t d2, Register x2, Register b2);
2458   inline void z_vllezh(VectorRegister v1, int64_t d2, Register x2, Register b2);
2459   inline void z_vllezf(VectorRegister v1, int64_t d2, Register x2, Register b2);
2460   inline void z_vllezg(VectorRegister v1, int64_t d2, Register x2, Register b2);
2461 
2462   inline void z_vlbb(  VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
2463   inline void z_vll(   VectorRegister v1, Register r3, int64_t d2, Register b2);
2464 
2465   // Load (register to register)
2466   inline void z_vlr(   VectorRegister v1, VectorRegister v2);
2467 
2468   inline void z_vlgv(  Register r1, VectorRegister v3, int64_t d2, Register b2, int64_t m4);
2469   inline void z_vlgvb( Register r1, VectorRegister v3, int64_t d2, Register b2);
2470   inline void z_vlgvh( Register r1, VectorRegister v3, int64_t d2, Register b2);
2471   inline void z_vlgvf( Register r1, VectorRegister v3, int64_t d2, Register b2);
2472   inline void z_vlgvg( Register r1, VectorRegister v3, int64_t d2, Register b2);
2473 
2474   inline void z_vlvg(  VectorRegister v1, Register r3, int64_t d2, Register b2, int64_t m4);
2475   inline void z_vlvgb( VectorRegister v1, Register r3, int64_t d2, Register b2);
2476   inline void z_vlvgh( VectorRegister v1, Register r3, int64_t d2, Register b2);
2477   inline void z_vlvgf( VectorRegister v1, Register r3, int64_t d2, Register b2);
2478   inline void z_vlvgg( VectorRegister v1, Register r3, int64_t d2, Register b2);
2479 
2480   inline void z_vlvgp( VectorRegister v1, Register r2, Register r3);
2481 
2482   // vector register pack
2483   inline void z_vpk(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2484   inline void z_vpkh(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2485   inline void z_vpkf(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2486   inline void z_vpkg(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2487 
2488   inline void z_vpks(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4, int64_t cc5);
2489   inline void z_vpksh( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2490   inline void z_vpksf( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2491   inline void z_vpksg( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2492   inline void z_vpkshs(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2493   inline void z_vpksfs(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2494   inline void z_vpksgs(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2495 
2496   inline void z_vpkls(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4, int64_t cc5);
2497   inline void z_vpklsh( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2498   inline void z_vpklsf( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2499   inline void z_vpklsg( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2500   inline void z_vpklshs(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2501   inline void z_vpklsfs(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2502   inline void z_vpklsgs(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2503 
2504   // vector register unpack (sign-extended)
2505   inline void z_vuph(   VectorRegister v1, VectorRegister v2, int64_t m3);
2506   inline void z_vuphb(  VectorRegister v1, VectorRegister v2);
2507   inline void z_vuphh(  VectorRegister v1, VectorRegister v2);
2508   inline void z_vuphf(  VectorRegister v1, VectorRegister v2);
2509   inline void z_vupl(   VectorRegister v1, VectorRegister v2, int64_t m3);
2510   inline void z_vuplb(  VectorRegister v1, VectorRegister v2);
2511   inline void z_vuplh(  VectorRegister v1, VectorRegister v2);
2512   inline void z_vuplf(  VectorRegister v1, VectorRegister v2);
2513 
2514   // vector register unpack (zero-extended)
2515   inline void z_vuplh(  VectorRegister v1, VectorRegister v2, int64_t m3);
2516   inline void z_vuplhb( VectorRegister v1, VectorRegister v2);
2517   inline void z_vuplhh( VectorRegister v1, VectorRegister v2);
2518   inline void z_vuplhf( VectorRegister v1, VectorRegister v2);
2519   inline void z_vupll(  VectorRegister v1, VectorRegister v2, int64_t m3);
2520   inline void z_vupllb( VectorRegister v1, VectorRegister v2);
2521   inline void z_vupllh( VectorRegister v1, VectorRegister v2);
2522   inline void z_vupllf( VectorRegister v1, VectorRegister v2);
2523 
2524   // vector register merge high/low
2525   inline void z_vmrh( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2526   inline void z_vmrhb(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2527   inline void z_vmrhh(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2528   inline void z_vmrhf(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2529   inline void z_vmrhg(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2530 
2531   inline void z_vmrl( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2532   inline void z_vmrlb(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2533   inline void z_vmrlh(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2534   inline void z_vmrlf(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2535   inline void z_vmrlg(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2536 
2537   // vector register permute
2538   inline void z_vperm( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);
2539   inline void z_vpdi(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t        m4);
2540 
2541   // vector register replicate
2542   inline void z_vrep(  VectorRegister v1, VectorRegister v3, int64_t imm2, int64_t m4);
2543   inline void z_vrepb( VectorRegister v1, VectorRegister v3, int64_t imm2);
2544   inline void z_vreph( VectorRegister v1, VectorRegister v3, int64_t imm2);
2545   inline void z_vrepf( VectorRegister v1, VectorRegister v3, int64_t imm2);
2546   inline void z_vrepg( VectorRegister v1, VectorRegister v3, int64_t imm2);
2547   inline void z_vrepi( VectorRegister v1, int64_t imm2,      int64_t m3);
2548   inline void z_vrepib(VectorRegister v1, int64_t imm2);
2549   inline void z_vrepih(VectorRegister v1, int64_t imm2);
2550   inline void z_vrepif(VectorRegister v1, int64_t imm2);
2551   inline void z_vrepig(VectorRegister v1, int64_t imm2);
2552 
2553   inline void z_vsel(  VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);
2554   inline void z_vseg(  VectorRegister v1, VectorRegister v2, int64_t imm3);
2555 
2556   // Load (immediate)
2557   inline void z_vleib( VectorRegister v1, int64_t imm2, int64_t m3);
2558   inline void z_vleih( VectorRegister v1, int64_t imm2, int64_t m3);
2559   inline void z_vleif( VectorRegister v1, int64_t imm2, int64_t m3);
2560   inline void z_vleig( VectorRegister v1, int64_t imm2, int64_t m3);
2561 
2562   // Store
2563   inline void z_vstm(  VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2564   inline void z_vst(   VectorRegister v1, int64_t d2, Register x2, Register b2);
2565   inline void z_vsteb( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
2566   inline void z_vsteh( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
2567   inline void z_vstef( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
2568   inline void z_vsteg( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
2569   inline void z_vstl(  VectorRegister v1, Register r3, int64_t d2, Register b2);
2570 
2571   // Misc
2572   inline void z_vgm(   VectorRegister v1, int64_t imm2, int64_t imm3, int64_t m4);
2573   inline void z_vgmb(  VectorRegister v1, int64_t imm2, int64_t imm3);
2574   inline void z_vgmh(  VectorRegister v1, int64_t imm2, int64_t imm3);
2575   inline void z_vgmf(  VectorRegister v1, int64_t imm2, int64_t imm3);
2576   inline void z_vgmg(  VectorRegister v1, int64_t imm2, int64_t imm3);
2577 
2578   inline void z_vgbm(  VectorRegister v1, int64_t imm2);
2579   inline void z_vzero( VectorRegister v1); // preferred method to set vreg to all zeroes
2580   inline void z_vone(  VectorRegister v1); // preferred method to set vreg to all ones
2581 
2582   //---<  Vector Arithmetic Instructions  >---
2583 
2584   // Load
2585   inline void z_vlc(    VectorRegister v1, VectorRegister v2, int64_t m3);
2586   inline void z_vlcb(   VectorRegister v1, VectorRegister v2);
2587   inline void z_vlch(   VectorRegister v1, VectorRegister v2);
2588   inline void z_vlcf(   VectorRegister v1, VectorRegister v2);
2589   inline void z_vlcg(   VectorRegister v1, VectorRegister v2);
2590   inline void z_vlp(    VectorRegister v1, VectorRegister v2, int64_t m3);
2591   inline void z_vlpb(   VectorRegister v1, VectorRegister v2);
2592   inline void z_vlph(   VectorRegister v1, VectorRegister v2);
2593   inline void z_vlpf(   VectorRegister v1, VectorRegister v2);
2594   inline void z_vlpg(   VectorRegister v1, VectorRegister v2);
2595 
2596   // ADD
2597   inline void z_va(     VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2598   inline void z_vab(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
2599   inline void z_vah(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
2600   inline void z_vaf(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
2601   inline void z_vag(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
2602   inline void z_vaq(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
2603   inline void z_vacc(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2604   inline void z_vaccb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2605   inline void z_vacch(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2606   inline void z_vaccf(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2607   inline void z_vaccg(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2608   inline void z_vaccq(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2609 
2610   // SUB
2611   inline void z_vs(     VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2612   inline void z_vsb(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
2613   inline void z_vsh(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
2614   inline void z_vsf(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
2615   inline void z_vsg(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
2616   inline void z_vsq(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
2617   inline void z_vscbi(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2618   inline void z_vscbib( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2619   inline void z_vscbih( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2620   inline void z_vscbif( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2621   inline void z_vscbig( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2622   inline void z_vscbiq( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2623 
2624   // MULTIPLY
2625   inline void z_vml(    VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2626   inline void z_vmh(    VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2627   inline void z_vmlh(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2628   inline void z_vme(    VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2629   inline void z_vmle(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2630   inline void z_vmo(    VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2631   inline void z_vmlo(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2632 
2633   // MULTIPLY & ADD
2634   inline void z_vmal(   VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);
2635   inline void z_vmah(   VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);
2636   inline void z_vmalh(  VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);
2637   inline void z_vmae(   VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);
2638   inline void z_vmale(  VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);
2639   inline void z_vmao(   VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);
2640   inline void z_vmalo(  VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);
2641 
2642   // VECTOR SUM
2643   inline void z_vsum(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2644   inline void z_vsumb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2645   inline void z_vsumh(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2646   inline void z_vsumg(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2647   inline void z_vsumgh( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2648   inline void z_vsumgf( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2649   inline void z_vsumq(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2650   inline void z_vsumqf( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2651   inline void z_vsumqg( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2652 
2653   // Average
2654   inline void z_vavg(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2655   inline void z_vavgb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2656   inline void z_vavgh(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2657   inline void z_vavgf(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2658   inline void z_vavgg(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2659   inline void z_vavgl(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2660   inline void z_vavglb( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2661   inline void z_vavglh( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2662   inline void z_vavglf( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2663   inline void z_vavglg( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2664 
2665   // VECTOR Galois Field Multiply Sum
2666   inline void z_vgfm(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2667   inline void z_vgfmb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2668   inline void z_vgfmh(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2669   inline void z_vgfmf(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2670   inline void z_vgfmg(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2671   // VECTOR Galois Field Multiply Sum and Accumulate
2672   inline void z_vgfma(  VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);
2673   inline void z_vgfmab( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);
2674   inline void z_vgfmah( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);
2675   inline void z_vgfmaf( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);
2676   inline void z_vgfmag( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);
2677 
2678   //---<  Vector Logical Instructions  >---
2679 
2680   // AND
2681   inline void z_vn(     VectorRegister v1, VectorRegister v2, VectorRegister v3);
2682   inline void z_vnc(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
2683 
2684   // XOR
2685   inline void z_vx(     VectorRegister v1, VectorRegister v2, VectorRegister v3);
2686 
2687   // NOR
2688   inline void z_vno(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
2689 
2690   // OR
2691   inline void z_vo(     VectorRegister v1, VectorRegister v2, VectorRegister v3);
2692 
2693   // Comparison (element-wise)
2694   inline void z_vceq(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4, int64_t cc5);
2695   inline void z_vceqb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2696   inline void z_vceqh(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2697   inline void z_vceqf(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2698   inline void z_vceqg(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2699   inline void z_vceqbs( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2700   inline void z_vceqhs( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2701   inline void z_vceqfs( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2702   inline void z_vceqgs( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2703   inline void z_vch(    VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4, int64_t cc5);
2704   inline void z_vchb(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
2705   inline void z_vchh(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
2706   inline void z_vchf(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
2707   inline void z_vchg(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
2708   inline void z_vchbs(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2709   inline void z_vchhs(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2710   inline void z_vchfs(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2711   inline void z_vchgs(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2712   inline void z_vchl(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4, int64_t cc5);
2713   inline void z_vchlb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2714   inline void z_vchlh(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2715   inline void z_vchlf(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2716   inline void z_vchlg(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2717   inline void z_vchlbs( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2718   inline void z_vchlhs( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2719   inline void z_vchlfs( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2720   inline void z_vchlgs( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2721 
2722   // Max/Min (element-wise)
2723   inline void z_vmx(    VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2724   inline void z_vmxb(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
2725   inline void z_vmxh(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
2726   inline void z_vmxf(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
2727   inline void z_vmxg(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
2728   inline void z_vmxl(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2729   inline void z_vmxlb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2730   inline void z_vmxlh(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2731   inline void z_vmxlf(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2732   inline void z_vmxlg(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2733   inline void z_vmn(    VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2734   inline void z_vmnb(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
2735   inline void z_vmnh(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
2736   inline void z_vmnf(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
2737   inline void z_vmng(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
2738   inline void z_vmnl(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
2739   inline void z_vmnlb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2740   inline void z_vmnlh(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2741   inline void z_vmnlf(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2742   inline void z_vmnlg(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2743 
2744   // Leading/Trailing Zeros, population count
2745   inline void z_vclz(   VectorRegister v1, VectorRegister v2, int64_t m3);
2746   inline void z_vclzb(  VectorRegister v1, VectorRegister v2);
2747   inline void z_vclzh(  VectorRegister v1, VectorRegister v2);
2748   inline void z_vclzf(  VectorRegister v1, VectorRegister v2);
2749   inline void z_vclzg(  VectorRegister v1, VectorRegister v2);
2750   inline void z_vctz(   VectorRegister v1, VectorRegister v2, int64_t m3);
2751   inline void z_vctzb(  VectorRegister v1, VectorRegister v2);
2752   inline void z_vctzh(  VectorRegister v1, VectorRegister v2);
2753   inline void z_vctzf(  VectorRegister v1, VectorRegister v2);
2754   inline void z_vctzg(  VectorRegister v1, VectorRegister v2);
2755   inline void z_vpopct( VectorRegister v1, VectorRegister v2, int64_t m3);
2756 
2757   // Rotate/Shift
2758   inline void z_verllv( VectorRegister v1, VectorRegister v2, VectorRegister v3,               int64_t m4);
2759   inline void z_verllvb(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2760   inline void z_verllvh(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2761   inline void z_verllvf(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2762   inline void z_verllvg(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2763   inline void z_verll(  VectorRegister v1, VectorRegister v3, int64_t d2, Register b2,         int64_t m4);
2764   inline void z_verllb( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2765   inline void z_verllh( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2766   inline void z_verllf( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2767   inline void z_verllg( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2768   inline void z_verim(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4, int64_t m5);
2769   inline void z_verimb( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4);
2770   inline void z_verimh( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4);
2771   inline void z_verimf( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4);
2772   inline void z_verimg( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4);
2773 
2774   inline void z_veslv(  VectorRegister v1, VectorRegister v2, VectorRegister v3,               int64_t m4);
2775   inline void z_veslvb( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2776   inline void z_veslvh( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2777   inline void z_veslvf( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2778   inline void z_veslvg( VectorRegister v1, VectorRegister v2, VectorRegister v3);
2779   inline void z_vesl(   VectorRegister v1, VectorRegister v3, int64_t d2, Register b2,         int64_t m4);
2780   inline void z_veslb(  VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2781   inline void z_veslh(  VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2782   inline void z_veslf(  VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2783   inline void z_veslg(  VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2784 
2785   inline void z_vesrav( VectorRegister v1, VectorRegister v2, VectorRegister v3,               int64_t m4);
2786   inline void z_vesravb(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2787   inline void z_vesravh(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2788   inline void z_vesravf(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2789   inline void z_vesravg(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2790   inline void z_vesra(  VectorRegister v1, VectorRegister v3, int64_t d2, Register b2,         int64_t m4);
2791   inline void z_vesrab( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2792   inline void z_vesrah( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2793   inline void z_vesraf( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2794   inline void z_vesrag( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2795   inline void z_vesrlv( VectorRegister v1, VectorRegister v2, VectorRegister v3,               int64_t m4);
2796   inline void z_vesrlvb(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2797   inline void z_vesrlvh(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2798   inline void z_vesrlvf(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2799   inline void z_vesrlvg(VectorRegister v1, VectorRegister v2, VectorRegister v3);
2800   inline void z_vesrl(  VectorRegister v1, VectorRegister v3, int64_t d2, Register b2,         int64_t m4);
2801   inline void z_vesrlb( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2802   inline void z_vesrlh( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2803   inline void z_vesrlf( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2804   inline void z_vesrlg( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
2805 
2806   inline void z_vsl(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
2807   inline void z_vslb(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
2808   inline void z_vsldb(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4);
2809 
2810   inline void z_vsra(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
2811   inline void z_vsrab(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2812   inline void z_vsrl(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
2813   inline void z_vsrlb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
2814 
2815   // Test under Mask
2816   inline void z_vtm(    VectorRegister v1, VectorRegister v2);
2817 
2818   //---<  Vector String Instructions  >---
2819   inline void z_vfae(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4, int64_t cc5);   // Find any element
2820   inline void z_vfaeb(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
2821   inline void z_vfaeh(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
2822   inline void z_vfaef(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
2823   inline void z_vfee(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4, int64_t cc5);   // Find element equal
2824   inline void z_vfeeb(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
2825   inline void z_vfeeh(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
2826   inline void z_vfeef(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
2827   inline void z_vfene(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4, int64_t cc5);   // Find element not equal
2828   inline void z_vfeneb( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
2829   inline void z_vfeneh( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
2830   inline void z_vfenef( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
2831   inline void z_vstrc(  VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t imm5, int64_t cc6);   // String range compare
2832   inline void z_vstrcb( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t cc6);
2833   inline void z_vstrch( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t cc6);
2834   inline void z_vstrcf( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t cc6);
2835   inline void z_vistr(  VectorRegister v1, VectorRegister v2, int64_t imm3, int64_t cc5);                      // Isolate String
2836   inline void z_vistrb( VectorRegister v1, VectorRegister v2, int64_t cc5);
2837   inline void z_vistrh( VectorRegister v1, VectorRegister v2, int64_t cc5);
2838   inline void z_vistrf( VectorRegister v1, VectorRegister v2, int64_t cc5);
2839   inline void z_vistrbs(VectorRegister v1, VectorRegister v2);
2840   inline void z_vistrhs(VectorRegister v1, VectorRegister v2);
2841   inline void z_vistrfs(VectorRegister v1, VectorRegister v2);
2842 
2843 
2844   // Floatingpoint instructions
2845   // ==========================
2846 
2847   // compare instructions
2848   inline void z_cebr(FloatRegister r1, FloatRegister r2);                     // compare (r1, r2)                ; float
2849   inline void z_ceb(FloatRegister r1, int64_t d2, Register x2, Register b2);  // compare (r1, *(d2_imm12+x2+b2)) ; float
2850   inline void z_ceb(FloatRegister r1, const Address &a);                      // compare (r1, *(d2_imm12+x2+b2)) ; float
2851   inline void z_cdbr(FloatRegister r1, FloatRegister r2);                     // compare (r1, r2)                ; double
2852   inline void z_cdb(FloatRegister r1, int64_t d2, Register x2, Register b2);  // compare (r1, *(d2_imm12+x2+b2)) ; double
2853   inline void z_cdb(FloatRegister r1, const Address &a);                      // compare (r1, *(d2_imm12+x2+b2)) ; double
2854 
2855   // load instructions
2856   inline void z_le( FloatRegister r1, int64_t d2, Register x2, Register b2);   // load r1 = *(d2_uimm12+x2+b2) ; float
2857   inline void z_ley(FloatRegister r1, int64_t d2, Register x2, Register b2);   // load r1 = *(d2_imm20+x2+b2)  ; float
2858   inline void z_ld( FloatRegister r1, int64_t d2, Register x2, Register b2);   // load r1 = *(d2_uimm12+x2+b2) ; double
2859   inline void z_ldy(FloatRegister r1, int64_t d2, Register x2, Register b2);   // load r1 = *(d2_imm20+x2+b2)  ; double
2860   inline void z_le( FloatRegister r1, const Address &a);                       // load r1 = *(a)               ; float
2861   inline void z_ley(FloatRegister r1, const Address &a);                       // load r1 = *(a)               ; float
2862   inline void z_ld( FloatRegister r1, const Address &a);                       // load r1 = *(a)               ; double
2863   inline void z_ldy(FloatRegister r1, const Address &a);                       // load r1 = *(a)               ; double
2864 
2865   // store instructions
2866   inline void z_ste( FloatRegister r1, int64_t d2, Register x2, Register b2);  // store *(d2_uimm12+x2+b2) = r1  ; float
2867   inline void z_stey(FloatRegister r1, int64_t d2, Register x2, Register b2);  // store *(d2_imm20+x2+b2)  = r1  ; float
2868   inline void z_std( FloatRegister r1, int64_t d2, Register x2, Register b2);  // store *(d2_uimm12+x2+b2) = r1  ; double
2869   inline void z_stdy(FloatRegister r1, int64_t d2, Register x2, Register b2);  // store *(d2_imm20+x2+b2)  = r1  ; double
2870   inline void z_ste( FloatRegister r1, const Address &a);                      // store *(a)               = r1  ; float
2871   inline void z_stey(FloatRegister r1, const Address &a);                      // store *(a)               = r1  ; float
2872   inline void z_std( FloatRegister r1, const Address &a);                      // store *(a)               = r1  ; double
2873   inline void z_stdy(FloatRegister r1, const Address &a);                      // store *(a)               = r1  ; double
2874 
2875   // load and store immediates
2876   inline void z_lzer(FloatRegister r1);                                 // r1 = 0     ; single
2877   inline void z_lzdr(FloatRegister r1);                                 // r1 = 0     ; double
2878 
2879   // Move and Convert instructions
2880   inline void z_ler(FloatRegister r1, FloatRegister r2);                // move         r1 = r2 ; float
2881   inline void z_ldr(FloatRegister r1, FloatRegister r2);                // move         r1 = r2 ; double
2882   inline void z_ledbr(FloatRegister r1, FloatRegister r2);              // conv / round r1 = r2 ; float <- double
2883   inline void z_ldebr(FloatRegister r1, FloatRegister r2);              // conv         r1 = r2 ; double <- float
2884 
2885   // move between integer and float registers
2886   inline void z_cefbr( FloatRegister r1, Register r2);                  // r1 = r2; float  <-- int32
2887   inline void z_cdfbr( FloatRegister r1, Register r2);                  // r1 = r2; double <-- int32
2888   inline void z_cegbr( FloatRegister r1, Register r2);                  // r1 = r2; float  <-- int64
2889   inline void z_cdgbr( FloatRegister r1, Register r2);                  // r1 = r2; double <-- int64
2890 
2891   // rounding mode for float-2-int conversions
2892   inline void z_cfebr(Register r1, FloatRegister r2, RoundingMode m);   // conv r1 = r2  ; int32 <-- float
2893   inline void z_cfdbr(Register r1, FloatRegister r2, RoundingMode m);   // conv r1 = r2  ; int32 <-- double
2894   inline void z_cgebr(Register r1, FloatRegister r2, RoundingMode m);   // conv r1 = r2  ; int64 <-- float
2895   inline void z_cgdbr(Register r1, FloatRegister r2, RoundingMode m);   // conv r1 = r2  ; int64 <-- double
2896 
2897   inline void z_ldgr(FloatRegister r1, Register r2);   // fr1 = r2  ; what kind of conversion?  -- z10
2898   inline void z_lgdr(Register r1, FloatRegister r2);   // r1  = fr2 ; what kind of conversion?  -- z10
2899 
2900 
2901   // ADD
2902   inline void z_aebr(FloatRegister f1, FloatRegister f2);                      // f1 = f1 + f2               ; float
2903   inline void z_adbr(FloatRegister f1, FloatRegister f2);                      // f1 = f1 + f2               ; double
2904   inline void z_aeb( FloatRegister f1, int64_t d2, Register x2, Register b2);  // f1 = f1 + *(d2+x2+b2)      ; float
2905   inline void z_adb( FloatRegister f1, int64_t d2, Register x2, Register b2);  // f1 = f1 + *(d2+x2+b2)      ; double
2906   inline void z_aeb( FloatRegister f1, const Address& a);                      // f1 = f1 + *(a)             ; float
2907   inline void z_adb( FloatRegister f1, const Address& a);                      // f1 = f1 + *(a)             ; double
2908 
2909   // SUB
2910   inline void z_sebr(FloatRegister f1, FloatRegister f2);                      // f1 = f1 - f2               ; float
2911   inline void z_sdbr(FloatRegister f1, FloatRegister f2);                      // f1 = f1 - f2               ; double
2912   inline void z_seb( FloatRegister f1, int64_t d2, Register x2, Register b2);  // f1 = f1 - *(d2+x2+b2)      ; float
2913   inline void z_sdb( FloatRegister f1, int64_t d2, Register x2, Register b2);  // f1 = f1 - *(d2+x2+b2)      ; double
2914   inline void z_seb( FloatRegister f1, const Address& a);                      // f1 = f1 - *(a)             ; float
2915   inline void z_sdb( FloatRegister f1, const Address& a);                      // f1 = f1 - *(a)             ; double
2916   // negate
2917   inline void z_lcebr(FloatRegister r1, FloatRegister r2);                     // neg r1 = -r2   ; float
2918   inline void z_lcdbr(FloatRegister r1, FloatRegister r2);                     // neg r1 = -r2   ; double
2919 
2920   // Absolute value, monadic if fr2 == noreg.
2921   inline void z_lpdbr( FloatRegister fr1, FloatRegister fr2 = fnoreg);         // fr1 = |fr2|
2922 
2923 
2924   // MUL
2925   inline void z_meebr(FloatRegister f1, FloatRegister f2);                      // f1 = f1 * f2               ; float
2926   inline void z_mdbr( FloatRegister f1, FloatRegister f2);                      // f1 = f1 * f2               ; double
2927   inline void z_meeb( FloatRegister f1, int64_t d2, Register x2, Register b2);  // f1 = f1 * *(d2+x2+b2)      ; float
2928   inline void z_mdb(  FloatRegister f1, int64_t d2, Register x2, Register b2);  // f1 = f1 * *(d2+x2+b2)      ; double
2929   inline void z_meeb( FloatRegister f1, const Address& a);
2930   inline void z_mdb(  FloatRegister f1, const Address& a);
2931 
2932   // MUL-ADD
2933   inline void z_maebr(FloatRegister f1, FloatRegister f3, FloatRegister f2);    // f1 = f3 * f2 + f1          ; float
2934   inline void z_madbr(FloatRegister f1, FloatRegister f3, FloatRegister f2);    // f1 = f3 * f2 + f1          ; double
2935   inline void z_msebr(FloatRegister f1, FloatRegister f3, FloatRegister f2);    // f1 = f3 * f2 - f1          ; float
2936   inline void z_msdbr(FloatRegister f1, FloatRegister f3, FloatRegister f2);    // f1 = f3 * f2 - f1          ; double
2937   inline void z_maeb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) + f1 ; float
2938   inline void z_madb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) + f1 ; double
2939   inline void z_mseb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) - f1 ; float
2940   inline void z_msdb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) - f1 ; double
2941   inline void z_maeb(FloatRegister f1, FloatRegister f3, const Address& a);
2942   inline void z_madb(FloatRegister f1, FloatRegister f3, const Address& a);
2943   inline void z_mseb(FloatRegister f1, FloatRegister f3, const Address& a);
2944   inline void z_msdb(FloatRegister f1, FloatRegister f3, const Address& a);
2945 
2946   // DIV
2947   inline void z_debr( FloatRegister f1, FloatRegister f2);                      // f1 = f1 / f2               ; float
2948   inline void z_ddbr( FloatRegister f1, FloatRegister f2);                      // f1 = f1 / f2               ; double
2949   inline void z_deb(  FloatRegister f1, int64_t d2, Register x2, Register b2);  // f1 = f1 / *(d2+x2+b2)      ; float
2950   inline void z_ddb(  FloatRegister f1, int64_t d2, Register x2, Register b2);  // f1 = f1 / *(d2+x2+b2)      ; double
2951   inline void z_deb(  FloatRegister f1, const Address& a);                      // f1 = f1 / *(a)             ; float
2952   inline void z_ddb(  FloatRegister f1, const Address& a);                      // f1 = f1 / *(a)             ; double
2953 
2954   // square root
2955   inline void z_sqdbr(FloatRegister fr1, FloatRegister fr2);                    // fr1 = sqrt(fr2)            ; double
2956   inline void z_sqdb( FloatRegister fr1, int64_t d2, Register x2, Register b2); // fr1 = srqt( *(d2+x2+b2)
2957   inline void z_sqdb( FloatRegister fr1, int64_t d2, Register b2);              // fr1 = srqt( *(d2+b2)
2958 
2959   // Nop instruction
2960   // ===============
2961 
2962   // branch never (nop)
2963   inline void z_nop();
2964   inline void nop(); // Used by shared code.
2965 
2966   // ===============================================================================================
2967 
2968   // Simplified emitters:
2969   // ====================
2970 
2971 
2972   // Some memory instructions without index register (just convenience).
2973   inline void z_layz(Register r1, int64_t d2, Register b2 = Z_R0);
2974   inline void z_lay(Register r1, int64_t d2, Register b2);
2975   inline void z_laz(Register r1, int64_t d2, Register b2);
2976   inline void z_la(Register r1, int64_t d2, Register b2);
2977   inline void z_l(Register r1, int64_t d2, Register b2);
2978   inline void z_ly(Register r1, int64_t d2, Register b2);
2979   inline void z_lg(Register r1, int64_t d2, Register b2);
2980   inline void z_st(Register r1, int64_t d2, Register b2);
2981   inline void z_sty(Register r1, int64_t d2, Register b2);
2982   inline void z_stg(Register r1, int64_t d2, Register b2);
2983   inline void z_lgf(Register r1, int64_t d2, Register b2);
2984   inline void z_lgh(Register r1, int64_t d2, Register b2);
2985   inline void z_llgh(Register r1, int64_t d2, Register b2);
2986   inline void z_llgf(Register r1, int64_t d2, Register b2);
2987   inline void z_lgb(Register r1, int64_t d2, Register b2);
2988   inline void z_cl( Register r1, int64_t d2, Register b2);
2989   inline void z_c(Register r1, int64_t d2, Register b2);
2990   inline void z_cg(Register r1, int64_t d2, Register b2);
2991   inline void z_sh(Register r1, int64_t d2, Register b2);
2992   inline void z_shy(Register r1, int64_t d2, Register b2);
2993   inline void z_ste(FloatRegister r1, int64_t d2, Register b2);
2994   inline void z_std(FloatRegister r1, int64_t d2, Register b2);
2995   inline void z_stdy(FloatRegister r1, int64_t d2, Register b2);
2996   inline void z_stey(FloatRegister r1, int64_t d2, Register b2);
2997   inline void z_ld(FloatRegister r1, int64_t d2, Register b2);
2998   inline void z_ldy(FloatRegister r1, int64_t d2, Register b2);
2999   inline void z_le(FloatRegister r1, int64_t d2, Register b2);
3000   inline void z_ley(FloatRegister r1, int64_t d2, Register b2);
3001 
3002   inline void z_agf(Register r1, int64_t d2, Register b2);
3003 
3004   inline void z_exrl(Register r1, Label& L);
3005   inline void z_larl(Register r1, Label& L);
3006   inline void z_bru( Label& L);
3007   inline void z_brul(Label& L);
3008   inline void z_brul(address a);
3009   inline void z_brh( Label& L);
3010   inline void z_brl( Label& L);
3011   inline void z_bre( Label& L);
3012   inline void z_brnh(Label& L);
3013   inline void z_brnl(Label& L);
3014   inline void z_brne(Label& L);
3015   inline void z_brz( Label& L);
3016   inline void z_brnz(Label& L);
3017   inline void z_brnaz(Label& L);
3018   inline void z_braz(Label& L);
3019   inline void z_brnp(Label& L);
3020 
3021   inline void z_btrue( Label& L);
3022   inline void z_bfalse(Label& L);
3023 
3024   inline void z_bvat(Label& L);   // all true
3025   inline void z_bvnt(Label& L);   // not all true (mixed or all false)
3026   inline void z_bvmix(Label& L);  // mixed true and false
3027   inline void z_bvaf(Label& L);   // not all false (mixed or all true)
3028   inline void z_bvnf(Label& L);   // all false
3029 
3030   inline void z_brno( Label& L);
3031 
3032 
3033   inline void z_basr(Register r1, Register r2);
3034   inline void z_brasl(Register r1, address a);
3035   inline void z_brct(Register r1, address a);
3036   inline void z_brct(Register r1, Label& L);
3037 
3038   inline void z_brxh(Register r1, Register r3, address a);
3039   inline void z_brxh(Register r1, Register r3, Label& L);
3040 
3041   inline void z_brxle(Register r1, Register r3, address a);
3042   inline void z_brxle(Register r1, Register r3, Label& L);
3043 
3044   inline void z_brxhg(Register r1, Register r3, address a);
3045   inline void z_brxhg(Register r1, Register r3, Label& L);
3046 
3047   inline void z_brxlg(Register r1, Register r3, address a);
3048   inline void z_brxlg(Register r1, Register r3, Label& L);
3049 
3050   // Ppopulation count intrinsics.
3051   inline void z_flogr(Register r1, Register r2);    // find leftmost one
3052   inline void z_popcnt(Register r1, Register r2);   // population count
3053   inline void z_ahhhr(Register r1, Register r2, Register r3);   // ADD halfword high high
3054   inline void z_ahhlr(Register r1, Register r2, Register r3);   // ADD halfword high low
3055 
3056   inline void z_tam();
3057   inline void z_stckf(int64_t d2, Register b2);
3058   inline void z_stm( Register r1, Register r3, int64_t d2, Register b2);
3059   inline void z_stmy(Register r1, Register r3, int64_t d2, Register b2);
3060   inline void z_stmg(Register r1, Register r3, int64_t d2, Register b2);
3061   inline void z_lm( Register r1, Register r3, int64_t d2, Register b2);
3062   inline void z_lmy(Register r1, Register r3, int64_t d2, Register b2);
3063   inline void z_lmg(Register r1, Register r3, int64_t d2, Register b2);
3064 
3065   inline void z_cs( Register r1, Register r3, int64_t d2, Register b2);
3066   inline void z_csy(Register r1, Register r3, int64_t d2, Register b2);
3067   inline void z_csg(Register r1, Register r3, int64_t d2, Register b2);
3068   inline void z_cs( Register r1, Register r3, const Address& a);
3069   inline void z_csy(Register r1, Register r3, const Address& a);
3070   inline void z_csg(Register r1, Register r3, const Address& a);
3071 
3072   inline void z_cvd(Register r1, int64_t d2, Register x2, Register b2);
3073   inline void z_cvdg(Register r1, int64_t d2, Register x2, Register b2);
3074   inline void z_cvd(Register r1, int64_t d2, Register b2);
3075   inline void z_cvdg(Register r1, int64_t d2, Register b2);
3076 
3077   // Instruction queries:
3078   // instruction properties and recognize emitted instructions
3079   // ===========================================================
3080 
nop_size()3081   static int nop_size() { return 2; }
3082 
z_brul_size()3083   static int z_brul_size() { return 6; }
3084 
is_z_basr(short x)3085   static bool is_z_basr(short x) {
3086     return (BASR_ZOPC == (x & BASR_MASK));
3087   }
is_z_algr(long x)3088   static bool is_z_algr(long x) {
3089     return (ALGR_ZOPC == (x & RRE_MASK));
3090   }
is_z_lb(long x)3091   static bool is_z_lb(long x) {
3092     return (LB_ZOPC == (x & LB_MASK));
3093   }
is_z_lh(int x)3094   static bool is_z_lh(int x) {
3095     return (LH_ZOPC == (x & LH_MASK));
3096   }
is_z_l(int x)3097   static bool is_z_l(int x) {
3098     return (L_ZOPC == (x & L_MASK));
3099   }
is_z_lgr(long x)3100   static bool is_z_lgr(long x) {
3101     return (LGR_ZOPC == (x & RRE_MASK));
3102   }
is_z_ly(long x)3103   static bool is_z_ly(long x) {
3104     return (LY_ZOPC == (x & LY_MASK));
3105   }
is_z_lg(long x)3106   static bool is_z_lg(long x) {
3107     return (LG_ZOPC == (x & LG_MASK));
3108   }
is_z_llgh(long x)3109   static bool is_z_llgh(long x) {
3110     return (LLGH_ZOPC == (x & LLGH_MASK));
3111   }
is_z_llgf(long x)3112   static bool is_z_llgf(long x) {
3113     return (LLGF_ZOPC == (x & LLGF_MASK));
3114   }
is_z_le(int x)3115   static bool is_z_le(int x) {
3116     return (LE_ZOPC == (x & LE_MASK));
3117   }
is_z_ld(int x)3118   static bool is_z_ld(int x) {
3119     return (LD_ZOPC == (x & LD_MASK));
3120   }
is_z_st(int x)3121   static bool is_z_st(int x) {
3122     return (ST_ZOPC == (x & ST_MASK));
3123   }
is_z_stc(int x)3124   static bool is_z_stc(int x) {
3125     return (STC_ZOPC == (x & STC_MASK));
3126   }
is_z_stg(long x)3127   static bool is_z_stg(long x) {
3128     return (STG_ZOPC == (x & STG_MASK));
3129   }
is_z_sth(int x)3130   static bool is_z_sth(int x) {
3131     return (STH_ZOPC == (x & STH_MASK));
3132   }
is_z_ste(int x)3133   static bool is_z_ste(int x) {
3134     return (STE_ZOPC == (x & STE_MASK));
3135   }
is_z_std(int x)3136   static bool is_z_std(int x) {
3137     return (STD_ZOPC == (x & STD_MASK));
3138   }
is_z_slag(long x)3139   static bool is_z_slag(long x) {
3140     return (SLAG_ZOPC == (x & SLAG_MASK));
3141   }
is_z_tmy(long x)3142   static bool is_z_tmy(long x) {
3143     return (TMY_ZOPC == (x & TMY_MASK));
3144   }
is_z_tm(long x)3145   static bool is_z_tm(long x) {
3146     return ((unsigned int)TM_ZOPC == (x & (unsigned int)TM_MASK));
3147   }
is_z_bcr(long x)3148   static bool is_z_bcr(long x) {
3149     return (BCR_ZOPC == (x & BCR_MASK));
3150   }
is_z_nop(long x)3151   static bool is_z_nop(long x) {
3152     return is_z_bcr(x) && ((x & 0x00ff) == 0);
3153   }
is_z_nop(address x)3154   static bool is_z_nop(address x) {
3155     return is_z_nop(* (short *) x);
3156   }
is_z_br(long x)3157   static bool is_z_br(long x) {
3158     return is_z_bcr(x) && ((x & 0x00f0) == 0x00f0);
3159   }
is_z_brc(long x,int cond)3160   static bool is_z_brc(long x, int cond) {
3161     return ((unsigned int)BRC_ZOPC == (x & BRC_MASK)) && ((cond<<20) == (x & 0x00f00000U));
3162   }
3163   // Make use of lightweight sync.
is_z_sync_full(long x)3164   static bool is_z_sync_full(long x) {
3165     return is_z_bcr(x) && (((x & 0x00f0)>>4)==bcondFullSync) && ((x & 0x000f)==0x0000);
3166   }
is_z_sync_light(long x)3167   static bool is_z_sync_light(long x) {
3168     return is_z_bcr(x) && (((x & 0x00f0)>>4)==bcondLightSync) && ((x & 0x000f)==0x0000);
3169   }
is_z_sync(long x)3170   static bool is_z_sync(long x) {
3171     return is_z_sync_full(x) || is_z_sync_light(x);
3172   }
3173 
is_z_brasl(long x)3174   static bool is_z_brasl(long x) {
3175     return (BRASL_ZOPC == (x & BRASL_MASK));
3176   }
is_z_brasl(address a)3177   static bool is_z_brasl(address a) {
3178   long x = (*((long *)a))>>16;
3179    return is_z_brasl(x);
3180   }
is_z_larl(long x)3181   static bool is_z_larl(long x) {
3182     return (LARL_ZOPC == (x & LARL_MASK));
3183   }
is_z_lgrl(long x)3184   static bool is_z_lgrl(long x) {
3185     return (LGRL_ZOPC == (x & LGRL_MASK));
3186   }
is_z_lgrl(address a)3187   static bool is_z_lgrl(address a) {
3188   long x = (*((long *)a))>>16;
3189    return is_z_lgrl(x);
3190   }
3191 
is_z_lghi(unsigned long x)3192   static bool is_z_lghi(unsigned long x) {
3193     return (unsigned int)LGHI_ZOPC == (x & (unsigned int)LGHI_MASK);
3194   }
3195 
is_z_llill(unsigned long x)3196   static bool is_z_llill(unsigned long x) {
3197     return (unsigned int)LLILL_ZOPC == (x & (unsigned int)LLI_MASK);
3198   }
is_z_llilh(unsigned long x)3199   static bool is_z_llilh(unsigned long x) {
3200     return (unsigned int)LLILH_ZOPC == (x & (unsigned int)LLI_MASK);
3201   }
is_z_llihl(unsigned long x)3202   static bool is_z_llihl(unsigned long x) {
3203     return (unsigned int)LLIHL_ZOPC == (x & (unsigned int)LLI_MASK);
3204   }
is_z_llihh(unsigned long x)3205   static bool is_z_llihh(unsigned long x) {
3206     return (unsigned int)LLIHH_ZOPC == (x & (unsigned int)LLI_MASK);
3207   }
is_z_llilf(unsigned long x)3208   static bool is_z_llilf(unsigned long x) {
3209     return LLILF_ZOPC == (x & LLIF_MASK);
3210   }
is_z_llihf(unsigned long x)3211   static bool is_z_llihf(unsigned long x) {
3212     return LLIHF_ZOPC == (x & LLIF_MASK);
3213   }
3214 
is_z_iill(unsigned long x)3215   static bool is_z_iill(unsigned long x) {
3216     return (unsigned int)IILL_ZOPC == (x & (unsigned int)II_MASK);
3217   }
is_z_iilh(unsigned long x)3218   static bool is_z_iilh(unsigned long x) {
3219     return (unsigned int)IILH_ZOPC == (x & (unsigned int)II_MASK);
3220   }
is_z_iihl(unsigned long x)3221   static bool is_z_iihl(unsigned long x) {
3222     return (unsigned int)IIHL_ZOPC == (x & (unsigned int)II_MASK);
3223   }
is_z_iihh(unsigned long x)3224   static bool is_z_iihh(unsigned long x) {
3225     return (unsigned int)IIHH_ZOPC == (x & (unsigned int)II_MASK);
3226   }
is_z_iilf(unsigned long x)3227   static bool is_z_iilf(unsigned long x) {
3228     return IILF_ZOPC == (x & IIF_MASK);
3229   }
is_z_iihf(unsigned long x)3230   static bool is_z_iihf(unsigned long x) {
3231     return IIHF_ZOPC == (x & IIF_MASK);
3232   }
3233 
3234   static inline bool is_equal(unsigned long inst, unsigned long idef);
3235   static inline bool is_equal(unsigned long inst, unsigned long idef, unsigned long imask);
3236   static inline bool is_equal(address iloc, unsigned long idef);
3237   static inline bool is_equal(address iloc, unsigned long idef, unsigned long imask);
3238 
3239   static inline bool is_sigtrap_range_check(address pc);
3240   static inline bool is_sigtrap_zero_check(address pc);
3241 
3242   //-----------------
3243   // memory barriers
3244   //-----------------
3245   // machine barrier instructions:
3246   //
3247   // - z_sync            Two-way memory barrier, aka fence.
3248   //                     Only load-after-store-order is not guaranteed in the
3249   //                     z/Architecture memory model, i.e. only 'fence' is needed.
3250   //
3251   // semantic barrier instructions:
3252   // (as defined in orderAccess.hpp)
3253   //
3254   // - z_release         orders Store|Store,   empty implementation
3255   //                            Load|Store
3256   // - z_acquire         orders Load|Store,    empty implementation
3257   //                            Load|Load
3258   // - z_fence           orders Store|Store,   implemented as z_sync.
3259   //                            Load|Store,
3260   //                            Load|Load,
3261   //                            Store|Load
3262   //
3263   // For this implementation to be correct, we need H/W fixes on (very) old H/W:
3264   //          For z990, it is Driver-55:  MCL232 in the J13484 (i390/ML) Stream.
3265   //          For z9,   it is Driver-67:  MCL065 in the G40963 (i390/ML) Stream.
3266   // These drivers are a prereq. Otherwise, memory synchronization will not work.
3267 
3268   inline void z_sync();
3269   inline void z_release();
3270   inline void z_acquire();
3271   inline void z_fence();
3272 
3273   // Creation
Assembler(CodeBuffer * code)3274   Assembler(CodeBuffer* code) : AbstractAssembler(code) { }
3275 
3276 };
3277 
3278 #endif // CPU_S390_ASSEMBLER_S390_HPP
3279