Path: blob/master/src/hotspot/cpu/s390/assembler_s390.hpp
40930 views
/*1* Copyright (c) 2016, 2021, Oracle and/or its affiliates. All rights reserved.2* Copyright (c) 2016, 2021 SAP SE. All rights reserved.3* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.4*5* This code is free software; you can redistribute it and/or modify it6* under the terms of the GNU General Public License version 2 only, as7* published by the Free Software Foundation.8*9* This code is distributed in the hope that it will be useful, but WITHOUT10* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or11* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License12* version 2 for more details (a copy is included in the LICENSE file that13* accompanied this code).14*15* You should have received a copy of the GNU General Public License version16* 2 along with this work; if not, write to the Free Software Foundation,17* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.18*19* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA20* or visit www.oracle.com if you need additional information or have any21* questions.22*23*/2425#ifndef CPU_S390_ASSEMBLER_S390_HPP26#define CPU_S390_ASSEMBLER_S390_HPP2728#undef LUCY_DBG2930// Immediate is an abstraction to represent the various immediate31// operands which exist on z/Architecture. Neither this class nor32// instances hereof have an own state. It consists of methods only.33class Immediate {3435public:36static bool is_simm(int64_t x, unsigned int nbits) {37// nbits < 2 --> false38// nbits >= 64 --> true39assert(2 <= nbits && nbits < 64, "Don't call, use statically known result.");40const int64_t min = -(1L << (nbits-1));41const int64_t maxplus1 = (1L << (nbits-1));42return min <= x && x < maxplus1;43}44static bool is_simm32(int64_t x) {45return is_simm(x, 32);46}47static bool is_simm20(int64_t x) {48return is_simm(x, 20);49}50static bool is_simm16(int64_t x) {51return is_simm(x, 16);52}53static bool is_simm8(int64_t x) {54return is_simm(x, 8);55}5657// Test if x is within signed immediate range for nbits.58static bool is_uimm(int64_t x, unsigned int nbits) {59// nbits == 0 --> false60// nbits >= 64 --> true61assert(1 <= nbits && nbits < 64, "don't call, use statically known result");62const uint64_t xu = (unsigned long)x;63const uint64_t maxplus1 = 1UL << nbits;64return xu < maxplus1; // Unsigned comparison. Negative inputs appear to be very large.65}66static bool is_uimm32(int64_t x) {67return is_uimm(x, 32);68}69static bool is_uimm16(int64_t x) {70return is_uimm(x, 16);71}72static bool is_uimm12(int64_t x) {73return is_uimm(x, 12);74}75static bool is_uimm8(int64_t x) {76return is_uimm(x, 8);77}78};7980// Displacement is an abstraction to represent the various81// displacements which exist with addresses on z/ArchiTecture.82// Neither this class nor instances hereof have an own state. It83// consists of methods only.84class Displacement {8586public: // These tests are used outside the (Macro)Assembler world, e.g. in ad-file.8788static bool is_longDisp(int64_t x) { // Fits in a 20-bit displacement field.89return Immediate::is_simm20(x);90}91static bool is_shortDisp(int64_t x) { // Fits in a 12-bit displacement field.92return Immediate::is_uimm12(x);93}94static bool is_validDisp(int64_t x) { // Is a valid displacement, regardless of length constraints.95return is_longDisp(x);96}97};9899// RelAddr is an abstraction to represent relative addresses in the100// form they are used on z/Architecture for instructions which access101// their operand with pc-relative addresses. Neither this class nor102// instances hereof have an own state. It consists of methods only.103class RelAddr {104105private: // No public use at all. Solely for (Macro)Assembler.106107static bool is_in_range_of_RelAddr(address target, address pc, bool shortForm) {108// Guard against illegal branch targets, e.g. -1. Occurrences in109// CompiledStaticCall and ad-file. Do not assert (it's a test110// function!). Just return false in case of illegal operands.111if ((((uint64_t)target) & 0x0001L) != 0) return false;112if ((((uint64_t)pc) & 0x0001L) != 0) return false;113114if (shortForm) {115return Immediate::is_simm((int64_t)(target-pc), 17); // Relative short addresses can reach +/- 2**16 bytes.116} else {117return Immediate::is_simm((int64_t)(target-pc), 33); // Relative long addresses can reach +/- 2**32 bytes.118}119}120121static bool is_in_range_of_RelAddr16(address target, address pc) {122return is_in_range_of_RelAddr(target, pc, true);123}124static bool is_in_range_of_RelAddr16(ptrdiff_t distance) {125return is_in_range_of_RelAddr((address)distance, 0, true);126}127128static bool is_in_range_of_RelAddr32(address target, address pc) {129return is_in_range_of_RelAddr(target, pc, false);130}131static bool is_in_range_of_RelAddr32(ptrdiff_t distance) {132return is_in_range_of_RelAddr((address)distance, 0, false);133}134135static int pcrel_off(address target, address pc, bool shortForm) {136assert(((uint64_t)target & 0x0001L) == 0, "target of a relative address must be aligned");137assert(((uint64_t)pc & 0x0001L) == 0, "origin of a relative address must be aligned");138139if ((target == NULL) || (target == pc)) {140return 0; // Yet unknown branch destination.141} else {142guarantee(is_in_range_of_RelAddr(target, pc, shortForm), "target not within reach");143return (int)((target - pc)>>1);144}145}146147static int pcrel_off16(address target, address pc) {148return pcrel_off(target, pc, true);149}150static int pcrel_off16(ptrdiff_t distance) {151return pcrel_off((address)distance, 0, true);152}153154static int pcrel_off32(address target, address pc) {155return pcrel_off(target, pc, false);156}157static int pcrel_off32(ptrdiff_t distance) {158return pcrel_off((address)distance, 0, false);159}160161static ptrdiff_t inv_pcrel_off16(int offset) {162return ((ptrdiff_t)offset)<<1;163}164165static ptrdiff_t inv_pcrel_off32(int offset) {166return ((ptrdiff_t)offset)<<1;167}168169friend class Assembler;170friend class MacroAssembler;171friend class NativeGeneralJump;172};173174// Address is an abstraction used to represent a memory location175// as passed to Z assembler instructions.176//177// Note: A register location is represented via a Register, not178// via an address for efficiency & simplicity reasons.179class Address {180private:181Register _base; // Base register.182Register _index; // Index register183intptr_t _disp; // Constant displacement.184185public:186Address() :187_base(noreg),188_index(noreg),189_disp(0) {}190191Address(Register base, Register index, intptr_t disp = 0) :192_base(base),193_index(index),194_disp(disp) {}195196Address(Register base, intptr_t disp = 0) :197_base(base),198_index(noreg),199_disp(disp) {}200201Address(Register base, RegisterOrConstant roc, intptr_t disp = 0) :202_base(base),203_index(noreg),204_disp(disp) {205if (roc.is_constant()) _disp += roc.as_constant(); else _index = roc.as_register();206}207208Address(Register base, ByteSize disp) :209Address(base, in_bytes(disp)) {}210211Address(Register base, Register index, ByteSize disp) :212Address(base, index, in_bytes(disp)) {}213214// Aborts if disp is a register and base and index are set already.215Address plus_disp(RegisterOrConstant disp) const {216Address a = (*this);217a._disp += disp.constant_or_zero();218if (disp.is_register()) {219if (a._index == noreg) {220a._index = disp.as_register();221} else {222guarantee(_base == noreg, "can not encode"); a._base = disp.as_register();223}224}225return a;226}227228// A call to this is generated by adlc for replacement variable $xxx$$Address.229static Address make_raw(int base, int index, int scale, int disp, relocInfo::relocType disp_reloc);230231bool is_same_address(Address a) const {232return _base == a._base && _index == a._index && _disp == a._disp;233}234235// testers236bool has_base() const { return _base != noreg; }237bool has_index() const { return _index != noreg; }238bool has_disp() const { return true; } // There is no "invalid" value.239240bool is_disp12() const { return Immediate::is_uimm12(disp()); }241bool is_disp20() const { return Immediate::is_simm20(disp()); }242bool is_RSform() { return has_base() && !has_index() && is_disp12(); }243bool is_RSYform() { return has_base() && !has_index() && is_disp20(); }244bool is_RXform() { return has_base() && has_index() && is_disp12(); }245bool is_RXYform() { return has_base() && has_index() && is_disp20(); }246247bool uses(Register r) { return _base == r || _index == r; };248249// accessors250Register base() const { return _base; }251Register baseOrR0() const { assert(_base != Z_R0, ""); return _base == noreg ? Z_R0 : _base; }252Register index() const { return _index; }253Register indexOrR0() const { assert(_index != Z_R0, ""); return _index == noreg ? Z_R0 : _index; }254intptr_t disp() const { return _disp; }255// Specific version for short displacement instructions.256int disp12() const {257assert(is_disp12(), "displacement out of range for uimm12");258return _disp;259}260// Specific version for long displacement instructions.261int disp20() const {262assert(is_disp20(), "displacement out of range for simm20");263return _disp;264}265intptr_t value() const { return _disp; }266267friend class Assembler;268};269270class AddressLiteral {271private:272address _address;273RelocationHolder _rspec;274275RelocationHolder rspec_from_rtype(relocInfo::relocType rtype, address addr) {276switch (rtype) {277case relocInfo::external_word_type:278return external_word_Relocation::spec(addr);279case relocInfo::internal_word_type:280return internal_word_Relocation::spec(addr);281case relocInfo::opt_virtual_call_type:282return opt_virtual_call_Relocation::spec();283case relocInfo::static_call_type:284return static_call_Relocation::spec();285case relocInfo::runtime_call_w_cp_type:286return runtime_call_w_cp_Relocation::spec();287case relocInfo::none:288return RelocationHolder();289default:290ShouldNotReachHere();291return RelocationHolder();292}293}294295protected:296// creation297AddressLiteral() : _address(NULL), _rspec(NULL) {}298299public:300AddressLiteral(address addr, RelocationHolder const& rspec)301: _address(addr),302_rspec(rspec) {}303304// Some constructors to avoid casting at the call site.305AddressLiteral(jobject obj, RelocationHolder const& rspec)306: _address((address) obj),307_rspec(rspec) {}308309AddressLiteral(intptr_t value, RelocationHolder const& rspec)310: _address((address) value),311_rspec(rspec) {}312313AddressLiteral(address addr, relocInfo::relocType rtype = relocInfo::none)314: _address((address) addr),315_rspec(rspec_from_rtype(rtype, (address) addr)) {}316317// Some constructors to avoid casting at the call site.318AddressLiteral(address* addr, relocInfo::relocType rtype = relocInfo::none)319: _address((address) addr),320_rspec(rspec_from_rtype(rtype, (address) addr)) {}321322AddressLiteral(bool* addr, relocInfo::relocType rtype = relocInfo::none)323: _address((address) addr),324_rspec(rspec_from_rtype(rtype, (address) addr)) {}325326AddressLiteral(const bool* addr, relocInfo::relocType rtype = relocInfo::none)327: _address((address) addr),328_rspec(rspec_from_rtype(rtype, (address) addr)) {}329330AddressLiteral(signed char* addr, relocInfo::relocType rtype = relocInfo::none)331: _address((address) addr),332_rspec(rspec_from_rtype(rtype, (address) addr)) {}333334AddressLiteral(int* addr, relocInfo::relocType rtype = relocInfo::none)335: _address((address) addr),336_rspec(rspec_from_rtype(rtype, (address) addr)) {}337338AddressLiteral(intptr_t addr, relocInfo::relocType rtype = relocInfo::none)339: _address((address) addr),340_rspec(rspec_from_rtype(rtype, (address) addr)) {}341342AddressLiteral(intptr_t* addr, relocInfo::relocType rtype = relocInfo::none)343: _address((address) addr),344_rspec(rspec_from_rtype(rtype, (address) addr)) {}345346AddressLiteral(float* addr, relocInfo::relocType rtype = relocInfo::none)347: _address((address) addr),348_rspec(rspec_from_rtype(rtype, (address) addr)) {}349350AddressLiteral(double* addr, relocInfo::relocType rtype = relocInfo::none)351: _address((address) addr),352_rspec(rspec_from_rtype(rtype, (address) addr)) {}353354intptr_t value() const { return (intptr_t) _address; }355356const relocInfo::relocType rtype() const { return _rspec.type(); }357const RelocationHolder& rspec() const { return _rspec; }358359RelocationHolder rspec(int offset) const {360return offset == 0 ? _rspec : _rspec.plus(offset);361}362};363364// Convenience classes365class ExternalAddress: public AddressLiteral {366private:367static relocInfo::relocType reloc_for_target(address target) {368// Sometimes ExternalAddress is used for values which aren't369// exactly addresses, like the card table base.370// External_word_type can't be used for values in the first page371// so just skip the reloc in that case.372return external_word_Relocation::can_be_relocated(target) ? relocInfo::external_word_type : relocInfo::none;373}374375public:376ExternalAddress(address target) : AddressLiteral(target, reloc_for_target( target)) {}377};378379// Argument is an abstraction used to represent an outgoing actual380// argument or an incoming formal parameter, whether it resides in381// memory or in a register, in a manner consistent with the382// z/Architecture Application Binary Interface, or ABI. This is often383// referred to as the native or C calling convention.384class Argument {385private:386int _number;387bool _is_in;388389public:390enum {391// Only 5 registers may contain integer parameters.392n_register_parameters = 5,393// Can have up to 4 floating registers.394n_float_register_parameters = 4395};396397// creation398Argument(int number, bool is_in) : _number(number), _is_in(is_in) {}399Argument(int number) : _number(number) {}400401int number() const { return _number; }402403Argument successor() const { return Argument(number() + 1); }404405// Locating register-based arguments:406bool is_register() const { return _number < n_register_parameters; }407408// Locating Floating Point register-based arguments:409bool is_float_register() const { return _number < n_float_register_parameters; }410411FloatRegister as_float_register() const {412assert(is_float_register(), "must be a register argument");413return as_FloatRegister((number() *2) + 1);414}415416FloatRegister as_double_register() const {417assert(is_float_register(), "must be a register argument");418return as_FloatRegister((number() *2));419}420421Register as_register() const {422assert(is_register(), "must be a register argument");423return as_Register(number() + Z_ARG1->encoding());424}425426// debugging427const char* name() const;428429friend class Assembler;430};431432433// The z/Architecture Assembler: Pure assembler doing NO optimizations434// on the instruction level; i.e., what you write is what you get. The435// Assembler is generating code into a CodeBuffer.436class Assembler : public AbstractAssembler {437protected:438439friend class AbstractAssembler;440friend class AddressLiteral;441442// Code patchers need various routines like inv_wdisp().443friend class NativeInstruction;444#ifndef COMPILER2445friend class NativeGeneralJump;446#endif447friend class Relocation;448449public:450451// Addressing452453// address calculation454#define LA_ZOPC (unsigned int)(0x41 << 24)455#define LAY_ZOPC (unsigned long)(0xe3L << 40 | 0x71L)456#define LARL_ZOPC (unsigned long)(0xc0L << 40 | 0x00L << 32)457458459// Data Transfer460461// register to register transfer462#define LR_ZOPC (unsigned int)(24 << 8)463#define LBR_ZOPC (unsigned int)(0xb926 << 16)464#define LHR_ZOPC (unsigned int)(0xb927 << 16)465#define LGBR_ZOPC (unsigned int)(0xb906 << 16)466#define LGHR_ZOPC (unsigned int)(0xb907 << 16)467#define LGFR_ZOPC (unsigned int)(0xb914 << 16)468#define LGR_ZOPC (unsigned int)(0xb904 << 16)469470#define LLHR_ZOPC (unsigned int)(0xb995 << 16)471#define LLGCR_ZOPC (unsigned int)(0xb984 << 16)472#define LLGHR_ZOPC (unsigned int)(0xb985 << 16)473#define LLGTR_ZOPC (unsigned int)(185 << 24 | 23 << 16)474#define LLGFR_ZOPC (unsigned int)(185 << 24 | 22 << 16)475476#define LTR_ZOPC (unsigned int)(18 << 8)477#define LTGFR_ZOPC (unsigned int)(185 << 24 | 18 << 16)478#define LTGR_ZOPC (unsigned int)(185 << 24 | 2 << 16)479480#define LER_ZOPC (unsigned int)(56 << 8)481#define LEDBR_ZOPC (unsigned int)(179 << 24 | 68 << 16)482#define LEXBR_ZOPC (unsigned int)(179 << 24 | 70 << 16)483#define LDEBR_ZOPC (unsigned int)(179 << 24 | 4 << 16)484#define LDR_ZOPC (unsigned int)(40 << 8)485#define LDXBR_ZOPC (unsigned int)(179 << 24 | 69 << 16)486#define LXEBR_ZOPC (unsigned int)(179 << 24 | 6 << 16)487#define LXDBR_ZOPC (unsigned int)(179 << 24 | 5 << 16)488#define LXR_ZOPC (unsigned int)(179 << 24 | 101 << 16)489#define LTEBR_ZOPC (unsigned int)(179 << 24 | 2 << 16)490#define LTDBR_ZOPC (unsigned int)(179 << 24 | 18 << 16)491#define LTXBR_ZOPC (unsigned int)(179 << 24 | 66 << 16)492493#define LRVR_ZOPC (unsigned int)(0xb91f << 16)494#define LRVGR_ZOPC (unsigned int)(0xb90f << 16)495496#define LDGR_ZOPC (unsigned int)(0xb3c1 << 16) // z10497#define LGDR_ZOPC (unsigned int)(0xb3cd << 16) // z10498499#define LOCR_ZOPC (unsigned int)(0xb9f2 << 16) // z196500#define LOCGR_ZOPC (unsigned int)(0xb9e2 << 16) // z196501502// immediate to register transfer503#define IIHH_ZOPC (unsigned int)(165 << 24)504#define IIHL_ZOPC (unsigned int)(165 << 24 | 1 << 16)505#define IILH_ZOPC (unsigned int)(165 << 24 | 2 << 16)506#define IILL_ZOPC (unsigned int)(165 << 24 | 3 << 16)507#define IIHF_ZOPC (unsigned long)(0xc0L << 40 | 8L << 32)508#define IILF_ZOPC (unsigned long)(0xc0L << 40 | 9L << 32)509#define LLIHH_ZOPC (unsigned int)(165 << 24 | 12 << 16)510#define LLIHL_ZOPC (unsigned int)(165 << 24 | 13 << 16)511#define LLILH_ZOPC (unsigned int)(165 << 24 | 14 << 16)512#define LLILL_ZOPC (unsigned int)(165 << 24 | 15 << 16)513#define LLIHF_ZOPC (unsigned long)(0xc0L << 40 | 14L << 32)514#define LLILF_ZOPC (unsigned long)(0xc0L << 40 | 15L << 32)515#define LHI_ZOPC (unsigned int)(167 << 24 | 8 << 16)516#define LGHI_ZOPC (unsigned int)(167 << 24 | 9 << 16)517#define LGFI_ZOPC (unsigned long)(0xc0L << 40 | 1L << 32)518519#define LZER_ZOPC (unsigned int)(0xb374 << 16)520#define LZDR_ZOPC (unsigned int)(0xb375 << 16)521522// LOAD: memory to register transfer523#define LB_ZOPC (unsigned long)(227L << 40 | 118L)524#define LH_ZOPC (unsigned int)(72 << 24)525#define LHY_ZOPC (unsigned long)(227L << 40 | 120L)526#define L_ZOPC (unsigned int)(88 << 24)527#define LY_ZOPC (unsigned long)(227L << 40 | 88L)528#define LT_ZOPC (unsigned long)(0xe3L << 40 | 0x12L)529#define LGB_ZOPC (unsigned long)(227L << 40 | 119L)530#define LGH_ZOPC (unsigned long)(227L << 40 | 21L)531#define LGF_ZOPC (unsigned long)(227L << 40 | 20L)532#define LG_ZOPC (unsigned long)(227L << 40 | 4L)533#define LTG_ZOPC (unsigned long)(0xe3L << 40 | 0x02L)534#define LTGF_ZOPC (unsigned long)(0xe3L << 40 | 0x32L)535536#define LLC_ZOPC (unsigned long)(0xe3L << 40 | 0x94L)537#define LLH_ZOPC (unsigned long)(0xe3L << 40 | 0x95L)538#define LLGT_ZOPC (unsigned long)(227L << 40 | 23L)539#define LLGC_ZOPC (unsigned long)(227L << 40 | 144L)540#define LLGH_ZOPC (unsigned long)(227L << 40 | 145L)541#define LLGF_ZOPC (unsigned long)(227L << 40 | 22L)542543#define IC_ZOPC (unsigned int)(0x43 << 24)544#define ICY_ZOPC (unsigned long)(0xe3L << 40 | 0x73L)545#define ICM_ZOPC (unsigned int)(0xbf << 24)546#define ICMY_ZOPC (unsigned long)(0xebL << 40 | 0x81L)547#define ICMH_ZOPC (unsigned long)(0xebL << 40 | 0x80L)548549#define LRVH_ZOPC (unsigned long)(0xe3L << 40 | 0x1fL)550#define LRV_ZOPC (unsigned long)(0xe3L << 40 | 0x1eL)551#define LRVG_ZOPC (unsigned long)(0xe3L << 40 | 0x0fL)552553554// LOAD relative: memory to register transfer555#define LHRL_ZOPC (unsigned long)(0xc4L << 40 | 0x05L << 32) // z10556#define LRL_ZOPC (unsigned long)(0xc4L << 40 | 0x0dL << 32) // z10557#define LGHRL_ZOPC (unsigned long)(0xc4L << 40 | 0x04L << 32) // z10558#define LGFRL_ZOPC (unsigned long)(0xc4L << 40 | 0x0cL << 32) // z10559#define LGRL_ZOPC (unsigned long)(0xc4L << 40 | 0x08L << 32) // z10560561#define LLHRL_ZOPC (unsigned long)(0xc4L << 40 | 0x02L << 32) // z10562#define LLGHRL_ZOPC (unsigned long)(0xc4L << 40 | 0x06L << 32) // z10563#define LLGFRL_ZOPC (unsigned long)(0xc4L << 40 | 0x0eL << 32) // z10564565#define LOC_ZOPC (unsigned long)(0xebL << 40 | 0xf2L) // z196566#define LOCG_ZOPC (unsigned long)(0xebL << 40 | 0xe2L) // z196567568569// LOAD multiple registers at once570#define LM_ZOPC (unsigned int)(0x98 << 24)571#define LMY_ZOPC (unsigned long)(0xebL << 40 | 0x98L)572#define LMG_ZOPC (unsigned long)(0xebL << 40 | 0x04L)573574#define LE_ZOPC (unsigned int)(0x78 << 24)575#define LEY_ZOPC (unsigned long)(237L << 40 | 100L)576#define LDEB_ZOPC (unsigned long)(237L << 40 | 4)577#define LD_ZOPC (unsigned int)(0x68 << 24)578#define LDY_ZOPC (unsigned long)(237L << 40 | 101L)579#define LXEB_ZOPC (unsigned long)(237L << 40 | 6)580#define LXDB_ZOPC (unsigned long)(237L << 40 | 5)581582// STORE: register to memory transfer583#define STC_ZOPC (unsigned int)(0x42 << 24)584#define STCY_ZOPC (unsigned long)(227L << 40 | 114L)585#define STH_ZOPC (unsigned int)(64 << 24)586#define STHY_ZOPC (unsigned long)(227L << 40 | 112L)587#define ST_ZOPC (unsigned int)(80 << 24)588#define STY_ZOPC (unsigned long)(227L << 40 | 80L)589#define STG_ZOPC (unsigned long)(227L << 40 | 36L)590591#define STCM_ZOPC (unsigned long)(0xbeL << 24)592#define STCMY_ZOPC (unsigned long)(0xebL << 40 | 0x2dL)593#define STCMH_ZOPC (unsigned long)(0xebL << 40 | 0x2cL)594595// STORE relative: memory to register transfer596#define STHRL_ZOPC (unsigned long)(0xc4L << 40 | 0x07L << 32) // z10597#define STRL_ZOPC (unsigned long)(0xc4L << 40 | 0x0fL << 32) // z10598#define STGRL_ZOPC (unsigned long)(0xc4L << 40 | 0x0bL << 32) // z10599600#define STOC_ZOPC (unsigned long)(0xebL << 40 | 0xf3L) // z196601#define STOCG_ZOPC (unsigned long)(0xebL << 40 | 0xe3L) // z196602603// STORE multiple registers at once604#define STM_ZOPC (unsigned int)(0x90 << 24)605#define STMY_ZOPC (unsigned long)(0xebL << 40 | 0x90L)606#define STMG_ZOPC (unsigned long)(0xebL << 40 | 0x24L)607608#define STE_ZOPC (unsigned int)(0x70 << 24)609#define STEY_ZOPC (unsigned long)(237L << 40 | 102L)610#define STD_ZOPC (unsigned int)(0x60 << 24)611#define STDY_ZOPC (unsigned long)(237L << 40 | 103L)612613// MOVE: immediate to memory transfer614#define MVHHI_ZOPC (unsigned long)(0xe5L << 40 | 0x44L << 32) // z10615#define MVHI_ZOPC (unsigned long)(0xe5L << 40 | 0x4cL << 32) // z10616#define MVGHI_ZOPC (unsigned long)(0xe5L << 40 | 0x48L << 32) // z10617618619// ALU operations620621// Load Positive622#define LPR_ZOPC (unsigned int)(16 << 8)623#define LPGFR_ZOPC (unsigned int)(185 << 24 | 16 << 16)624#define LPGR_ZOPC (unsigned int)(185 << 24)625#define LPEBR_ZOPC (unsigned int)(179 << 24)626#define LPDBR_ZOPC (unsigned int)(179 << 24 | 16 << 16)627#define LPXBR_ZOPC (unsigned int)(179 << 24 | 64 << 16)628629// Load Negative630#define LNR_ZOPC (unsigned int)(17 << 8)631#define LNGFR_ZOPC (unsigned int)(185 << 24 | 17 << 16)632#define LNGR_ZOPC (unsigned int)(185 << 24 | 1 << 16)633#define LNEBR_ZOPC (unsigned int)(179 << 24 | 1 << 16)634#define LNDBR_ZOPC (unsigned int)(179 << 24 | 17 << 16)635#define LNXBR_ZOPC (unsigned int)(179 << 24 | 65 << 16)636637// Load Complement638#define LCR_ZOPC (unsigned int)(19 << 8)639#define LCGFR_ZOPC (unsigned int)(185 << 24 | 19 << 16)640#define LCGR_ZOPC (unsigned int)(185 << 24 | 3 << 16)641#define LCEBR_ZOPC (unsigned int)(179 << 24 | 3 << 16)642#define LCDBR_ZOPC (unsigned int)(179 << 24 | 19 << 16)643#define LCXBR_ZOPC (unsigned int)(179 << 24 | 67 << 16)644645// Add646// RR, signed647#define AR_ZOPC (unsigned int)(26 << 8)648#define AGFR_ZOPC (unsigned int)(0xb9 << 24 | 0x18 << 16)649#define AGR_ZOPC (unsigned int)(0xb9 << 24 | 0x08 << 16)650// RRF, signed651#define ARK_ZOPC (unsigned int)(0xb9 << 24 | 0x00f8 << 16)652#define AGRK_ZOPC (unsigned int)(0xb9 << 24 | 0x00e8 << 16)653// RI, signed654#define AHI_ZOPC (unsigned int)(167 << 24 | 10 << 16)655#define AFI_ZOPC (unsigned long)(0xc2L << 40 | 9L << 32)656#define AGHI_ZOPC (unsigned int)(167 << 24 | 11 << 16)657#define AGFI_ZOPC (unsigned long)(0xc2L << 40 | 8L << 32)658// RIE, signed659#define AHIK_ZOPC (unsigned long)(0xecL << 40 | 0x00d8L)660#define AGHIK_ZOPC (unsigned long)(0xecL << 40 | 0x00d9L)661#define AIH_ZOPC (unsigned long)(0xccL << 40 | 0x08L << 32)662// RM, signed663#define AHY_ZOPC (unsigned long)(227L << 40 | 122L)664#define A_ZOPC (unsigned int)(90 << 24)665#define AY_ZOPC (unsigned long)(227L << 40 | 90L)666#define AGF_ZOPC (unsigned long)(227L << 40 | 24L)667#define AG_ZOPC (unsigned long)(227L << 40 | 8L)668// In-memory arithmetic (add signed, add logical with signed immediate).669// MI, signed670#define ASI_ZOPC (unsigned long)(0xebL << 40 | 0x6aL)671#define AGSI_ZOPC (unsigned long)(0xebL << 40 | 0x7aL)672673// RR, Logical674#define ALR_ZOPC (unsigned int)(30 << 8)675#define ALGFR_ZOPC (unsigned int)(185 << 24 | 26 << 16)676#define ALGR_ZOPC (unsigned int)(185 << 24 | 10 << 16)677#define ALCGR_ZOPC (unsigned int)(185 << 24 | 136 << 16)678// RRF, Logical679#define ALRK_ZOPC (unsigned int)(0xb9 << 24 | 0x00fa << 16)680#define ALGRK_ZOPC (unsigned int)(0xb9 << 24 | 0x00ea << 16)681// RI, Logical682#define ALFI_ZOPC (unsigned long)(0xc2L << 40 | 0x0bL << 32)683#define ALGFI_ZOPC (unsigned long)(0xc2L << 40 | 0x0aL << 32)684// RIE, Logical685#define ALHSIK_ZOPC (unsigned long)(0xecL << 40 | 0x00daL)686#define ALGHSIK_ZOPC (unsigned long)(0xecL << 40 | 0x00dbL)687// RM, Logical688#define AL_ZOPC (unsigned int)(0x5e << 24)689#define ALY_ZOPC (unsigned long)(227L << 40 | 94L)690#define ALGF_ZOPC (unsigned long)(227L << 40 | 26L)691#define ALG_ZOPC (unsigned long)(227L << 40 | 10L)692// In-memory arithmetic (add signed, add logical with signed immediate).693// MI, Logical694#define ALSI_ZOPC (unsigned long)(0xebL << 40 | 0x6eL)695#define ALGSI_ZOPC (unsigned long)(0xebL << 40 | 0x7eL)696697// RR, BFP698#define AEBR_ZOPC (unsigned int)(179 << 24 | 10 << 16)699#define ADBR_ZOPC (unsigned int)(179 << 24 | 26 << 16)700#define AXBR_ZOPC (unsigned int)(179 << 24 | 74 << 16)701// RM, BFP702#define AEB_ZOPC (unsigned long)(237L << 40 | 10)703#define ADB_ZOPC (unsigned long)(237L << 40 | 26)704705// Subtract706// RR, signed707#define SR_ZOPC (unsigned int)(27 << 8)708#define SGFR_ZOPC (unsigned int)(185 << 24 | 25 << 16)709#define SGR_ZOPC (unsigned int)(185 << 24 | 9 << 16)710// RRF, signed711#define SRK_ZOPC (unsigned int)(0xb9 << 24 | 0x00f9 << 16)712#define SGRK_ZOPC (unsigned int)(0xb9 << 24 | 0x00e9 << 16)713// RM, signed714#define SH_ZOPC (unsigned int)(0x4b << 24)715#define SHY_ZOPC (unsigned long)(227L << 40 | 123L)716#define S_ZOPC (unsigned int)(0x5B << 24)717#define SY_ZOPC (unsigned long)(227L << 40 | 91L)718#define SGF_ZOPC (unsigned long)(227L << 40 | 25)719#define SG_ZOPC (unsigned long)(227L << 40 | 9)720// RR, Logical721#define SLR_ZOPC (unsigned int)(31 << 8)722#define SLGFR_ZOPC (unsigned int)(185 << 24 | 27 << 16)723#define SLGR_ZOPC (unsigned int)(185 << 24 | 11 << 16)724// RIL, Logical725#define SLFI_ZOPC (unsigned long)(0xc2L << 40 | 0x05L << 32)726#define SLGFI_ZOPC (unsigned long)(0xc2L << 40 | 0x04L << 32)727// RRF, Logical728#define SLRK_ZOPC (unsigned int)(0xb9 << 24 | 0x00fb << 16)729#define SLGRK_ZOPC (unsigned int)(0xb9 << 24 | 0x00eb << 16)730// RM, Logical731#define SLY_ZOPC (unsigned long)(227L << 40 | 95L)732#define SLGF_ZOPC (unsigned long)(227L << 40 | 27L)733#define SLG_ZOPC (unsigned long)(227L << 40 | 11L)734735// RR, BFP736#define SEBR_ZOPC (unsigned int)(179 << 24 | 11 << 16)737#define SDBR_ZOPC (unsigned int)(179 << 24 | 27 << 16)738#define SXBR_ZOPC (unsigned int)(179 << 24 | 75 << 16)739// RM, BFP740#define SEB_ZOPC (unsigned long)(237L << 40 | 11)741#define SDB_ZOPC (unsigned long)(237L << 40 | 27)742743// Multiply744// RR, signed745#define MR_ZOPC (unsigned int)(28 << 8)746#define MSR_ZOPC (unsigned int)(178 << 24 | 82 << 16)747#define MSGFR_ZOPC (unsigned int)(185 << 24 | 28 << 16)748#define MSGR_ZOPC (unsigned int)(185 << 24 | 12 << 16)749// RI, signed750#define MHI_ZOPC (unsigned int)(167 << 24 | 12 << 16)751#define MGHI_ZOPC (unsigned int)(167 << 24 | 13 << 16)752#define MSFI_ZOPC (unsigned long)(0xc2L << 40 | 0x01L << 32) // z10753#define MSGFI_ZOPC (unsigned long)(0xc2L << 40 | 0x00L << 32) // z10754// RM, signed755#define M_ZOPC (unsigned int)(92 << 24)756#define MS_ZOPC (unsigned int)(0x71 << 24)757#define MHY_ZOPC (unsigned long)(0xe3L<< 40 | 0x7cL)758#define MSY_ZOPC (unsigned long)(227L << 40 | 81L)759#define MSGF_ZOPC (unsigned long)(227L << 40 | 28L)760#define MSG_ZOPC (unsigned long)(227L << 40 | 12L)761// RR, unsigned762#define MLR_ZOPC (unsigned int)(185 << 24 | 150 << 16)763#define MLGR_ZOPC (unsigned int)(185 << 24 | 134 << 16)764// RM, unsigned765#define ML_ZOPC (unsigned long)(227L << 40 | 150L)766#define MLG_ZOPC (unsigned long)(227L << 40 | 134L)767768// RR, BFP769#define MEEBR_ZOPC (unsigned int)(179 << 24 | 23 << 16)770#define MDEBR_ZOPC (unsigned int)(179 << 24 | 12 << 16)771#define MDBR_ZOPC (unsigned int)(179 << 24 | 28 << 16)772#define MXDBR_ZOPC (unsigned int)(179 << 24 | 7 << 16)773#define MXBR_ZOPC (unsigned int)(179 << 24 | 76 << 16)774// RM, BFP775#define MEEB_ZOPC (unsigned long)(237L << 40 | 23)776#define MDEB_ZOPC (unsigned long)(237L << 40 | 12)777#define MDB_ZOPC (unsigned long)(237L << 40 | 28)778#define MXDB_ZOPC (unsigned long)(237L << 40 | 7)779780// Multiply-Add781#define MAEBR_ZOPC (unsigned int)(179 << 24 | 14 << 16)782#define MADBR_ZOPC (unsigned int)(179 << 24 | 30 << 16)783#define MSEBR_ZOPC (unsigned int)(179 << 24 | 15 << 16)784#define MSDBR_ZOPC (unsigned int)(179 << 24 | 31 << 16)785#define MAEB_ZOPC (unsigned long)(237L << 40 | 14)786#define MADB_ZOPC (unsigned long)(237L << 40 | 30)787#define MSEB_ZOPC (unsigned long)(237L << 40 | 15)788#define MSDB_ZOPC (unsigned long)(237L << 40 | 31)789790// Divide791// RR, signed792#define DSGFR_ZOPC (unsigned int)(0xb91d << 16)793#define DSGR_ZOPC (unsigned int)(0xb90d << 16)794// RM, signed795#define D_ZOPC (unsigned int)(93 << 24)796#define DSGF_ZOPC (unsigned long)(227L << 40 | 29L)797#define DSG_ZOPC (unsigned long)(227L << 40 | 13L)798// RR, unsigned799#define DLR_ZOPC (unsigned int)(185 << 24 | 151 << 16)800#define DLGR_ZOPC (unsigned int)(185 << 24 | 135 << 16)801// RM, unsigned802#define DL_ZOPC (unsigned long)(227L << 40 | 151L)803#define DLG_ZOPC (unsigned long)(227L << 40 | 135L)804805// RR, BFP806#define DEBR_ZOPC (unsigned int)(179 << 24 | 13 << 16)807#define DDBR_ZOPC (unsigned int)(179 << 24 | 29 << 16)808#define DXBR_ZOPC (unsigned int)(179 << 24 | 77 << 16)809// RM, BFP810#define DEB_ZOPC (unsigned long)(237L << 40 | 13)811#define DDB_ZOPC (unsigned long)(237L << 40 | 29)812813// Square Root814// RR, BFP815#define SQEBR_ZOPC (unsigned int)(0xb314 << 16)816#define SQDBR_ZOPC (unsigned int)(0xb315 << 16)817#define SQXBR_ZOPC (unsigned int)(0xb316 << 16)818// RM, BFP819#define SQEB_ZOPC (unsigned long)(237L << 40 | 20)820#define SQDB_ZOPC (unsigned long)(237L << 40 | 21)821822// Compare and Test823// RR, signed824#define CR_ZOPC (unsigned int)(25 << 8)825#define CGFR_ZOPC (unsigned int)(185 << 24 | 48 << 16)826#define CGR_ZOPC (unsigned int)(185 << 24 | 32 << 16)827// RI, signed828#define CHI_ZOPC (unsigned int)(167 << 24 | 14 << 16)829#define CFI_ZOPC (unsigned long)(0xc2L << 40 | 0xdL << 32)830#define CGHI_ZOPC (unsigned int)(167 << 24 | 15 << 16)831#define CGFI_ZOPC (unsigned long)(0xc2L << 40 | 0xcL << 32)832// RM, signed833#define CH_ZOPC (unsigned int)(0x49 << 24)834#define CHY_ZOPC (unsigned long)(227L << 40 | 121L)835#define C_ZOPC (unsigned int)(0x59 << 24)836#define CY_ZOPC (unsigned long)(227L << 40 | 89L)837#define CGF_ZOPC (unsigned long)(227L << 40 | 48L)838#define CG_ZOPC (unsigned long)(227L << 40 | 32L)839// RR, unsigned840#define CLR_ZOPC (unsigned int)(21 << 8)841#define CLGFR_ZOPC (unsigned int)(185 << 24 | 49 << 16)842#define CLGR_ZOPC (unsigned int)(185 << 24 | 33 << 16)843// RIL, unsigned844#define CLFI_ZOPC (unsigned long)(0xc2L << 40 | 0xfL << 32)845#define CLGFI_ZOPC (unsigned long)(0xc2L << 40 | 0xeL << 32)846// RM, unsigned847#define CL_ZOPC (unsigned int)(0x55 << 24)848#define CLY_ZOPC (unsigned long)(227L << 40 | 85L)849#define CLGF_ZOPC (unsigned long)(227L << 40 | 49L)850#define CLG_ZOPC (unsigned long)(227L << 40 | 33L)851// RI, unsigned852#define TMHH_ZOPC (unsigned int)(167 << 24 | 2 << 16)853#define TMHL_ZOPC (unsigned int)(167 << 24 | 3 << 16)854#define TMLH_ZOPC (unsigned int)(167 << 24)855#define TMLL_ZOPC (unsigned int)(167 << 24 | 1 << 16)856857// RR, BFP858#define CEBR_ZOPC (unsigned int)(179 << 24 | 9 << 16)859#define CDBR_ZOPC (unsigned int)(179 << 24 | 25 << 16)860#define CXBR_ZOPC (unsigned int)(179 << 24 | 73 << 16)861// RM, BFP862#define CEB_ZOPC (unsigned long)(237L << 40 | 9)863#define CDB_ZOPC (unsigned long)(237L << 40 | 25)864865// Shift866// arithmetic867#define SLA_ZOPC (unsigned int)(0x8b << 24)868#define SLAK_ZOPC (unsigned long)(0xebL << 40 | 0xddL)869#define SLAG_ZOPC (unsigned long)(0xebL << 40 | 0x0bL)870#define SRA_ZOPC (unsigned int)(0x8a << 24)871#define SRAK_ZOPC (unsigned long)(0xebL << 40 | 0xdcL)872#define SRAG_ZOPC (unsigned long)(0xebL << 40 | 0x0aL)873// logical874#define SLL_ZOPC (unsigned int)(0x89 << 24)875#define SLLK_ZOPC (unsigned long)(0xebL << 40 | 0xdfL)876#define SLLG_ZOPC (unsigned long)(0xebL << 40 | 0x0dL)877#define SRL_ZOPC (unsigned int)(0x88 << 24)878#define SRLK_ZOPC (unsigned long)(0xebL << 40 | 0xdeL)879#define SRLG_ZOPC (unsigned long)(0xebL << 40 | 0x0cL)880881// Rotate, then AND/XOR/OR/insert882// rotate883#define RLL_ZOPC (unsigned long)(0xebL << 40 | 0x1dL) // z10884#define RLLG_ZOPC (unsigned long)(0xebL << 40 | 0x1cL) // z10885// rotate and {AND|XOR|OR|INS}886#define RNSBG_ZOPC (unsigned long)(0xecL << 40 | 0x54L) // z196887#define RXSBG_ZOPC (unsigned long)(0xecL << 40 | 0x57L) // z196888#define ROSBG_ZOPC (unsigned long)(0xecL << 40 | 0x56L) // z196889#define RISBG_ZOPC (unsigned long)(0xecL << 40 | 0x55L) // z196890891// AND892// RR, signed893#define NR_ZOPC (unsigned int)(20 << 8)894#define NGR_ZOPC (unsigned int)(185 << 24 | 128 << 16)895// RRF, signed896#define NRK_ZOPC (unsigned int)(0xb9 << 24 | 0x00f4 << 16)897#define NGRK_ZOPC (unsigned int)(0xb9 << 24 | 0x00e4 << 16)898// RI, signed899#define NIHH_ZOPC (unsigned int)(165 << 24 | 4 << 16)900#define NIHL_ZOPC (unsigned int)(165 << 24 | 5 << 16)901#define NILH_ZOPC (unsigned int)(165 << 24 | 6 << 16)902#define NILL_ZOPC (unsigned int)(165 << 24 | 7 << 16)903#define NIHF_ZOPC (unsigned long)(0xc0L << 40 | 10L << 32)904#define NILF_ZOPC (unsigned long)(0xc0L << 40 | 11L << 32)905// RM, signed906#define N_ZOPC (unsigned int)(0x54 << 24)907#define NY_ZOPC (unsigned long)(227L << 40 | 84L)908#define NG_ZOPC (unsigned long)(227L << 40 | 128L)909910// OR911// RR, signed912#define OR_ZOPC (unsigned int)(22 << 8)913#define OGR_ZOPC (unsigned int)(185 << 24 | 129 << 16)914// RRF, signed915#define ORK_ZOPC (unsigned int)(0xb9 << 24 | 0x00f6 << 16)916#define OGRK_ZOPC (unsigned int)(0xb9 << 24 | 0x00e6 << 16)917// RI, signed918#define OIHH_ZOPC (unsigned int)(165 << 24 | 8 << 16)919#define OIHL_ZOPC (unsigned int)(165 << 24 | 9 << 16)920#define OILH_ZOPC (unsigned int)(165 << 24 | 10 << 16)921#define OILL_ZOPC (unsigned int)(165 << 24 | 11 << 16)922#define OIHF_ZOPC (unsigned long)(0xc0L << 40 | 12L << 32)923#define OILF_ZOPC (unsigned long)(0xc0L << 40 | 13L << 32)924// RM, signed925#define O_ZOPC (unsigned int)(0x56 << 24)926#define OY_ZOPC (unsigned long)(227L << 40 | 86L)927#define OG_ZOPC (unsigned long)(227L << 40 | 129L)928929// XOR930// RR, signed931#define XR_ZOPC (unsigned int)(23 << 8)932#define XGR_ZOPC (unsigned int)(185 << 24 | 130 << 16)933// RRF, signed934#define XRK_ZOPC (unsigned int)(0xb9 << 24 | 0x00f7 << 16)935#define XGRK_ZOPC (unsigned int)(0xb9 << 24 | 0x00e7 << 16)936// RI, signed937#define XIHF_ZOPC (unsigned long)(0xc0L << 40 | 6L << 32)938#define XILF_ZOPC (unsigned long)(0xc0L << 40 | 7L << 32)939// RM, signed940#define X_ZOPC (unsigned int)(0x57 << 24)941#define XY_ZOPC (unsigned long)(227L << 40 | 87L)942#define XG_ZOPC (unsigned long)(227L << 40 | 130L)943944945// Data Conversion946947// INT to BFP948#define CEFBR_ZOPC (unsigned int)(179 << 24 | 148 << 16)949#define CDFBR_ZOPC (unsigned int)(179 << 24 | 149 << 16)950#define CXFBR_ZOPC (unsigned int)(179 << 24 | 150 << 16)951#define CEGBR_ZOPC (unsigned int)(179 << 24 | 164 << 16)952#define CDGBR_ZOPC (unsigned int)(179 << 24 | 165 << 16)953#define CXGBR_ZOPC (unsigned int)(179 << 24 | 166 << 16)954// BFP to INT955#define CFEBR_ZOPC (unsigned int)(179 << 24 | 152 << 16)956#define CFDBR_ZOPC (unsigned int)(179 << 24 | 153 << 16)957#define CFXBR_ZOPC (unsigned int)(179 << 24 | 154 << 16)958#define CGEBR_ZOPC (unsigned int)(179 << 24 | 168 << 16)959#define CGDBR_ZOPC (unsigned int)(179 << 24 | 169 << 16)960#define CGXBR_ZOPC (unsigned int)(179 << 24 | 170 << 16)961// INT to DEC962#define CVD_ZOPC (unsigned int)(0x4e << 24)963#define CVDY_ZOPC (unsigned long)(0xe3L << 40 | 0x26L)964#define CVDG_ZOPC (unsigned long)(0xe3L << 40 | 0x2eL)965966967// BFP Control968969#define SRNM_ZOPC (unsigned int)(178 << 24 | 153 << 16)970#define EFPC_ZOPC (unsigned int)(179 << 24 | 140 << 16)971#define SFPC_ZOPC (unsigned int)(179 << 24 | 132 << 16)972#define STFPC_ZOPC (unsigned int)(178 << 24 | 156 << 16)973#define LFPC_ZOPC (unsigned int)(178 << 24 | 157 << 16)974975976// Branch Instructions977978// Register979#define BCR_ZOPC (unsigned int)(7 << 8)980#define BALR_ZOPC (unsigned int)(5 << 8)981#define BASR_ZOPC (unsigned int)(13 << 8)982#define BCTGR_ZOPC (unsigned long)(0xb946 << 16)983// Absolute984#define BC_ZOPC (unsigned int)(71 << 24)985#define BAL_ZOPC (unsigned int)(69 << 24)986#define BAS_ZOPC (unsigned int)(77 << 24)987#define BXH_ZOPC (unsigned int)(134 << 24)988#define BXHG_ZOPC (unsigned long)(235L << 40 | 68)989// Relative990#define BRC_ZOPC (unsigned int)(167 << 24 | 4 << 16)991#define BRCL_ZOPC (unsigned long)(192L << 40 | 4L << 32)992#define BRAS_ZOPC (unsigned int)(167 << 24 | 5 << 16)993#define BRASL_ZOPC (unsigned long)(192L << 40 | 5L << 32)994#define BRCT_ZOPC (unsigned int)(167 << 24 | 6 << 16)995#define BRCTG_ZOPC (unsigned int)(167 << 24 | 7 << 16)996#define BRXH_ZOPC (unsigned int)(132 << 24)997#define BRXHG_ZOPC (unsigned long)(236L << 40 | 68)998#define BRXLE_ZOPC (unsigned int)(133 << 24)999#define BRXLG_ZOPC (unsigned long)(236L << 40 | 69)100010011002// Compare and Branch Instructions10031004// signed comp reg/reg, branch Absolute1005#define CRB_ZOPC (unsigned long)(0xecL << 40 | 0xf6L) // z101006#define CGRB_ZOPC (unsigned long)(0xecL << 40 | 0xe4L) // z101007// signed comp reg/reg, branch Relative1008#define CRJ_ZOPC (unsigned long)(0xecL << 40 | 0x76L) // z101009#define CGRJ_ZOPC (unsigned long)(0xecL << 40 | 0x64L) // z101010// signed comp reg/imm, branch absolute1011#define CIB_ZOPC (unsigned long)(0xecL << 40 | 0xfeL) // z101012#define CGIB_ZOPC (unsigned long)(0xecL << 40 | 0xfcL) // z101013// signed comp reg/imm, branch relative1014#define CIJ_ZOPC (unsigned long)(0xecL << 40 | 0x7eL) // z101015#define CGIJ_ZOPC (unsigned long)(0xecL << 40 | 0x7cL) // z1010161017// unsigned comp reg/reg, branch Absolute1018#define CLRB_ZOPC (unsigned long)(0xecL << 40 | 0xf7L) // z101019#define CLGRB_ZOPC (unsigned long)(0xecL << 40 | 0xe5L) // z101020// unsigned comp reg/reg, branch Relative1021#define CLRJ_ZOPC (unsigned long)(0xecL << 40 | 0x77L) // z101022#define CLGRJ_ZOPC (unsigned long)(0xecL << 40 | 0x65L) // z101023// unsigned comp reg/imm, branch absolute1024#define CLIB_ZOPC (unsigned long)(0xecL << 40 | 0xffL) // z101025#define CLGIB_ZOPC (unsigned long)(0xecL << 40 | 0xfdL) // z101026// unsigned comp reg/imm, branch relative1027#define CLIJ_ZOPC (unsigned long)(0xecL << 40 | 0x7fL) // z101028#define CLGIJ_ZOPC (unsigned long)(0xecL << 40 | 0x7dL) // z1010291030// comp reg/reg, trap1031#define CRT_ZOPC (unsigned int)(0xb972 << 16) // z101032#define CGRT_ZOPC (unsigned int)(0xb960 << 16) // z101033#define CLRT_ZOPC (unsigned int)(0xb973 << 16) // z101034#define CLGRT_ZOPC (unsigned int)(0xb961 << 16) // z101035// comp reg/imm, trap1036#define CIT_ZOPC (unsigned long)(0xecL << 40 | 0x72L) // z101037#define CGIT_ZOPC (unsigned long)(0xecL << 40 | 0x70L) // z101038#define CLFIT_ZOPC (unsigned long)(0xecL << 40 | 0x73L) // z101039#define CLGIT_ZOPC (unsigned long)(0xecL << 40 | 0x71L) // z10104010411042// Direct Memory Operations10431044// Compare1045#define CLI_ZOPC (unsigned int)(0x95 << 24)1046#define CLIY_ZOPC (unsigned long)(0xebL << 40 | 0x55L)1047#define CLC_ZOPC (unsigned long)(0xd5L << 40)1048#define CLCL_ZOPC (unsigned int)(0x0f << 8)1049#define CLCLE_ZOPC (unsigned int)(0xa9 << 24)1050#define CLCLU_ZOPC (unsigned long)(0xebL << 40 | 0x8fL)10511052// Move1053#define MVI_ZOPC (unsigned int)(0x92 << 24)1054#define MVIY_ZOPC (unsigned long)(0xebL << 40 | 0x52L)1055#define MVC_ZOPC (unsigned long)(0xd2L << 40)1056#define MVCL_ZOPC (unsigned int)(0x0e << 8)1057#define MVCLE_ZOPC (unsigned int)(0xa8 << 24)10581059// Test1060#define TM_ZOPC (unsigned int)(0x91 << 24)1061#define TMY_ZOPC (unsigned long)(0xebL << 40 | 0x51L)10621063// AND1064#define NI_ZOPC (unsigned int)(0x94 << 24)1065#define NIY_ZOPC (unsigned long)(0xebL << 40 | 0x54L)1066#define NC_ZOPC (unsigned long)(0xd4L << 40)10671068// OR1069#define OI_ZOPC (unsigned int)(0x96 << 24)1070#define OIY_ZOPC (unsigned long)(0xebL << 40 | 0x56L)1071#define OC_ZOPC (unsigned long)(0xd6L << 40)10721073// XOR1074#define XI_ZOPC (unsigned int)(0x97 << 24)1075#define XIY_ZOPC (unsigned long)(0xebL << 40 | 0x57L)1076#define XC_ZOPC (unsigned long)(0xd7L << 40)10771078// Search String1079#define SRST_ZOPC (unsigned int)(178 << 24 | 94 << 16)1080#define SRSTU_ZOPC (unsigned int)(185 << 24 | 190 << 16)10811082// Translate characters1083#define TROO_ZOPC (unsigned int)(0xb9 << 24 | 0x93 << 16)1084#define TROT_ZOPC (unsigned int)(0xb9 << 24 | 0x92 << 16)1085#define TRTO_ZOPC (unsigned int)(0xb9 << 24 | 0x91 << 16)1086#define TRTT_ZOPC (unsigned int)(0xb9 << 24 | 0x90 << 16)108710881089//---------------------------1090//-- Vector Instructions --1091//---------------------------10921093//---< Vector Support Instructions >---10941095//--- Load (memory) ---10961097#define VLM_ZOPC (unsigned long)(0xe7L << 40 | 0x36L << 0) // load full vreg range (n * 128 bit)1098#define VL_ZOPC (unsigned long)(0xe7L << 40 | 0x06L << 0) // load full vreg (128 bit)1099#define VLEB_ZOPC (unsigned long)(0xe7L << 40 | 0x00L << 0) // load vreg element (8 bit)1100#define VLEH_ZOPC (unsigned long)(0xe7L << 40 | 0x01L << 0) // load vreg element (16 bit)1101#define VLEF_ZOPC (unsigned long)(0xe7L << 40 | 0x03L << 0) // load vreg element (32 bit)1102#define VLEG_ZOPC (unsigned long)(0xe7L << 40 | 0x02L << 0) // load vreg element (64 bit)11031104#define VLREP_ZOPC (unsigned long)(0xe7L << 40 | 0x05L << 0) // load and replicate into all vector elements1105#define VLLEZ_ZOPC (unsigned long)(0xe7L << 40 | 0x04L << 0) // load logical element and zero.11061107// vector register gather1108#define VGEF_ZOPC (unsigned long)(0xe7L << 40 | 0x13L << 0) // gather element (32 bit), V1(M3) = [D2(V2(M3),B2)]1109#define VGEG_ZOPC (unsigned long)(0xe7L << 40 | 0x12L << 0) // gather element (64 bit), V1(M3) = [D2(V2(M3),B2)]1110// vector register scatter1111#define VSCEF_ZOPC (unsigned long)(0xe7L << 40 | 0x1bL << 0) // vector scatter element FW1112#define VSCEG_ZOPC (unsigned long)(0xe7L << 40 | 0x1aL << 0) // vector scatter element DW11131114#define VLBB_ZOPC (unsigned long)(0xe7L << 40 | 0x07L << 0) // load vreg to block boundary (load to alignment).1115#define VLL_ZOPC (unsigned long)(0xe7L << 40 | 0x37L << 0) // load vreg with length.11161117//--- Load (register) ---11181119#define VLR_ZOPC (unsigned long)(0xe7L << 40 | 0x56L << 0) // copy full vreg (128 bit)1120#define VLGV_ZOPC (unsigned long)(0xe7L << 40 | 0x21L << 0) // copy vreg element -> GR1121#define VLVG_ZOPC (unsigned long)(0xe7L << 40 | 0x22L << 0) // copy GR -> vreg element1122#define VLVGP_ZOPC (unsigned long)(0xe7L << 40 | 0x62L << 0) // copy GR2, GR3 (disjoint pair) -> vreg11231124// vector register pack: cut in half the size the source vector elements1125#define VPK_ZOPC (unsigned long)(0xe7L << 40 | 0x94L << 0) // just cut1126#define VPKS_ZOPC (unsigned long)(0xe7L << 40 | 0x97L << 0) // saturate as signed values1127#define VPKLS_ZOPC (unsigned long)(0xe7L << 40 | 0x95L << 0) // saturate as unsigned values11281129// vector register unpack: double in size the source vector elements1130#define VUPH_ZOPC (unsigned long)(0xe7L << 40 | 0xd7L << 0) // signed, left half of the source vector elements1131#define VUPLH_ZOPC (unsigned long)(0xe7L << 40 | 0xd5L << 0) // unsigned, left half of the source vector elements1132#define VUPL_ZOPC (unsigned long)(0xe7L << 40 | 0xd6L << 0) // signed, right half of the source vector elements1133#define VUPLL_ZOPC (unsigned long)(0xe7L << 40 | 0xd4L << 0) // unsigned, right half of the source vector element11341135// vector register merge1136#define VMRH_ZOPC (unsigned long)(0xe7L << 40 | 0x61L << 0) // register merge high (left half of source registers)1137#define VMRL_ZOPC (unsigned long)(0xe7L << 40 | 0x60L << 0) // register merge low (right half of source registers)11381139// vector register permute1140#define VPERM_ZOPC (unsigned long)(0xe7L << 40 | 0x8cL << 0) // vector permute1141#define VPDI_ZOPC (unsigned long)(0xe7L << 40 | 0x84L << 0) // vector permute DW immediate11421143// vector register replicate1144#define VREP_ZOPC (unsigned long)(0xe7L << 40 | 0x4dL << 0) // vector replicate1145#define VREPI_ZOPC (unsigned long)(0xe7L << 40 | 0x45L << 0) // vector replicate immediate1146#define VSEL_ZOPC (unsigned long)(0xe7L << 40 | 0x8dL << 0) // vector select11471148#define VSEG_ZOPC (unsigned long)(0xe7L << 40 | 0x5fL << 0) // vector sign-extend to DW (rightmost element in each DW).11491150//--- Load (immediate) ---11511152#define VLEIB_ZOPC (unsigned long)(0xe7L << 40 | 0x40L << 0) // load vreg element (16 bit imm to 8 bit)1153#define VLEIH_ZOPC (unsigned long)(0xe7L << 40 | 0x41L << 0) // load vreg element (16 bit imm to 16 bit)1154#define VLEIF_ZOPC (unsigned long)(0xe7L << 40 | 0x43L << 0) // load vreg element (16 bit imm to 32 bit)1155#define VLEIG_ZOPC (unsigned long)(0xe7L << 40 | 0x42L << 0) // load vreg element (16 bit imm to 64 bit)11561157//--- Store ---11581159#define VSTM_ZOPC (unsigned long)(0xe7L << 40 | 0x3eL << 0) // store full vreg range (n * 128 bit)1160#define VST_ZOPC (unsigned long)(0xe7L << 40 | 0x0eL << 0) // store full vreg (128 bit)1161#define VSTEB_ZOPC (unsigned long)(0xe7L << 40 | 0x08L << 0) // store vreg element (8 bit)1162#define VSTEH_ZOPC (unsigned long)(0xe7L << 40 | 0x09L << 0) // store vreg element (16 bit)1163#define VSTEF_ZOPC (unsigned long)(0xe7L << 40 | 0x0bL << 0) // store vreg element (32 bit)1164#define VSTEG_ZOPC (unsigned long)(0xe7L << 40 | 0x0aL << 0) // store vreg element (64 bit)1165#define VSTL_ZOPC (unsigned long)(0xe7L << 40 | 0x3fL << 0) // store vreg with length.11661167//--- Misc ---11681169#define VGM_ZOPC (unsigned long)(0xe7L << 40 | 0x46L << 0) // generate bit mask, [start..end] = '1', else '0'1170#define VGBM_ZOPC (unsigned long)(0xe7L << 40 | 0x44L << 0) // generate byte mask, bits(imm16) -> bytes11711172//---< Vector Arithmetic Instructions >---11731174// Load1175#define VLC_ZOPC (unsigned long)(0xe7L << 40 | 0xdeL << 0) // V1 := -V2, element size = 2**m1176#define VLP_ZOPC (unsigned long)(0xe7L << 40 | 0xdfL << 0) // V1 := |V2|, element size = 2**m11771178// ADD1179#define VA_ZOPC (unsigned long)(0xe7L << 40 | 0xf3L << 0) // V1 := V2 + V3, element size = 2**m1180#define VACC_ZOPC (unsigned long)(0xe7L << 40 | 0xf1L << 0) // V1 := carry(V2 + V3), element size = 2**m11811182// SUB1183#define VS_ZOPC (unsigned long)(0xe7L << 40 | 0xf7L << 0) // V1 := V2 - V3, element size = 2**m1184#define VSCBI_ZOPC (unsigned long)(0xe7L << 40 | 0xf5L << 0) // V1 := borrow(V2 - V3), element size = 2**m11851186// MUL1187#define VML_ZOPC (unsigned long)(0xe7L << 40 | 0xa2L << 0) // V1 := V2 * V3, element size = 2**m1188#define VMH_ZOPC (unsigned long)(0xe7L << 40 | 0xa3L << 0) // V1 := V2 * V3, element size = 2**m1189#define VMLH_ZOPC (unsigned long)(0xe7L << 40 | 0xa1L << 0) // V1 := V2 * V3, element size = 2**m, unsigned1190#define VME_ZOPC (unsigned long)(0xe7L << 40 | 0xa6L << 0) // V1 := V2 * V3, element size = 2**m1191#define VMLE_ZOPC (unsigned long)(0xe7L << 40 | 0xa4L << 0) // V1 := V2 * V3, element size = 2**m, unsigned1192#define VMO_ZOPC (unsigned long)(0xe7L << 40 | 0xa7L << 0) // V1 := V2 * V3, element size = 2**m1193#define VMLO_ZOPC (unsigned long)(0xe7L << 40 | 0xa5L << 0) // V1 := V2 * V3, element size = 2**m, unsigned11941195// MUL & ADD1196#define VMAL_ZOPC (unsigned long)(0xe7L << 40 | 0xaaL << 0) // V1 := V2 * V3 + V4, element size = 2**m1197#define VMAH_ZOPC (unsigned long)(0xe7L << 40 | 0xabL << 0) // V1 := V2 * V3 + V4, element size = 2**m1198#define VMALH_ZOPC (unsigned long)(0xe7L << 40 | 0xa9L << 0) // V1 := V2 * V3 + V4, element size = 2**m, unsigned1199#define VMAE_ZOPC (unsigned long)(0xe7L << 40 | 0xaeL << 0) // V1 := V2 * V3 + V4, element size = 2**m1200#define VMALE_ZOPC (unsigned long)(0xe7L << 40 | 0xacL << 0) // V1 := V2 * V3 + V4, element size = 2**m, unsigned1201#define VMAO_ZOPC (unsigned long)(0xe7L << 40 | 0xafL << 0) // V1 := V2 * V3 + V4, element size = 2**m1202#define VMALO_ZOPC (unsigned long)(0xe7L << 40 | 0xadL << 0) // V1 := V2 * V3 + V4, element size = 2**m, unsigned12031204// Vector SUM1205#define VSUM_ZOPC (unsigned long)(0xe7L << 40 | 0x64L << 0) // V1[j] := toFW(sum(V2[i]) + V3[j]), subelements: byte or HW1206#define VSUMG_ZOPC (unsigned long)(0xe7L << 40 | 0x65L << 0) // V1[j] := toDW(sum(V2[i]) + V3[j]), subelements: HW or FW1207#define VSUMQ_ZOPC (unsigned long)(0xe7L << 40 | 0x67L << 0) // V1[j] := toQW(sum(V2[i]) + V3[j]), subelements: FW or DW12081209// Average1210#define VAVG_ZOPC (unsigned long)(0xe7L << 40 | 0xf2L << 0) // V1 := (V2+V3+1)/2, signed, element size = 2**m1211#define VAVGL_ZOPC (unsigned long)(0xe7L << 40 | 0xf0L << 0) // V1 := (V2+V3+1)/2, unsigned, element size = 2**m12121213// VECTOR Galois Field Multiply Sum1214#define VGFM_ZOPC (unsigned long)(0xe7L << 40 | 0xb4L << 0)1215#define VGFMA_ZOPC (unsigned long)(0xe7L << 40 | 0xbcL << 0)12161217//---< Vector Logical Instructions >---12181219// AND1220#define VN_ZOPC (unsigned long)(0xe7L << 40 | 0x68L << 0) // V1 := V2 & V3, element size = 2**m1221#define VNC_ZOPC (unsigned long)(0xe7L << 40 | 0x69L << 0) // V1 := V2 & ~V3, element size = 2**m12221223// XOR1224#define VX_ZOPC (unsigned long)(0xe7L << 40 | 0x6dL << 0) // V1 := V2 ^ V3, element size = 2**m12251226// NOR1227#define VNO_ZOPC (unsigned long)(0xe7L << 40 | 0x6bL << 0) // V1 := !(V2 | V3), element size = 2**m12281229// OR1230#define VO_ZOPC (unsigned long)(0xe7L << 40 | 0x6aL << 0) // V1 := V2 | V3, element size = 2**m12311232// Comparison (element-wise)1233#define VCEQ_ZOPC (unsigned long)(0xe7L << 40 | 0xf8L << 0) // V1 := (V2 == V3) ? 0xffff : 0x0000, element size = 2**m1234#define VCH_ZOPC (unsigned long)(0xe7L << 40 | 0xfbL << 0) // V1 := (V2 > V3) ? 0xffff : 0x0000, element size = 2**m, signed1235#define VCHL_ZOPC (unsigned long)(0xe7L << 40 | 0xf9L << 0) // V1 := (V2 > V3) ? 0xffff : 0x0000, element size = 2**m, unsigned12361237// Max/Min (element-wise)1238#define VMX_ZOPC (unsigned long)(0xe7L << 40 | 0xffL << 0) // V1 := (V2 > V3) ? V2 : V3, element size = 2**m, signed1239#define VMXL_ZOPC (unsigned long)(0xe7L << 40 | 0xfdL << 0) // V1 := (V2 > V3) ? V2 : V3, element size = 2**m, unsigned1240#define VMN_ZOPC (unsigned long)(0xe7L << 40 | 0xfeL << 0) // V1 := (V2 < V3) ? V2 : V3, element size = 2**m, signed1241#define VMNL_ZOPC (unsigned long)(0xe7L << 40 | 0xfcL << 0) // V1 := (V2 < V3) ? V2 : V3, element size = 2**m, unsigned12421243// Leading/Trailing Zeros, population count1244#define VCLZ_ZOPC (unsigned long)(0xe7L << 40 | 0x53L << 0) // V1 := leadingzeros(V2), element size = 2**m1245#define VCTZ_ZOPC (unsigned long)(0xe7L << 40 | 0x52L << 0) // V1 := trailingzeros(V2), element size = 2**m1246#define VPOPCT_ZOPC (unsigned long)(0xe7L << 40 | 0x50L << 0) // V1 := popcount(V2), bytewise!!12471248// Rotate/Shift1249#define VERLLV_ZOPC (unsigned long)(0xe7L << 40 | 0x73L << 0) // V1 := rotateleft(V2), rotate count in V3 element1250#define VERLL_ZOPC (unsigned long)(0xe7L << 40 | 0x33L << 0) // V1 := rotateleft(V3), rotate count from d2(b2).1251#define VERIM_ZOPC (unsigned long)(0xe7L << 40 | 0x72L << 0) // Rotate then insert under mask. Read Principles of Operation!!12521253#define VESLV_ZOPC (unsigned long)(0xe7L << 40 | 0x70L << 0) // V1 := SLL(V2, V3), unsigned, element-wise1254#define VESL_ZOPC (unsigned long)(0xe7L << 40 | 0x30L << 0) // V1 := SLL(V3), unsigned, shift count from d2(b2).12551256#define VESRAV_ZOPC (unsigned long)(0xe7L << 40 | 0x7AL << 0) // V1 := SRA(V2, V3), signed, element-wise1257#define VESRA_ZOPC (unsigned long)(0xe7L << 40 | 0x3AL << 0) // V1 := SRA(V3), signed, shift count from d2(b2).1258#define VESRLV_ZOPC (unsigned long)(0xe7L << 40 | 0x78L << 0) // V1 := SRL(V2, V3), unsigned, element-wise1259#define VESRL_ZOPC (unsigned long)(0xe7L << 40 | 0x38L << 0) // V1 := SRL(V3), unsigned, shift count from d2(b2).12601261#define VSL_ZOPC (unsigned long)(0xe7L << 40 | 0x74L << 0) // V1 := SLL(V2), unsigned, bit-count1262#define VSLB_ZOPC (unsigned long)(0xe7L << 40 | 0x75L << 0) // V1 := SLL(V2), unsigned, byte-count1263#define VSLDB_ZOPC (unsigned long)(0xe7L << 40 | 0x77L << 0) // V1 := SLL((V2,V3)), unsigned, byte-count12641265#define VSRA_ZOPC (unsigned long)(0xe7L << 40 | 0x7eL << 0) // V1 := SRA(V2), signed, bit-count1266#define VSRAB_ZOPC (unsigned long)(0xe7L << 40 | 0x7fL << 0) // V1 := SRA(V2), signed, byte-count1267#define VSRL_ZOPC (unsigned long)(0xe7L << 40 | 0x7cL << 0) // V1 := SRL(V2), unsigned, bit-count1268#define VSRLB_ZOPC (unsigned long)(0xe7L << 40 | 0x7dL << 0) // V1 := SRL(V2), unsigned, byte-count12691270// Test under Mask1271#define VTM_ZOPC (unsigned long)(0xe7L << 40 | 0xd8L << 0) // Like TM, set CC according to state of selected bits.12721273//---< Vector String Instructions >---1274#define VFAE_ZOPC (unsigned long)(0xe7L << 40 | 0x82L << 0) // Find any element1275#define VFEE_ZOPC (unsigned long)(0xe7L << 40 | 0x80L << 0) // Find element equal1276#define VFENE_ZOPC (unsigned long)(0xe7L << 40 | 0x81L << 0) // Find element not equal1277#define VSTRC_ZOPC (unsigned long)(0xe7L << 40 | 0x8aL << 0) // String range compare1278#define VISTR_ZOPC (unsigned long)(0xe7L << 40 | 0x5cL << 0) // Isolate String127912801281//--------------------------------1282//-- Miscellaneous Operations --1283//--------------------------------12841285// Execute1286#define EX_ZOPC (unsigned int)(68L << 24)1287#define EXRL_ZOPC (unsigned long)(0xc6L << 40 | 0x00L << 32) // z1012881289// Compare and Swap1290#define CS_ZOPC (unsigned int)(0xba << 24)1291#define CSY_ZOPC (unsigned long)(0xebL << 40 | 0x14L)1292#define CSG_ZOPC (unsigned long)(0xebL << 40 | 0x30L)12931294// Interlocked-Update1295#define LAA_ZOPC (unsigned long)(0xebL << 40 | 0xf8L) // z1961296#define LAAG_ZOPC (unsigned long)(0xebL << 40 | 0xe8L) // z1961297#define LAAL_ZOPC (unsigned long)(0xebL << 40 | 0xfaL) // z1961298#define LAALG_ZOPC (unsigned long)(0xebL << 40 | 0xeaL) // z1961299#define LAN_ZOPC (unsigned long)(0xebL << 40 | 0xf4L) // z1961300#define LANG_ZOPC (unsigned long)(0xebL << 40 | 0xe4L) // z1961301#define LAX_ZOPC (unsigned long)(0xebL << 40 | 0xf7L) // z1961302#define LAXG_ZOPC (unsigned long)(0xebL << 40 | 0xe7L) // z1961303#define LAO_ZOPC (unsigned long)(0xebL << 40 | 0xf6L) // z1961304#define LAOG_ZOPC (unsigned long)(0xebL << 40 | 0xe6L) // z19613051306// System Functions1307#define STCKF_ZOPC (unsigned int)(0xb2 << 24 | 0x7c << 16)1308#define STFLE_ZOPC (unsigned int)(0xb2 << 24 | 0xb0 << 16)1309#define ECTG_ZOPC (unsigned long)(0xc8L <<40 | 0x01L << 32) // z101310#define ECAG_ZOPC (unsigned long)(0xebL <<40 | 0x4cL) // z1013111312// Execution Prediction1313#define PFD_ZOPC (unsigned long)(0xe3L <<40 | 0x36L) // z101314#define PFDRL_ZOPC (unsigned long)(0xc6L <<40 | 0x02L << 32) // z101315#define BPP_ZOPC (unsigned long)(0xc7L <<40) // branch prediction preload -- EC121316#define BPRP_ZOPC (unsigned long)(0xc5L <<40) // branch prediction preload -- EC1213171318// Transaction Control1319#define TBEGIN_ZOPC (unsigned long)(0xe560L << 32) // tx begin -- EC121320#define TBEGINC_ZOPC (unsigned long)(0xe561L << 32) // tx begin (constrained) -- EC121321#define TEND_ZOPC (unsigned int)(0xb2f8 << 16) // tx end -- EC121322#define TABORT_ZOPC (unsigned int)(0xb2fc << 16) // tx abort -- EC121323#define ETND_ZOPC (unsigned int)(0xb2ec << 16) // tx nesting depth -- EC121324#define PPA_ZOPC (unsigned int)(0xb2e8 << 16) // tx processor assist -- EC1213251326// Crypto and Checksum1327#define CKSM_ZOPC (unsigned int)(0xb2 << 24 | 0x41 << 16) // checksum. This is NOT CRC321328#define KM_ZOPC (unsigned int)(0xb9 << 24 | 0x2e << 16) // cipher1329#define KMC_ZOPC (unsigned int)(0xb9 << 24 | 0x2f << 16) // cipher1330#define KMA_ZOPC (unsigned int)(0xb9 << 24 | 0x29 << 16) // cipher1331#define KMF_ZOPC (unsigned int)(0xb9 << 24 | 0x2a << 16) // cipher1332#define KMCTR_ZOPC (unsigned int)(0xb9 << 24 | 0x2d << 16) // cipher1333#define KMO_ZOPC (unsigned int)(0xb9 << 24 | 0x2b << 16) // cipher1334#define KIMD_ZOPC (unsigned int)(0xb9 << 24 | 0x3e << 16) // SHA (msg digest)1335#define KLMD_ZOPC (unsigned int)(0xb9 << 24 | 0x3f << 16) // SHA (msg digest)1336#define KMAC_ZOPC (unsigned int)(0xb9 << 24 | 0x1e << 16) // Message Authentication Code13371338// Various1339#define TCEB_ZOPC (unsigned long)(237L << 40 | 16)1340#define TCDB_ZOPC (unsigned long)(237L << 40 | 17)1341#define TAM_ZOPC (unsigned long)(267)13421343#define FLOGR_ZOPC (unsigned int)(0xb9 << 24 | 0x83 << 16)1344#define POPCNT_ZOPC (unsigned int)(0xb9e1 << 16)1345#define AHHHR_ZOPC (unsigned int)(0xb9c8 << 16)1346#define AHHLR_ZOPC (unsigned int)(0xb9d8 << 16)134713481349// OpCode field masks13501351#define RI_MASK (unsigned int)(0xff << 24 | 0x0f << 16)1352#define RRE_MASK (unsigned int)(0xff << 24 | 0xff << 16)1353#define RSI_MASK (unsigned int)(0xff << 24)1354#define RIE_MASK (unsigned long)(0xffL << 40 | 0xffL)1355#define RIL_MASK (unsigned long)(0xffL << 40 | 0x0fL << 32)13561357#define BASR_MASK (unsigned int)(0xff << 8)1358#define BCR_MASK (unsigned int)(0xff << 8)1359#define BRC_MASK (unsigned int)(0xff << 24 | 0x0f << 16)1360#define LGHI_MASK (unsigned int)(0xff << 24 | 0x0f << 16)1361#define LLI_MASK (unsigned int)(0xff << 24 | 0x0f << 16)1362#define II_MASK (unsigned int)(0xff << 24 | 0x0f << 16)1363#define LLIF_MASK (unsigned long)(0xffL << 40 | 0x0fL << 32)1364#define IIF_MASK (unsigned long)(0xffL << 40 | 0x0fL << 32)1365#define BRASL_MASK (unsigned long)(0xffL << 40 | 0x0fL << 32)1366#define TM_MASK (unsigned int)(0xff << 24)1367#define TMY_MASK (unsigned long)(0xffL << 40 | 0xffL)1368#define LB_MASK (unsigned long)(0xffL << 40 | 0xffL)1369#define LH_MASK (unsigned int)(0xff << 24)1370#define L_MASK (unsigned int)(0xff << 24)1371#define LY_MASK (unsigned long)(0xffL << 40 | 0xffL)1372#define LG_MASK (unsigned long)(0xffL << 40 | 0xffL)1373#define LLGH_MASK (unsigned long)(0xffL << 40 | 0xffL)1374#define LLGF_MASK (unsigned long)(0xffL << 40 | 0xffL)1375#define SLAG_MASK (unsigned long)(0xffL << 40 | 0xffL)1376#define LARL_MASK (unsigned long)(0xff0fL << 32)1377#define LGRL_MASK (unsigned long)(0xff0fL << 32)1378#define LE_MASK (unsigned int)(0xff << 24)1379#define LD_MASK (unsigned int)(0xff << 24)1380#define ST_MASK (unsigned int)(0xff << 24)1381#define STC_MASK (unsigned int)(0xff << 24)1382#define STG_MASK (unsigned long)(0xffL << 40 | 0xffL)1383#define STH_MASK (unsigned int)(0xff << 24)1384#define STE_MASK (unsigned int)(0xff << 24)1385#define STD_MASK (unsigned int)(0xff << 24)1386#define CMPBRANCH_MASK (unsigned long)(0xffL << 40 | 0xffL)1387#define REL_LONG_MASK (unsigned long)(0xff0fL << 32)13881389public:1390// Condition code masks. Details:1391// - Mask bit#3 must be zero for all compare and branch/trap instructions to ensure1392// future compatibility.1393// - For all arithmetic instructions which set the condition code, mask bit#31394// indicates overflow ("unordered" in float operations).1395// - "unordered" float comparison results have to be treated as low.1396// - When overflow/unordered is detected, none of the branch conditions is true,1397// except for bcondOverflow/bcondNotOrdered and bcondAlways.1398// - For INT comparisons, the inverse condition can be calculated as (14-cond).1399// - For FLOAT comparisons, the inverse condition can be calculated as (15-cond).1400enum branch_condition {1401bcondNever = 0,1402bcondAlways = 15,14031404// Specific names. Make use of lightweight sync.1405// Full and lightweight sync operation.1406bcondFullSync = 15,1407bcondLightSync = 14,1408bcondNop = 0,14091410// arithmetic compare instructions1411// arithmetic load and test, insert instructions1412// Mask bit#3 must be zero for future compatibility.1413bcondEqual = 8,1414bcondNotEqual = 6,1415bcondLow = 4,1416bcondNotLow = 10,1417bcondHigh = 2,1418bcondNotHigh = 12,1419// arithmetic calculation instructions1420// Mask bit#3 indicates overflow if detected by instr.1421// Mask bit#3 = 0 (overflow is not handled by compiler).1422bcondOverflow = 1,1423bcondNotOverflow = 14,1424bcondZero = bcondEqual,1425bcondNotZero = bcondNotEqual,1426bcondNegative = bcondLow,1427bcondNotNegative = bcondNotLow,1428bcondPositive = bcondHigh,1429bcondNotPositive = bcondNotHigh,1430bcondNotOrdered = 1, // float comparisons1431bcondOrdered = 14, // float comparisons1432bcondLowOrNotOrdered = bcondLow | bcondNotOrdered, // float comparisons1433bcondHighOrNotOrdered = bcondHigh | bcondNotOrdered, // float comparisons1434bcondNotLowOrNotOrdered = bcondNotLow | bcondNotOrdered, // float comparisons1435bcondNotHighOrNotOrdered = bcondNotHigh | bcondNotOrdered, // float comparisons1436bcondNotEqualOrNotOrdered = bcondNotEqual | bcondNotOrdered, // float comparisons1437// unsigned arithmetic calculation instructions1438// Mask bit#0 is not used by these instructions.1439// There is no indication of overflow for these instr.1440bcondLogZero_NoCarry = 8,1441bcondLogZero_Carry = 2,1442// bcondLogZero_Borrow = 8, // This CC is never generated.1443bcondLogZero_NoBorrow = 2,1444bcondLogZero = bcondLogZero_Carry | bcondLogZero_NoCarry,1445bcondLogNotZero_NoCarry = 4,1446bcondLogNotZero_Carry = 1,1447bcondLogNotZero_Borrow = 4,1448bcondLogNotZero_NoBorrow = 1,1449bcondLogNotZero = bcondLogNotZero_Carry | bcondLogNotZero_NoCarry,1450bcondLogCarry = bcondLogZero_Carry | bcondLogNotZero_Carry,1451bcondLogBorrow = /* bcondLogZero_Borrow | */ bcondLogNotZero_Borrow,1452// Vector compare instructions1453bcondVAlltrue = 8, // All vector elements evaluate true1454bcondVMixed = 4, // Some vector elements evaluate true, some false1455bcondVAllfalse = 1, // All vector elements evaluate false1456// string search instructions1457bcondFound = 4,1458bcondNotFound = 2,1459bcondInterrupted = 1,1460// bit test instructions1461bcondAllZero = 8,1462bcondMixed = 6,1463bcondAllOne = 1,1464bcondNotAllZero = 7 // for tmll1465};14661467enum Condition {1468// z/Architecture1469negative = 0,1470less = 0,1471positive = 1,1472greater = 1,1473zero = 2,1474equal = 2,1475summary_overflow = 3,1476};14771478// Rounding mode for float-2-int conversions.1479enum RoundingMode {1480current_mode = 0, // Mode taken from FPC register.1481biased_to_nearest = 1,1482to_nearest = 4,1483to_zero = 5,1484to_plus_infinity = 6,1485to_minus_infinity = 71486};14871488// Vector Register Element Type.1489enum VRegElemType {1490VRET_BYTE = 0,1491VRET_HW = 1,1492VRET_FW = 2,1493VRET_DW = 3,1494VRET_QW = 41495};14961497// Vector Operation Result Control.1498// This is a set of flags used in some vector instructions to control1499// the result (side) effects of instruction execution.1500enum VOpRC {1501VOPRC_CCSET = 0b0001, // set the CC.1502VOPRC_CCIGN = 0b0000, // ignore, don't set CC.1503VOPRC_ZS = 0b0010, // Zero Search. Additional, elementwise, comparison against zero.1504VOPRC_NOZS = 0b0000, // No Zero Search.1505VOPRC_RTBYTEIX = 0b0100, // generate byte index to lowest element with true comparison.1506VOPRC_RTBITVEC = 0b0000, // generate bit vector, all 1s for true, all 0s for false element comparisons.1507VOPRC_INVERT = 0b1000, // invert comparison results.1508VOPRC_NOINVERT = 0b0000 // use comparison results as is, do not invert.1509};15101511// Inverse condition code, i.e. determine "15 - cc" for a given condition code cc.1512static branch_condition inverse_condition(branch_condition cc);1513static branch_condition inverse_float_condition(branch_condition cc);151415151516//-----------------------------------------------1517// instruction property getter methods1518//-----------------------------------------------15191520// Calculate length of instruction.1521static unsigned int instr_len(unsigned char *instr);15221523// Longest instructions are 6 bytes on z/Architecture.1524static unsigned int instr_maxlen() { return 6; }15251526// Average instruction is 4 bytes on z/Architecture (just a guess).1527static unsigned int instr_avglen() { return 4; }15281529// Shortest instructions are 2 bytes on z/Architecture.1530static unsigned int instr_minlen() { return 2; }15311532// Move instruction at pc right-justified into passed long int.1533// Return instr len in bytes as function result.1534static unsigned int get_instruction(unsigned char *pc, unsigned long *instr);15351536// Move instruction in passed (long int) into storage at pc.1537// This code is _NOT_ MT-safe!!1538static void set_instruction(unsigned char *pc, unsigned long instr, unsigned int len) {1539memcpy(pc, ((unsigned char *)&instr)+sizeof(unsigned long)-len, len);1540}154115421543//------------------------------------------1544// instruction field test methods1545//------------------------------------------15461547// Only used once in s390.ad to implement Matcher::is_short_branch_offset().1548static bool is_within_range_of_RelAddr16(address target, address origin) {1549return RelAddr::is_in_range_of_RelAddr16(target, origin);1550}155115521553//----------------------------------1554// some diagnostic output1555//----------------------------------15561557static void print_dbg_msg(outputStream* out, unsigned long inst, const char* msg, int ilen) PRODUCT_RETURN;1558static void dump_code_range(outputStream* out, address pc, const unsigned int range, const char* msg = " ") PRODUCT_RETURN;15591560protected:15611562//-------------------------------------------------------1563// instruction field helper methods (internal)1564//-------------------------------------------------------15651566// Return a mask of 1s between hi_bit and lo_bit (inclusive).1567static long fmask(unsigned int hi_bit, unsigned int lo_bit) {1568assert(hi_bit >= lo_bit && hi_bit < 48, "bad bits");1569return ((1L<<(hi_bit-lo_bit+1)) - 1) << lo_bit;1570}15711572// extract u_field1573// unsigned value1574static long inv_u_field(long x, int hi_bit, int lo_bit) {1575return (x & fmask(hi_bit, lo_bit)) >> lo_bit;1576}15771578// extract s_field1579// Signed value, may need sign extension.1580static long inv_s_field(long x, int hi_bit, int lo_bit) {1581x = inv_u_field(x, hi_bit, lo_bit);1582// Highest extracted bit set -> sign extension.1583return (x >= (1L<<(hi_bit-lo_bit)) ? x | ((-1L)<<(hi_bit-lo_bit)) : x);1584}15851586// Extract primary opcode from instruction.1587static int z_inv_op(int x) { return inv_u_field(x, 31, 24); }1588static int z_inv_op(long x) { return inv_u_field(x, 47, 40); }15891590static 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.1591static 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.1592static int inv_simm16_48(long x) { return (inv_s_field(x, 31, 16)); } // 6-byte instructions only1593static int inv_simm16(long x) { return (inv_s_field(x, 15, 0)); } // 4-byte instructions only1594static int inv_simm20(long x) { return (inv_u_field(x, 27, 16) | // 6-byte instructions only1595inv_s_field(x, 15, 8)<<12); }1596static int inv_simm32(long x) { return (inv_s_field(x, 31, 0)); } // 6-byte instructions only1597static int inv_uimm12(long x) { return (inv_u_field(x, 11, 0)); } // 4-byte instructions only15981599// Encode u_field from long value.1600static long u_field(long x, int hi_bit, int lo_bit) {1601long r = x << lo_bit;1602assert((r & ~fmask(hi_bit, lo_bit)) == 0, "value out of range");1603assert(inv_u_field(r, hi_bit, lo_bit) == x, "just checking");1604return r;1605}16061607static int64_t rsmask_48( Address a) { assert(a.is_RSform(), "bad address format"); return rsmask_48( a.disp12(), a.base()); }1608static int64_t rxmask_48( Address a) { if (a.is_RXform()) { return rxmask_48( a.disp12(), a.index(), a.base()); }1609else if (a.is_RSform()) { return rsmask_48( a.disp12(), a.base()); }1610else { guarantee(false, "bad address format"); return 0; }1611}1612static int64_t rsymask_48(Address a) { assert(a.is_RSYform(), "bad address format"); return rsymask_48(a.disp20(), a.base()); }1613static int64_t rxymask_48(Address a) { if (a.is_RXYform()) { return rxymask_48( a.disp20(), a.index(), a.base()); }1614else if (a.is_RSYform()) { return rsymask_48( a.disp20(), a.base()); }1615else { guarantee(false, "bad address format"); return 0; }1616}16171618static int64_t rsmask_48( int64_t d2, Register b2) { return uimm12(d2, 20, 48) | regz(b2, 16, 48); }1619static int64_t rxmask_48( int64_t d2, Register x2, Register b2) { return uimm12(d2, 20, 48) | reg(x2, 12, 48) | regz(b2, 16, 48); }1620static int64_t rsymask_48(int64_t d2, Register b2) { return simm20(d2) | regz(b2, 16, 48); }1621static int64_t rxymask_48(int64_t d2, Register x2, Register b2) { return simm20(d2) | reg(x2, 12, 48) | regz(b2, 16, 48); }16221623// Address calculated from d12(vx,b) - vx is vector index register.1624static int64_t rvmask_48( int64_t d2, VectorRegister x2, Register b2) { return uimm12(d2, 20, 48) | vreg(x2, 12) | regz(b2, 16, 48); }16251626static int64_t vreg_mask(VectorRegister v, int pos) {1627return vreg(v, pos) | v->RXB_mask(pos);1628}16291630// Vector Element Size Control. 4-bit field which indicates the size of the vector elements.1631static int64_t vesc_mask(int64_t size, int min_size, int max_size, int pos) {1632// min_size - minimum element size. Not all instructions support element sizes beginning with "byte".1633// max_size - maximum element size. Not all instructions support element sizes up to "QW".1634assert((min_size <= size) && (size <= max_size), "element size control out of range");1635return uimm4(size, pos, 48);1636}16371638// Vector Element IndeX. 4-bit field which indexes the target vector element.1639static int64_t veix_mask(int64_t ix, int el_size, int pos) {1640// el_size - size of the vector element. This is a VRegElemType enum value.1641// ix - vector element index.1642int max_ix = -1;1643switch (el_size) {1644case VRET_BYTE: max_ix = 15; break;1645case VRET_HW: max_ix = 7; break;1646case VRET_FW: max_ix = 3; break;1647case VRET_DW: max_ix = 1; break;1648case VRET_QW: max_ix = 0; break;1649default: guarantee(false, "bad vector element size %d", el_size); break;1650}1651assert((0 <= ix) && (ix <= max_ix), "element size out of range (0 <= %ld <= %d)", ix, max_ix);1652return uimm4(ix, pos, 48);1653}16541655// Vector Operation Result Control. 4-bit field.1656static int64_t voprc_any(int64_t flags, int pos, int64_t allowed_flags = 0b1111) {1657assert((flags & allowed_flags) == flags, "Invalid VOPRC_* flag combination: %d", (int)flags);1658return uimm4(flags, pos, 48);1659}16601661// Vector Operation Result Control. Condition code setting.1662static int64_t voprc_ccmask(int64_t flags, int pos) {1663return voprc_any(flags, pos, VOPRC_CCIGN | VOPRC_CCSET);1664}16651666public:16671668//--------------------------------------------------1669// instruction field construction methods1670//--------------------------------------------------16711672// Compute relative address (32 bit) for branch.1673// Only used once in nativeInst_s390.cpp.1674static intptr_t z_pcrel_off(address dest, address pc) {1675return RelAddr::pcrel_off32(dest, pc);1676}16771678// Extract 20-bit signed displacement.1679// Only used in disassembler_s390.cpp for temp enhancements.1680static int inv_simm20_xx(address iLoc) {1681unsigned long instr = 0;1682unsigned long iLen = get_instruction(iLoc, &instr);1683return inv_simm20(instr);1684}16851686// unsigned immediate, in low bits, nbits long1687static long uimm(long x, int nbits) {1688assert(Immediate::is_uimm(x, nbits), "unsigned constant out of range");1689return x & fmask(nbits - 1, 0);1690}16911692// Cast '1' to long to avoid sign extension if nbits = 32.1693// signed immediate, in low bits, nbits long1694static long simm(long x, int nbits) {1695assert(Immediate::is_simm(x, nbits), "value out of range");1696return x & fmask(nbits - 1, 0);1697}16981699static long imm(int64_t x, int nbits) {1700// Assert that x can be represented with nbits bits ignoring the sign bits,1701// i.e. the more higher bits should all be 0 or 1.1702assert((x >> nbits) == 0 || (x >> nbits) == -1, "value out of range");1703return x & fmask(nbits-1, 0);1704}17051706// A 20-bit displacement is only in instructions of the1707// RSY, RXY, or SIY format. In these instructions, the D1708// field consists of a DL (low) field in bit positions 20-311709// and of a DH (high) field in bit positions 32-39. The1710// value of the displacement is formed by appending the1711// contents of the DH field to the left of the contents of1712// the DL field.1713static long simm20(int64_t ui20) {1714assert(Immediate::is_simm(ui20, 20), "value out of range");1715return ( ((ui20 & 0xfffL) << (48-32)) | // DL1716(((ui20 >> 12) & 0xffL) << (48-40))); // DH1717}17181719static long reg(Register r, int s, int len) { return u_field(r->encoding(), (len-s)-1, (len-s)-4); }1720static long reg(int r, int s, int len) { return u_field(r, (len-s)-1, (len-s)-4); }1721static long regt(Register r, int s, int len) { return reg(r, s, len); }1722static long regz(Register r, int s, int len) { assert(r != Z_R0, "cannot use register R0 in memory access"); return reg(r, s, len); }17231724static long uimm4( int64_t ui4, int s, int len) { return uimm(ui4, 4) << (len-s-4); }1725static long uimm6( int64_t ui6, int s, int len) { return uimm(ui6, 6) << (len-s-6); }1726static long uimm8( int64_t ui8, int s, int len) { return uimm(ui8, 8) << (len-s-8); }1727static long uimm12(int64_t ui12, int s, int len) { return uimm(ui12, 12) << (len-s-12); }1728static long uimm16(int64_t ui16, int s, int len) { return uimm(ui16, 16) << (len-s-16); }1729static long uimm32(int64_t ui32, int s, int len) { return uimm((unsigned)ui32, 32) << (len-s-32); } // prevent sign extension17301731static long simm8( int64_t si8, int s, int len) { return simm(si8, 8) << (len-s-8); }1732static long simm12(int64_t si12, int s, int len) { return simm(si12, 12) << (len-s-12); }1733static long simm16(int64_t si16, int s, int len) { return simm(si16, 16) << (len-s-16); }1734static long simm24(int64_t si24, int s, int len) { return simm(si24, 24) << (len-s-24); }1735static long simm32(int64_t si32, int s, int len) { return simm(si32, 32) << (len-s-32); }17361737static long imm8( int64_t i8, int s, int len) { return imm(i8, 8) << (len-s-8); }1738static long imm12(int64_t i12, int s, int len) { return imm(i12, 12) << (len-s-12); }1739static long imm16(int64_t i16, int s, int len) { return imm(i16, 16) << (len-s-16); }1740static long imm24(int64_t i24, int s, int len) { return imm(i24, 24) << (len-s-24); }1741static long imm32(int64_t i32, int s, int len) { return imm(i32, 32) << (len-s-32); }17421743static 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); }17441745static long fregt(FloatRegister r, int s, int len) { return freg(r,s,len); }1746static long freg( FloatRegister r, int s, int len) { return u_field(r->encoding(), (len-s)-1, (len-s)-4); }17471748// Rounding mode for float-2-int conversions.1749static long rounding_mode(RoundingMode m, int s, int len) {1750assert(m != 2 && m != 3, "invalid mode");1751return uimm(m, 4) << (len-s-4);1752}17531754//--------------------------------------------1755// instruction field getter methods1756//--------------------------------------------17571758static int get_imm32(address a, int instruction_number) {1759int imm;1760int *p =((int *)(a + 2 + 6 * instruction_number));1761imm = *p;1762return imm;1763}17641765static short get_imm16(address a, int instruction_number) {1766short imm;1767short *p =((short *)a) + 2 * instruction_number + 1;1768imm = *p;1769return imm;1770}177117721773//--------------------------------------------1774// instruction field setter methods1775//--------------------------------------------17761777static void set_imm32(address a, int64_t s) {1778assert(Immediate::is_simm32(s) || Immediate::is_uimm32(s), "to big");1779int* p = (int *) (a + 2);1780*p = s;1781}17821783static void set_imm16(int* instr, int64_t s) {1784assert(Immediate::is_simm16(s) || Immediate::is_uimm16(s), "to big");1785short* p = ((short *)instr) + 1;1786*p = s;1787}17881789public:17901791static unsigned int align(unsigned int x, unsigned int a) { return ((x + (a - 1)) & ~(a - 1)); }1792static bool is_aligned(unsigned int x, unsigned int a) { return (0 == x % a); }17931794inline void emit_16(int x);1795inline void emit_32(int x);1796inline void emit_48(long x);17971798// Compare and control flow instructions1799// =====================================18001801// See also commodity routines compare64_and_branch(), compare32_and_branch().18021803// compare instructions1804// compare register1805inline void z_cr( Register r1, Register r2); // compare (r1, r2) ; int321806inline void z_cgr( Register r1, Register r2); // compare (r1, r2) ; int641807inline void z_cgfr(Register r1, Register r2); // compare (r1, r2) ; int64 <--> int321808// compare immediate1809inline void z_chi( Register r1, int64_t i2); // compare (r1, i2_imm16) ; int321810inline void z_cfi( Register r1, int64_t i2); // compare (r1, i2_imm32) ; int321811inline void z_cghi(Register r1, int64_t i2); // compare (r1, i2_imm16) ; int641812inline void z_cgfi(Register r1, int64_t i2); // compare (r1, i2_imm32) ; int641813// compare memory1814inline void z_ch( Register r1, const Address &a); // compare (r1, *(a)) ; int32 <--> int161815inline void z_ch( Register r1, int64_t d2, Register x2, Register b2); // compare (r1, *(d2_uimm12+x2+b2)) ; int32 <--> int161816inline void z_c( Register r1, const Address &a); // compare (r1, *(a)) ; int321817inline void z_c( Register r1, int64_t d2, Register x2, Register b2); // compare (r1, *(d2_uimm12+x2+b2)) ; int321818inline void z_cy( Register r1, int64_t d2, Register x2, Register b2); // compare (r1, *(d2_uimm20+x2+b2)) ; int321819inline void z_cy( Register r1, int64_t d2, Register b2); // compare (r1, *(d2_uimm20+x2+b2)) ; int321820inline void z_cy( Register r1, const Address& a); // compare (r1, *(a)) ; int321821//inline void z_cgf(Register r1,const Address &a); // compare (r1, *(a)) ; int64 <--> int321822//inline void z_cgf(Register r1,int64_t d2, Register x2, Register b2);// compare (r1, *(d2_uimm12+x2+b2)) ; int64 <--> int321823inline void z_cg( Register r1, const Address &a); // compare (r1, *(a)) ; int641824inline void z_cg( Register r1, int64_t d2, Register x2, Register b2); // compare (r1, *(d2_imm20+x2+b2)) ; int6418251826// compare logical instructions1827// compare register1828inline void z_clr( Register r1, Register r2); // compare (r1, r2) ; uint321829inline void z_clgr( Register r1, Register r2); // compare (r1, r2) ; uint641830// compare immediate1831inline void z_clfi( Register r1, int64_t i2); // compare (r1, i2_uimm32) ; uint321832inline void z_clgfi(Register r1, int64_t i2); // compare (r1, i2_uimm32) ; uint641833inline void z_cl( Register r1, const Address &a); // compare (r1, *(a) ; uint321834inline void z_cl( Register r1, int64_t d2, Register x2, Register b2);// compare (r1, *(d2_uimm12+x2+b2) ; uint321835inline void z_cly( Register r1, int64_t d2, Register x2, Register b2);// compare (r1, *(d2_uimm20+x2+b2)) ; uint321836inline void z_cly( Register r1, int64_t d2, Register b2); // compare (r1, *(d2_uimm20+x2+b2)) ; uint321837inline void z_cly( Register r1, const Address& a); // compare (r1, *(a)) ; uint321838inline void z_clg( Register r1, const Address &a); // compare (r1, *(a) ; uint641839inline void z_clg( Register r1, int64_t d2, Register x2, Register b2);// compare (r1, *(d2_imm20+x2+b2) ; uint6418401841// test under mask1842inline void z_tmll(Register r1, int64_t i2); // test under mask, see docu1843inline void z_tmlh(Register r1, int64_t i2); // test under mask, see docu1844inline void z_tmhl(Register r1, int64_t i2); // test under mask, see docu1845inline void z_tmhh(Register r1, int64_t i2); // test under mask, see docu18461847// branch instructions1848inline void z_bc( branch_condition m1, int64_t d2, Register x2, Register b2);// branch m1 ? pc = (d2_uimm12+x2+b2)1849inline void z_bcr( branch_condition m1, Register r2); // branch (m1 && r2!=R0) ? pc = r21850inline void z_brc( branch_condition i1, int64_t i2); // branch i1 ? pc = pc + i2_imm161851inline void z_brc( branch_condition i1, address a); // branch i1 ? pc = a1852inline void z_brc( branch_condition i1, Label& L); // branch i1 ? pc = Label1853//inline void z_brcl(branch_condition i1, int64_t i2); // branch i1 ? pc = pc + i2_imm321854inline void z_brcl(branch_condition i1, address a); // branch i1 ? pc = a1855inline void z_brcl(branch_condition i1, Label& L); // branch i1 ? pc = Label1856inline void z_bctgr(Register r1, Register r2); // branch on count r1 -= 1; (r1!=0) ? pc = r2 ; r1 is int6418571858// branch unconditional / always1859inline void z_br(Register r2); // branch to r2, nop if r2 == Z_R0186018611862// See also commodity routines compare64_and_branch(), compare32_and_branch().1863// signed comparison and branch1864inline void z_crb( Register r1, Register r2, branch_condition m3, int64_t d4, Register b4); // (r1 m3 r2) ? goto b4+d4 ; int32 -- z101865inline void z_cgrb(Register r1, Register r2, branch_condition m3, int64_t d4, Register b4); // (r1 m3 r2) ? goto b4+d4 ; int64 -- z101866inline void z_crj( Register r1, Register r2, branch_condition m3, Label& L); // (r1 m3 r2) ? goto L ; int32 -- z101867inline void z_crj( Register r1, Register r2, branch_condition m3, address a4); // (r1 m3 r2) ? goto (pc+a4<<1) ; int32 -- z101868inline void z_cgrj(Register r1, Register r2, branch_condition m3, Label& L); // (r1 m3 r2) ? goto L ; int64 -- z101869inline void z_cgrj(Register r1, Register r2, branch_condition m3, address a4); // (r1 m3 r2) ? goto (pc+a4<<1) ; int64 -- z101870inline void z_cib( Register r1, int64_t i2, branch_condition m3, int64_t d4, Register b4); // (r1 m3 i2_imm8) ? goto b4+d4 ; int32 -- z101871inline void z_cgib(Register r1, int64_t i2, branch_condition m3, int64_t d4, Register b4); // (r1 m3 i2_imm8) ? goto b4+d4 ; int64 -- z101872inline void z_cij( Register r1, int64_t i2, branch_condition m3, Label& L); // (r1 m3 i2_imm8) ? goto L ; int32 -- z101873inline void z_cij( Register r1, int64_t i2, branch_condition m3, address a4); // (r1 m3 i2_imm8) ? goto (pc+a4<<1) ; int32 -- z101874inline void z_cgij(Register r1, int64_t i2, branch_condition m3, Label& L); // (r1 m3 i2_imm8) ? goto L ; int64 -- z101875inline void z_cgij(Register r1, int64_t i2, branch_condition m3, address a4); // (r1 m3 i2_imm8) ? goto (pc+a4<<1) ; int64 -- z101876// unsigned comparison and branch1877inline void z_clrb( Register r1, Register r2, branch_condition m3, int64_t d4, Register b4);// (r1 m3 r2) ? goto b4+d4 ; uint32 -- z101878inline void z_clgrb(Register r1, Register r2, branch_condition m3, int64_t d4, Register b4);// (r1 m3 r2) ? goto b4+d4 ; uint64 -- z101879inline void z_clrj( Register r1, Register r2, branch_condition m3, Label& L); // (r1 m3 r2) ? goto L ; uint32 -- z101880inline void z_clrj( Register r1, Register r2, branch_condition m3, address a4); // (r1 m3 r2) ? goto (pc+a4<<1) ; uint32 -- z101881inline void z_clgrj(Register r1, Register r2, branch_condition m3, Label& L); // (r1 m3 r2) ? goto L ; uint64 -- z101882inline void z_clgrj(Register r1, Register r2, branch_condition m3, address a4); // (r1 m3 r2) ? goto (pc+a4<<1) ; uint64 -- z101883inline void z_clib( Register r1, int64_t i2, branch_condition m3, int64_t d4, Register b4); // (r1 m3 i2_uimm8) ? goto b4+d4 ; uint32 -- z101884inline void z_clgib(Register r1, int64_t i2, branch_condition m3, int64_t d4, Register b4); // (r1 m3 i2_uimm8) ? goto b4+d4 ; uint64 -- z101885inline void z_clij( Register r1, int64_t i2, branch_condition m3, Label& L); // (r1 m3 i2_uimm8) ? goto L ; uint32 -- z101886inline void z_clij( Register r1, int64_t i2, branch_condition m3, address a4); // (r1 m3 i2_uimm8) ? goto (pc+a4<<1) ; uint32 -- z101887inline void z_clgij(Register r1, int64_t i2, branch_condition m3, Label& L); // (r1 m3 i2_uimm8) ? goto L ; uint64 -- z101888inline void z_clgij(Register r1, int64_t i2, branch_condition m3, address a4); // (r1 m3 i2_uimm8) ? goto (pc+a4<<1) ; uint64 -- z1018891890// Compare and trap instructions.1891// signed comparison1892inline void z_crt(Register r1, Register r2, int64_t m3); // (r1 m3 r2) ? trap ; int32 -- z101893inline void z_cgrt(Register r1, Register r2, int64_t m3); // (r1 m3 r2) ? trap ; int64 -- z101894inline void z_cit(Register r1, int64_t i2, int64_t m3); // (r1 m3 i2_imm16) ? trap ; int32 -- z101895inline void z_cgit(Register r1, int64_t i2, int64_t m3); // (r1 m3 i2_imm16) ? trap ; int64 -- z101896// unsigned comparison1897inline void z_clrt(Register r1, Register r2, int64_t m3); // (r1 m3 r2) ? trap ; uint32 -- z101898inline void z_clgrt(Register r1, Register r2, int64_t m3); // (r1 m3 r2) ? trap ; uint64 -- z101899inline void z_clfit(Register r1, int64_t i2, int64_t m3); // (r1 m3 i2_uimm16) ? trap ; uint32 -- z101900inline void z_clgit(Register r1, int64_t i2, int64_t m3); // (r1 m3 i2_uimm16) ? trap ; uint64 -- z1019011902inline void z_illtrap();1903inline void z_illtrap(int id);1904inline void z_illtrap_eyecatcher(unsigned short xpattern, unsigned short pattern);190519061907// load address, add for addresses1908// ===============================19091910// The versions without suffix z assert that the base reg is != Z_R0.1911// Z_R0 is interpreted as constant '0'. The variants with Address operand1912// check this automatically, so no two versions are needed.1913inline void z_layz(Register r1, int64_t d2, Register x2, Register b2); // Special version. Allows Z_R0 as base reg.1914inline void z_lay(Register r1, const Address &a); // r1 = a1915inline void z_lay(Register r1, int64_t d2, Register x2, Register b2); // r1 = d2_imm20+x2+b21916inline void z_laz(Register r1, int64_t d2, Register x2, Register b2); // Special version. Allows Z_R0 as base reg.1917inline void z_la(Register r1, const Address &a); // r1 = a ; unsigned immediate!1918inline void z_la(Register r1, int64_t d2, Register x2, Register b2); // r1 = d2_uimm12+x2+b2 ; unsigned immediate!1919inline void z_larl(Register r1, int64_t i2); // r1 = pc + i2_imm32<<1;1920inline void z_larl(Register r1, address a2); // r1 = pc + i2_imm32<<1;19211922// Load instructions for integers1923// ==============================19241925// Address as base + index + offset1926inline void z_lb( Register r1, const Address &a); // load r1 = *(a) ; int32 <- int81927inline void z_lb( Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int32 <- int81928inline void z_lh( Register r1, const Address &a); // load r1 = *(a) ; int32 <- int161929inline void z_lh( Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_uimm12+x2+b2); int32 <- int161930inline void z_lhy(Register r1, const Address &a); // load r1 = *(a) ; int32 <- int161931inline void z_lhy(Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int32 <- int161932inline void z_l( Register r1, const Address& a); // load r1 = *(a) ; int321933inline void z_l( Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_uimm12+x2+b2); int321934inline void z_ly( Register r1, const Address& a); // load r1 = *(a) ; int321935inline void z_ly( Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int3219361937inline void z_lgb(Register r1, const Address &a); // load r1 = *(a) ; int64 <- int81938inline void z_lgb(Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int64 <- int81939inline void z_lgh(Register r1, const Address &a); // load r1 = *(a) ; int64 <- int161940inline void z_lgh(Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm12+x2+b2) ; int64 <- int161941inline void z_lgf(Register r1, const Address &a); // load r1 = *(a) ; int64 <- int321942inline void z_lgf(Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int64 <- int321943inline void z_lg( Register r1, const Address& a); // load r1 = *(a) ; int64 <- int641944inline void z_lg( Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int64 <- int6419451946// load and test1947inline void z_lt( Register r1, const Address &a); // load and test r1 = *(a) ; int321948inline void z_lt( Register r1, int64_t d2, Register x2, Register b2);// load and test r1 = *(d2_imm20+x2+b2) ; int321949inline void z_ltg( Register r1, const Address &a); // load and test r1 = *(a) ; int641950inline void z_ltg( Register r1, int64_t d2, Register x2, Register b2);// load and test r1 = *(d2_imm20+x2+b2) ; int641951inline void z_ltgf(Register r1, const Address &a); // load and test r1 = *(a) ; int64 <- int321952inline void z_ltgf(Register r1, int64_t d2, Register x2, Register b2);// load and test r1 = *(d2_imm20+x2+b2) ; int64 <- int3219531954// load unsigned integer - zero extended1955inline void z_llc( Register r1, const Address& a); // load r1 = *(a) ; uint32 <- uint81956inline void z_llc( Register r1, int64_t d2, Register x2, Register b2);// load r1 = *(d2_imm20+x2+b2) ; uint32 <- uint81957inline void z_llh( Register r1, const Address& a); // load r1 = *(a) ; uint32 <- uint161958inline void z_llh( Register r1, int64_t d2, Register x2, Register b2);// load r1 = *(d2_imm20+x2+b2) ; uint32 <- uint161959inline void z_llgc(Register r1, const Address& a); // load r1 = *(a) ; uint64 <- uint81960inline void z_llgc(Register r1, int64_t d2, Register x2, Register b2);// load r1 = *(d2_imm20+x2+b2) ; uint64 <- uint81961inline void z_llgc( Register r1, int64_t d2, Register b2); // load r1 = *(d2_imm20+b2) ; uint64 <- uint81962inline void z_llgh(Register r1, const Address& a); // load r1 = *(a) ; uint64 <- uint161963inline void z_llgh(Register r1, int64_t d2, Register x2, Register b2);// load r1 = *(d2_imm20+x2+b2) ; uint64 <- uint161964inline void z_llgf(Register r1, const Address& a); // load r1 = *(a) ; uint64 <- uint321965inline void z_llgf(Register r1, int64_t d2, Register x2, Register b2);// load r1 = *(d2_imm20+x2+b2) ; uint64 <- uint3219661967// pc relative addressing1968inline void z_lhrl( Register r1, int64_t i2); // load r1 = *(pc + i2_imm32<<1) ; int32 <- int16 -- z101969inline void z_lrl( Register r1, int64_t i2); // load r1 = *(pc + i2_imm32<<1) ; int32 -- z101970inline void z_lghrl(Register r1, int64_t i2); // load r1 = *(pc + i2_imm32<<1) ; int64 <- int16 -- z101971inline void z_lgfrl(Register r1, int64_t i2); // load r1 = *(pc + i2_imm32<<1) ; int64 <- int32 -- z101972inline void z_lgrl( Register r1, int64_t i2); // load r1 = *(pc + i2_imm32<<1) ; int64 -- z1019731974inline void z_llhrl( Register r1, int64_t i2); // load r1 = *(pc + i2_imm32<<1) ; uint32 <- uint16 -- z101975inline void z_llghrl(Register r1, int64_t i2); // load r1 = *(pc + i2_imm32<<1) ; uint64 <- uint16 -- z101976inline void z_llgfrl(Register r1, int64_t i2); // load r1 = *(pc + i2_imm32<<1) ; uint64 <- uint32 -- z1019771978// Store instructions for integers1979// ===============================19801981// Address as base + index + offset1982inline void z_stc( Register r1, const Address &d); // store *(a) = r1 ; int81983inline void z_stc( Register r1, int64_t d2, Register x2, Register b2); // store *(d2_uimm12+x2+b2) = r1 ; int81984inline void z_stcy(Register r1, const Address &d); // store *(a) = r1 ; int81985inline void z_stcy(Register r1, int64_t d2, Register x2, Register b2); // store *(d2_imm20+x2+b2) = r1 ; int81986inline void z_sth( Register r1, const Address &d); // store *(a) = r1 ; int161987inline void z_sth( Register r1, int64_t d2, Register x2, Register b2); // store *(d2_uimm12+x2+b2) = r1 ; int161988inline void z_sthy(Register r1, const Address &d); // store *(a) = r1 ; int161989inline void z_sthy(Register r1, int64_t d2, Register x2, Register b2); // store *(d2_imm20+x2+b2) = r1 ; int161990inline void z_st( Register r1, const Address &d); // store *(a) = r1 ; int321991inline void z_st( Register r1, int64_t d2, Register x2, Register b2); // store *(d2_uimm12+x2+b2) = r1 ; int321992inline void z_sty( Register r1, const Address &d); // store *(a) = r1 ; int321993inline void z_sty( Register r1, int64_t d2, Register x2, Register b2); // store *(d2_imm20+x2+b2) = r1 ; int321994inline void z_stg( Register r1, const Address &d); // store *(a) = r1 ; int641995inline void z_stg( Register r1, int64_t d2, Register x2, Register b2); // store *(d2_uimm12+x2+b2) = r1 ; int6419961997inline void z_stcm( Register r1, int64_t m3, int64_t d2, Register b2); // store character under mask1998inline void z_stcmy(Register r1, int64_t m3, int64_t d2, Register b2); // store character under mask1999inline void z_stcmh(Register r1, int64_t m3, int64_t d2, Register b2); // store character under mask20002001// pc relative addressing2002inline void z_sthrl(Register r1, int64_t i2); // store *(pc + i2_imm32<<1) = r1 ; int16 -- z102003inline void z_strl( Register r1, int64_t i2); // store *(pc + i2_imm32<<1) = r1 ; int32 -- z102004inline void z_stgrl(Register r1, int64_t i2); // store *(pc + i2_imm32<<1) = r1 ; int64 -- z10200520062007// Load and store immediates2008// =========================20092010// load immediate2011inline void z_lhi( Register r1, int64_t i2); // r1 = i2_imm16 ; int32 <- int162012inline void z_lghi(Register r1, int64_t i2); // r1 = i2_imm16 ; int64 <- int162013inline void z_lgfi(Register r1, int64_t i2); // r1 = i2_imm32 ; int64 <- int3220142015inline void z_llihf(Register r1, int64_t i2); // r1 = i2_imm32 ; uint64 <- (uint32<<32)2016inline void z_llilf(Register r1, int64_t i2); // r1 = i2_imm32 ; uint64 <- uint322017inline void z_llihh(Register r1, int64_t i2); // r1 = i2_imm16 ; uint64 <- (uint16<<48)2018inline void z_llihl(Register r1, int64_t i2); // r1 = i2_imm16 ; uint64 <- (uint16<<32)2019inline void z_llilh(Register r1, int64_t i2); // r1 = i2_imm16 ; uint64 <- (uint16<<16)2020inline void z_llill(Register r1, int64_t i2); // r1 = i2_imm16 ; uint64 <- uint1620212022// insert immediate2023inline void z_ic( Register r1, int64_t d2, Register x2, Register b2); // insert character2024inline void z_icy( Register r1, int64_t d2, Register x2, Register b2); // insert character2025inline void z_icm( Register r1, int64_t m3, int64_t d2, Register b2); // insert character under mask2026inline void z_icmy(Register r1, int64_t m3, int64_t d2, Register b2); // insert character under mask2027inline void z_icmh(Register r1, int64_t m3, int64_t d2, Register b2); // insert character under mask20282029inline void z_iihh(Register r1, int64_t i2); // insert immediate r1[ 0-15] = i2_imm162030inline void z_iihl(Register r1, int64_t i2); // insert immediate r1[16-31] = i2_imm162031inline void z_iilh(Register r1, int64_t i2); // insert immediate r1[32-47] = i2_imm162032inline void z_iill(Register r1, int64_t i2); // insert immediate r1[48-63] = i2_imm162033inline void z_iihf(Register r1, int64_t i2); // insert immediate r1[32-63] = i2_imm322034inline void z_iilf(Register r1, int64_t i2); // insert immediate r1[ 0-31] = i2_imm3220352036// store immediate2037inline void z_mvhhi(const Address &d, int64_t i2); // store *(d) = i2_imm16 ; int162038inline void z_mvhhi(int64_t d1, Register b1, int64_t i2); // store *(d1_imm12+b1) = i2_imm16 ; int162039inline void z_mvhi( const Address &d, int64_t i2); // store *(d) = i2_imm16 ; int322040inline void z_mvhi( int64_t d1, Register b1, int64_t i2); // store *(d1_imm12+b1) = i2_imm16 ; int322041inline void z_mvghi(const Address &d, int64_t i2); // store *(d) = i2_imm16 ; int642042inline void z_mvghi(int64_t d1, Register b1, int64_t i2); // store *(d1_imm12+b1) = i2_imm16 ; int6420432044// Move and Convert instructions2045// =============================20462047// move, sign extend2048inline void z_lbr(Register r1, Register r2); // move r1 = r2 ; int32 <- int82049inline void z_lhr( Register r1, Register r2); // move r1 = r2 ; int32 <- int162050inline void z_lr(Register r1, Register r2); // move r1 = r2 ; int32, no sign extension2051inline void z_lgbr(Register r1, Register r2); // move r1 = r2 ; int64 <- int82052inline void z_lghr(Register r1, Register r2); // move r1 = r2 ; int64 <- int162053inline void z_lgfr(Register r1, Register r2); // move r1 = r2 ; int64 <- int322054inline void z_lgr(Register r1, Register r2); // move r1 = r2 ; int642055// move, zero extend2056inline void z_llhr( Register r1, Register r2); // move r1 = r2 ; uint32 <- uint162057inline void z_llgcr(Register r1, Register r2); // move r1 = r2 ; uint64 <- uint82058inline void z_llghr(Register r1, Register r2); // move r1 = r2 ; uint64 <- uint162059inline void z_llgfr(Register r1, Register r2); // move r1 = r2 ; uint64 <- uint3220602061// move and test register2062inline void z_ltr(Register r1, Register r2); // load/move and test r1 = r2; int322063inline void z_ltgr(Register r1, Register r2); // load/move and test r1 = r2; int642064inline void z_ltgfr(Register r1, Register r2); // load/move and test r1 = r2; int64 <-- int3220652066// move and byte-reverse2067inline void z_lrvr( Register r1, Register r2); // move and reverse byte order r1 = r2; int322068inline void z_lrvgr(Register r1, Register r2); // move and reverse byte order r1 = r2; int64206920702071// Arithmetic instructions (Integer only)2072// ======================================2073// For float arithmetic instructions scroll further down2074// Add logical differs in the condition codes set!20752076// add registers2077inline void z_ar( Register r1, Register r2); // add r1 = r1 + r2 ; int322078inline void z_agr( Register r1, Register r2); // add r1 = r1 + r2 ; int642079inline void z_agfr( Register r1, Register r2); // add r1 = r1 + r2 ; int64 <- int322080inline void z_ark( Register r1, Register r2, Register r3); // add r1 = r2 + r3 ; int322081inline void z_agrk( Register r1, Register r2, Register r3); // add r1 = r2 + r3 ; int6420822083inline void z_alr( Register r1, Register r2); // add logical r1 = r1 + r2 ; int322084inline void z_algr( Register r1, Register r2); // add logical r1 = r1 + r2 ; int642085inline void z_algfr(Register r1, Register r2); // add logical r1 = r1 + r2 ; int64 <- int322086inline void z_alrk( Register r1, Register r2, Register r3); // add logical r1 = r2 + r3 ; int322087inline void z_algrk(Register r1, Register r2, Register r3); // add logical r1 = r2 + r3 ; int642088inline void z_alcgr(Register r1, Register r2); // add logical with carry r1 = r1 + r2 + c ; int6420892090// add immediate2091inline void z_ahi( Register r1, int64_t i2); // add r1 = r1 + i2_imm16 ; int322092inline void z_afi( Register r1, int64_t i2); // add r1 = r1 + i2_imm32 ; int322093inline void z_alfi( Register r1, int64_t i2); // add r1 = r1 + i2_imm32 ; int322094inline void z_aghi( Register r1, int64_t i2); // add logical r1 = r1 + i2_imm16 ; int642095inline void z_agfi( Register r1, int64_t i2); // add r1 = r1 + i2_imm32 ; int642096inline void z_algfi(Register r1, int64_t i2); // add logical r1 = r1 + i2_imm32 ; int642097inline void z_ahik( Register r1, Register r3, int64_t i2); // add r1 = r3 + i2_imm16 ; int322098inline void z_aghik(Register r1, Register r3, int64_t i2); // add r1 = r3 + i2_imm16 ; int642099inline void z_aih( Register r1, int64_t i2); // add r1 = r1 + i2_imm32 ; int32 (HiWord)21002101// add memory2102inline void z_a( Register r1, int64_t d2, Register x2, Register b2); // add r1 = r1 + *(d2_uimm12+s2+b2) ; int322103inline void z_ay( Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+s2+b2) ; int322104inline void z_ag( Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+s2+b2) ; int642105inline void z_agf( Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+x2+b2) ; int64 <- int322106inline void z_al( Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_uimm12+x2+b2) ; int322107inline void z_aly( Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+x2+b2) ; int322108inline void z_alg( Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+x2+b2) ; int642109inline void z_algf(Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+x2+b2) ; int64 <- int322110inline void z_a( Register r1, const Address& a); // add r1 = r1 + *(a) ; int322111inline void z_ay( Register r1, const Address& a); // add r1 = r1 + *(a) ; int322112inline void z_al( Register r1, const Address& a); // add r1 = r1 + *(a) ; int322113inline void z_aly( Register r1, const Address& a); // add r1 = r1 + *(a) ; int322114inline void z_ag( Register r1, const Address& a); // add r1 = r1 + *(a) ; int642115inline void z_agf( Register r1, const Address& a); // add r1 = r1 + *(a) ; int64 <- int322116inline void z_alg( Register r1, const Address& a); // add r1 = r1 + *(a) ; int642117inline void z_algf(Register r1, const Address& a); // add r1 = r1 + *(a) ; int64 <- int32211821192120inline void z_alhsik( Register r1, Register r3, int64_t i2); // add logical r1 = r3 + i2_imm16 ; int322121inline void z_alghsik(Register r1, Register r3, int64_t i2); // add logical r1 = r3 + i2_imm16 ; int6421222123inline void z_asi( int64_t d1, Register b1, int64_t i2); // add *(d1_imm20+b1) += i2_imm8 ; int32 -- z102124inline void z_agsi( int64_t d1, Register b1, int64_t i2); // add *(d1_imm20+b1) += i2_imm8 ; int64 -- z102125inline void z_alsi( int64_t d1, Register b1, int64_t i2); // add logical *(d1_imm20+b1) += i2_imm8 ; uint32 -- z102126inline void z_algsi(int64_t d1, Register b1, int64_t i2); // add logical *(d1_imm20+b1) += i2_imm8 ; uint64 -- z102127inline void z_asi( const Address& d, int64_t i2); // add *(d) += i2_imm8 ; int32 -- z102128inline void z_agsi( const Address& d, int64_t i2); // add *(d) += i2_imm8 ; int64 -- z102129inline void z_alsi( const Address& d, int64_t i2); // add logical *(d) += i2_imm8 ; uint32 -- z102130inline void z_algsi(const Address& d, int64_t i2); // add logical *(d) += i2_imm8 ; uint64 -- z1021312132// sign adjustment2133inline void z_lcr( Register r1, Register r2 = noreg); // neg r1 = -r2 ; int322134inline void z_lcgr( Register r1, Register r2 = noreg); // neg r1 = -r2 ; int642135inline void z_lcgfr(Register r1, Register r2); // neg r1 = -r2 ; int64 <- int322136inline void z_lnr( Register r1, Register r2 = noreg); // neg r1 = -|r2| ; int322137inline void z_lngr( Register r1, Register r2 = noreg); // neg r1 = -|r2| ; int642138inline void z_lngfr(Register r1, Register r2); // neg r1 = -|r2| ; int64 <- int322139inline void z_lpr( Register r1, Register r2 = noreg); // r1 = |r2| ; int322140inline void z_lpgr( Register r1, Register r2 = noreg); // r1 = |r2| ; int642141inline void z_lpgfr(Register r1, Register r2); // r1 = |r2| ; int64 <- int3221422143// subtract intstructions2144// sub registers2145inline void z_sr( Register r1, Register r2); // sub r1 = r1 - r2 ; int322146inline void z_sgr( Register r1, Register r2); // sub r1 = r1 - r2 ; int642147inline void z_sgfr( Register r1, Register r2); // sub r1 = r1 - r2 ; int64 <- int322148inline void z_srk( Register r1, Register r2, Register r3); // sub r1 = r2 - r3 ; int322149inline void z_sgrk( Register r1, Register r2, Register r3); // sub r1 = r2 - r3 ; int6421502151inline void z_slr( Register r1, Register r2); // sub logical r1 = r1 - r2 ; int322152inline void z_slgr( Register r1, Register r2); // sub logical r1 = r1 - r2 ; int642153inline void z_slgfr(Register r1, Register r2); // sub logical r1 = r1 - r2 ; int64 <- int322154inline void z_slrk( Register r1, Register r2, Register r3); // sub logical r1 = r2 - r3 ; int322155inline void z_slgrk(Register r1, Register r2, Register r3); // sub logical r1 = r2 - r3 ; int642156inline void z_slfi( Register r1, int64_t i2); // sub logical r1 = r1 - i2_uimm32 ; int322157inline void z_slgfi(Register r1, int64_t i2); // add logical r1 = r1 - i2_uimm32 ; int6421582159// sub memory2160inline void z_s( Register r1, int64_t d2, Register x2, Register b2); // sub r1 = r1 - *(d2_imm12+x2+b2) ; int322161inline void z_sy( Register r1, int64_t d2, Register x2, Register b2); // sub r1 = r1 + *(d2_imm20+s2+b2) ; int322162inline void z_sg( Register r1, int64_t d2, Register x2, Register b2); // sub r1 = r1 - *(d2_imm12+x2+b2) ; int642163inline void z_sgf( Register r1, int64_t d2, Register x2, Register b2); // sub r1 = r1 - *(d2_imm12+x2+b2) ; int64 - int322164inline void z_slg( Register r1, int64_t d2, Register x2, Register b2); // sub logical r1 = r1 - *(d2_imm20+x2+b2) ; uint642165inline void z_slgf(Register r1, int64_t d2, Register x2, Register b2); // sub logical r1 = r1 - *(d2_imm20+x2+b2) ; uint64 - uint322166inline void z_s( Register r1, const Address& a); // sub r1 = r1 - *(a) ; int322167inline void z_sy( Register r1, const Address& a); // sub r1 = r1 - *(a) ; int322168inline void z_sg( Register r1, const Address& a); // sub r1 = r1 - *(a) ; int642169inline void z_sgf( Register r1, const Address& a); // sub r1 = r1 - *(a) ; int64 - int322170inline void z_slg( Register r1, const Address& a); // sub r1 = r1 - *(a) ; uint642171inline void z_slgf(Register r1, const Address& a); // sub r1 = r1 - *(a) ; uint64 - uint3221722173inline void z_sh( Register r1, int64_t d2, Register x2, Register b2); // sub r1 = r1 - *(d2_imm12+x2+b2) ; int32 - int162174inline void z_shy( Register r1, int64_t d2, Register x2, Register b2); // sub r1 = r1 - *(d2_imm20+x2+b2) ; int32 - int162175inline void z_sh( Register r1, const Address &a); // sub r1 = r1 - *(d2_imm12+x2+b2) ; int32 - int162176inline void z_shy( Register r1, const Address &a); // sub r1 = r1 - *(d2_imm20+x2+b2) ; int32 - int1621772178// Multiplication instructions2179// mul registers2180inline void z_msr( Register r1, Register r2); // mul r1 = r1 * r2 ; int322181inline void z_msgr( Register r1, Register r2); // mul r1 = r1 * r2 ; int642182inline void z_msgfr(Register r1, Register r2); // mul r1 = r1 * r2 ; int64 <- int322183inline void z_mlr( Register r1, Register r2); // mul r1 = r1 * r2 ; int32 unsigned2184inline void z_mlgr( Register r1, Register r2); // mul r1 = r1 * r2 ; int64 unsigned2185// mul register - memory2186inline void z_mhy( Register r1, int64_t d2, Register x2, Register b2); // mul r1 = r1 * *(d2+x2+b2)2187inline void z_msy( Register r1, int64_t d2, Register x2, Register b2); // mul r1 = r1 * *(d2+x2+b2)2188inline void z_msg( Register r1, int64_t d2, Register x2, Register b2); // mul r1 = r1 * *(d2+x2+b2)2189inline void z_msgf(Register r1, int64_t d2, Register x2, Register b2); // mul r1 = r1 * *(d2+x2+b2)2190inline void z_ml( Register r1, int64_t d2, Register x2, Register b2); // mul r1 = r1 * *(d2+x2+b2)2191inline void z_mlg( Register r1, int64_t d2, Register x2, Register b2); // mul r1 = r1 * *(d2+x2+b2)2192inline void z_mhy( Register r1, const Address& a); // mul r1 = r1 * *(a)2193inline void z_msy( Register r1, const Address& a); // mul r1 = r1 * *(a)2194inline void z_msg( Register r1, const Address& a); // mul r1 = r1 * *(a)2195inline void z_msgf(Register r1, const Address& a); // mul r1 = r1 * *(a)2196inline void z_ml( Register r1, const Address& a); // mul r1 = r1 * *(a)2197inline void z_mlg( Register r1, const Address& a); // mul r1 = r1 * *(a)21982199inline void z_msfi( Register r1, int64_t i2); // mult r1 = r1 * i2_imm32; int32 -- z102200inline void z_msgfi(Register r1, int64_t i2); // mult r1 = r1 * i2_imm32; int64 -- z102201inline void z_mhi( Register r1, int64_t i2); // mult r1 = r1 * i2_imm16; int322202inline void z_mghi( Register r1, int64_t i2); // mult r1 = r1 * i2_imm16; int6422032204// Division instructions2205inline void z_dsgr( Register r1, Register r2); // div r1 = r1 / r2 ; int64/int32 needs reg pair!2206inline void z_dsgfr(Register r1, Register r2); // div r1 = r1 / r2 ; int64/int32 needs reg pair!220722082209// Logic instructions2210// ===================22112212// and2213inline void z_n( Register r1, int64_t d2, Register x2, Register b2);2214inline void z_ny( Register r1, int64_t d2, Register x2, Register b2);2215inline void z_ng( Register r1, int64_t d2, Register x2, Register b2);2216inline void z_n( Register r1, const Address& a);2217inline void z_ny( Register r1, const Address& a);2218inline void z_ng( Register r1, const Address& a);22192220inline void z_nr( Register r1, Register r2); // and r1 = r1 & r2 ; int322221inline void z_ngr( Register r1, Register r2); // and r1 = r1 & r2 ; int642222inline void z_nrk( Register r1, Register r2, Register r3); // and r1 = r2 & r3 ; int322223inline void z_ngrk(Register r1, Register r2, Register r3); // and r1 = r2 & r3 ; int6422242225inline void z_nihh(Register r1, int64_t i2); // and r1 = r1 & i2_imm16 ; and only for bits 0-152226inline void z_nihl(Register r1, int64_t i2); // and r1 = r1 & i2_imm16 ; and only for bits 16-312227inline void z_nilh(Register r1, int64_t i2); // and r1 = r1 & i2_imm16 ; and only for bits 32-472228inline void z_nill(Register r1, int64_t i2); // and r1 = r1 & i2_imm16 ; and only for bits 48-632229inline void z_nihf(Register r1, int64_t i2); // and r1 = r1 & i2_imm32 ; and only for bits 0-312230inline void z_nilf(Register r1, int64_t i2); // and r1 = r1 & i2_imm32 ; and only for bits 32-63 see also MacroAssembler::nilf.22312232// or2233inline void z_o( Register r1, int64_t d2, Register x2, Register b2);2234inline void z_oy( Register r1, int64_t d2, Register x2, Register b2);2235inline void z_og( Register r1, int64_t d2, Register x2, Register b2);2236inline void z_o( Register r1, const Address& a);2237inline void z_oy( Register r1, const Address& a);2238inline void z_og( Register r1, const Address& a);22392240inline void z_or( Register r1, Register r2); // or r1 = r1 | r2; int322241inline void z_ogr( Register r1, Register r2); // or r1 = r1 | r2; int642242inline void z_ork( Register r1, Register r2, Register r3); // or r1 = r2 | r3 ; int322243inline void z_ogrk(Register r1, Register r2, Register r3); // or r1 = r2 | r3 ; int6422442245inline void z_oihh(Register r1, int64_t i2); // or r1 = r1 | i2_imm16 ; or only for bits 0-152246inline void z_oihl(Register r1, int64_t i2); // or r1 = r1 | i2_imm16 ; or only for bits 16-312247inline void z_oilh(Register r1, int64_t i2); // or r1 = r1 | i2_imm16 ; or only for bits 32-472248inline void z_oill(Register r1, int64_t i2); // or r1 = r1 | i2_imm16 ; or only for bits 48-632249inline void z_oihf(Register r1, int64_t i2); // or r1 = r1 | i2_imm32 ; or only for bits 0-312250inline void z_oilf(Register r1, int64_t i2); // or r1 = r1 | i2_imm32 ; or only for bits 32-6322512252// xor2253inline void z_x( Register r1, int64_t d2, Register x2, Register b2);2254inline void z_xy( Register r1, int64_t d2, Register x2, Register b2);2255inline void z_xg( Register r1, int64_t d2, Register x2, Register b2);2256inline void z_x( Register r1, const Address& a);2257inline void z_xy( Register r1, const Address& a);2258inline void z_xg( Register r1, const Address& a);22592260inline void z_xr( Register r1, Register r2); // xor r1 = r1 ^ r2 ; int322261inline void z_xgr( Register r1, Register r2); // xor r1 = r1 ^ r2 ; int642262inline void z_xrk( Register r1, Register r2, Register r3); // xor r1 = r2 ^ r3 ; int322263inline void z_xgrk(Register r1, Register r2, Register r3); // xor r1 = r2 ^ r3 ; int6422642265inline void z_xihf(Register r1, int64_t i2); // xor r1 = r1 ^ i2_imm32 ; or only for bits 0-312266inline void z_xilf(Register r1, int64_t i2); // xor r1 = r1 ^ i2_imm32 ; or only for bits 32-6322672268// shift2269inline 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!2270inline 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!2271inline 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!2272inline void z_sra( Register r1, int64_t d2, Register b2=Z_R0); // shift right r1 = r1 >> ((d2+b2)&0x3f) ; int32, sign extended2273inline void z_srak(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift right r1 = r3 >> ((d2+b2)&0x3f) ; int32, sign extended2274inline void z_srag(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift right r1 = r3 >> ((d2+b2)&0x3f) ; int64, sign extended2275inline void z_sll( Register r1, int64_t d2, Register b2=Z_R0); // shift left r1 = r1 << ((d2+b2)&0x3f) ; int32, zeros added2276inline void z_sllk(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift left r1 = r3 << ((d2+b2)&0x3f) ; int32, zeros added2277inline void z_sllg(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift left r1 = r3 << ((d2+b2)&0x3f) ; int64, zeros added2278inline void z_srl( Register r1, int64_t d2, Register b2=Z_R0); // shift right r1 = r1 >> ((d2+b2)&0x3f) ; int32, zero extended2279inline void z_srlk(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift right r1 = r3 >> ((d2+b2)&0x3f) ; int32, zero extended2280inline void z_srlg(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift right r1 = r3 >> ((d2+b2)&0x3f) ; int64, zero extended22812282// rotate2283inline void z_rll( Register r1, Register r3, int64_t d2, Register b2=Z_R0); // rot r1 = r3 << (d2+b2 & 0x3f) ; int32 -- z102284inline void z_rllg(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // rot r1 = r3 << (d2+b2 & 0x3f) ; int64 -- z1022852286// rotate the AND/XOR/OR/insert2287inline 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 -- z1962288inline 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 -- z1962289inline 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 -- z1962290inline 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 -- z196229122922293// memory-immediate instructions (8-bit immediate)2294// ===============================================22952296inline void z_cli( int64_t d1, Register b1, int64_t i2); // compare *(d1_imm12+b1) ^= i2_imm8 ; int82297inline void z_mvi( int64_t d1, Register b1, int64_t i2); // store *(d1_imm12+b1) = i2_imm8 ; int82298inline void z_tm( int64_t d1, Register b1, int64_t i2); // test *(d1_imm12+b1) against mask i2_imm8 ; int82299inline void z_ni( int64_t d1, Register b1, int64_t i2); // store *(d1_imm12+b1) &= i2_imm8 ; int82300inline void z_oi( int64_t d1, Register b1, int64_t i2); // store *(d1_imm12+b1) |= i2_imm8 ; int82301inline void z_xi( int64_t d1, Register b1, int64_t i2); // store *(d1_imm12+b1) ^= i2_imm8 ; int82302inline void z_cliy(int64_t d1, Register b1, int64_t i2); // compare *(d1_imm12+b1) ^= i2_imm8 ; int82303inline void z_mviy(int64_t d1, Register b1, int64_t i2); // store *(d1_imm12+b1) = i2_imm8 ; int82304inline void z_tmy( int64_t d1, Register b1, int64_t i2); // test *(d1_imm12+b1) against mask i2_imm8 ; int82305inline void z_niy( int64_t d1, Register b1, int64_t i2); // store *(d1_imm12+b1) &= i2_imm8 ; int82306inline void z_oiy( int64_t d1, Register b1, int64_t i2); // store *(d1_imm12+b1) |= i2_imm8 ; int82307inline void z_xiy( int64_t d1, Register b1, int64_t i2); // store *(d1_imm12+b1) ^= i2_imm8 ; int82308inline void z_cli( const Address& a, int64_t imm8); // compare *(a) ^= imm8 ; int82309inline void z_mvi( const Address& a, int64_t imm8); // store *(a) = imm8 ; int82310inline void z_tm( const Address& a, int64_t imm8); // test *(a) against mask imm8 ; int82311inline void z_ni( const Address& a, int64_t imm8); // store *(a) &= imm8 ; int82312inline void z_oi( const Address& a, int64_t imm8); // store *(a) |= imm8 ; int82313inline void z_xi( const Address& a, int64_t imm8); // store *(a) ^= imm8 ; int82314inline void z_cliy(const Address& a, int64_t imm8); // compare *(a) ^= imm8 ; int82315inline void z_mviy(const Address& a, int64_t imm8); // store *(a) = imm8 ; int82316inline void z_tmy( const Address& a, int64_t imm8); // test *(a) against mask imm8 ; int82317inline void z_niy( const Address& a, int64_t imm8); // store *(a) &= imm8 ; int82318inline void z_oiy( const Address& a, int64_t imm8); // store *(a) |= imm8 ; int82319inline void z_xiy( const Address& a, int64_t imm8); // store *(a) ^= imm8 ; int8232023212322//------------------------------2323// Interlocked-Update2324//------------------------------2325inline void z_laa( Register r1, Register r3, int64_t d2, Register b2); // load and add int32, signed -- z1962326inline void z_laag( Register r1, Register r3, int64_t d2, Register b2); // load and add int64, signed -- z1962327inline void z_laal( Register r1, Register r3, int64_t d2, Register b2); // load and add int32, unsigned -- z1962328inline void z_laalg(Register r1, Register r3, int64_t d2, Register b2); // load and add int64, unsigned -- z1962329inline void z_lan( Register r1, Register r3, int64_t d2, Register b2); // load and and int32 -- z1962330inline void z_lang( Register r1, Register r3, int64_t d2, Register b2); // load and and int64 -- z1962331inline void z_lax( Register r1, Register r3, int64_t d2, Register b2); // load and xor int32 -- z1962332inline void z_laxg( Register r1, Register r3, int64_t d2, Register b2); // load and xor int64 -- z1962333inline void z_lao( Register r1, Register r3, int64_t d2, Register b2); // load and or int32 -- z1962334inline void z_laog( Register r1, Register r3, int64_t d2, Register b2); // load and or int64 -- z19623352336inline void z_laa( Register r1, Register r3, const Address& a); // load and add int32, signed -- z1962337inline void z_laag( Register r1, Register r3, const Address& a); // load and add int64, signed -- z1962338inline void z_laal( Register r1, Register r3, const Address& a); // load and add int32, unsigned -- z1962339inline void z_laalg(Register r1, Register r3, const Address& a); // load and add int64, unsigned -- z1962340inline void z_lan( Register r1, Register r3, const Address& a); // load and and int32 -- z1962341inline void z_lang( Register r1, Register r3, const Address& a); // load and and int64 -- z1962342inline void z_lax( Register r1, Register r3, const Address& a); // load and xor int32 -- z1962343inline void z_laxg( Register r1, Register r3, const Address& a); // load and xor int64 -- z1962344inline void z_lao( Register r1, Register r3, const Address& a); // load and or int32 -- z1962345inline void z_laog( Register r1, Register r3, const Address& a); // load and or int64 -- z19623462347//--------------------------------2348// Execution Prediction2349//--------------------------------2350inline void z_pfd( int64_t m1, int64_t d2, Register x2, Register b2); // prefetch2351inline void z_pfd( int64_t m1, Address a);2352inline void z_pfdrl(int64_t m1, int64_t i2); // prefetch2353inline void z_bpp( int64_t m1, int64_t i2, int64_t d3, Register b3); // branch prediction -- EC122354inline void z_bprp( int64_t m1, int64_t i2, int64_t i3); // branch prediction -- EC1223552356//-------------------------------2357// Transaction Control2358//-------------------------------2359inline void z_tbegin(int64_t d1, Register b1, int64_t i2); // begin transaction -- EC122360inline void z_tbeginc(int64_t d1, Register b1, int64_t i2); // begin transaction (constrained) -- EC122361inline void z_tend(); // end transaction -- EC122362inline void z_tabort(int64_t d2, Register b2); // abort transaction -- EC122363inline void z_etnd(Register r1); // extract tx nesting depth -- EC122364inline void z_ppa(Register r1, Register r2, int64_t m3); // perform processor assist -- EC1223652366//---------------------------------2367// Conditional Execution2368//---------------------------------2369inline void z_locr( Register r1, Register r2, branch_condition cc); // if (cc) load r1 = r2 ; int32 -- z1962370inline void z_locgr(Register r1, Register r2, branch_condition cc); // if (cc) load r1 = r2 ; int64 -- z1962371inline void z_loc( Register r1, int64_t d2, Register b2, branch_condition cc); // if (cc) load r1 = *(d2_simm20+b2) ; int32 -- z1962372inline void z_locg( Register r1, int64_t d2, Register b2, branch_condition cc); // if (cc) load r1 = *(d2_simm20+b2) ; int64 -- z1962373inline void z_loc( Register r1, const Address& a, branch_condition cc); // if (cc) load r1 = *(a) ; int32 -- z1962374inline void z_locg( Register r1, const Address& a, branch_condition cc); // if (cc) load r1 = *(a) ; int64 -- z1962375inline void z_stoc( Register r1, int64_t d2, Register b2, branch_condition cc); // if (cc) store *(d2_simm20+b2) = r1 ; int32 -- z1962376inline void z_stocg(Register r1, int64_t d2, Register b2, branch_condition cc); // if (cc) store *(d2_simm20+b2) = r1 ; int64 -- z196237723782379// Complex CISC instructions2380// ==========================23812382inline void z_cksm( Register r1, Register r2); // checksum. This is NOT CRC322383inline void z_km( Register r1, Register r2); // cipher message2384inline void z_kmc( Register r1, Register r2); // cipher message with chaining2385inline void z_kma( Register r1, Register r3, Register r2); // cipher message with authentication2386inline void z_kmf( Register r1, Register r2); // cipher message with cipher feedback2387inline void z_kmctr(Register r1, Register r3, Register r2); // cipher message with counter2388inline void z_kmo( Register r1, Register r2); // cipher message with output feedback2389inline void z_kimd( Register r1, Register r2); // msg digest (SHA)2390inline void z_klmd( Register r1, Register r2); // msg digest (SHA)2391inline void z_kmac( Register r1, Register r2); // msg authentication code23922393inline void z_ex(Register r1, int64_t d2, Register x2, Register b2);// execute2394inline void z_exrl(Register r1, int64_t i2); // execute relative long -- z102395inline void z_exrl(Register r1, address a2); // execute relative long -- z1023962397inline void z_ectg(int64_t d1, Register b1, int64_t d2, Register b2, Register r3); // extract cpu time2398inline void z_ecag(Register r1, Register r3, int64_t d2, Register b2); // extract CPU attribute23992400inline void z_srst(Register r1, Register r2); // search string2401inline void z_srstu(Register r1, Register r2); // search string unicode24022403inline void z_mvc(const Address& d, const Address& s, int64_t l); // move l bytes2404inline void z_mvc(int64_t d1, int64_t l, Register b1, int64_t d2, Register b2); // move l+1 bytes2405inline void z_mvcle(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // move region of memory24062407inline void z_stfle(int64_t d2, Register b2); // store facility list extended24082409inline 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 bytes2410inline 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 bytes2411inline 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 bytes2412inline void z_nc(Address dst, int64_t len, Address src2); // and *dst = *dst & *src2, ands len bytes in memory2413inline void z_oc(Address dst, int64_t len, Address src2); // or *dst = *dst | *src2, ors len bytes in memory2414inline void z_xc(Address dst, int64_t len, Address src2); // xor *dst = *dst ^ *src2, xors len bytes in memory24152416// compare instructions2417inline 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 bytes2418inline void z_clcle(Register r1, Register r3, int64_t d2, Register b2); // compare logical long extended, see docu2419inline void z_clclu(Register r1, Register r3, int64_t d2, Register b2); // compare logical long unicode, see docu24202421// Translate characters2422inline void z_troo(Register r1, Register r2, int64_t m3);2423inline void z_trot(Register r1, Register r2, int64_t m3);2424inline void z_trto(Register r1, Register r2, int64_t m3);2425inline void z_trtt(Register r1, Register r2, int64_t m3);242624272428//---------------------------2429//-- Vector Instructions --2430//---------------------------24312432//---< Vector Support Instructions >---24332434// Load (transfer from memory)2435inline void z_vlm( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);2436inline void z_vl( VectorRegister v1, int64_t d2, Register x2, Register b2);2437inline void z_vleb( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);2438inline void z_vleh( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);2439inline void z_vlef( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);2440inline void z_vleg( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);24412442// Gather/Scatter2443inline void z_vgef( VectorRegister v1, int64_t d2, VectorRegister vx2, Register b2, int64_t m3);2444inline void z_vgeg( VectorRegister v1, int64_t d2, VectorRegister vx2, Register b2, int64_t m3);24452446inline void z_vscef( VectorRegister v1, int64_t d2, VectorRegister vx2, Register b2, int64_t m3);2447inline void z_vsceg( VectorRegister v1, int64_t d2, VectorRegister vx2, Register b2, int64_t m3);24482449// load and replicate2450inline void z_vlrep( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);2451inline void z_vlrepb(VectorRegister v1, int64_t d2, Register x2, Register b2);2452inline void z_vlreph(VectorRegister v1, int64_t d2, Register x2, Register b2);2453inline void z_vlrepf(VectorRegister v1, int64_t d2, Register x2, Register b2);2454inline void z_vlrepg(VectorRegister v1, int64_t d2, Register x2, Register b2);24552456inline void z_vllez( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);2457inline void z_vllezb(VectorRegister v1, int64_t d2, Register x2, Register b2);2458inline void z_vllezh(VectorRegister v1, int64_t d2, Register x2, Register b2);2459inline void z_vllezf(VectorRegister v1, int64_t d2, Register x2, Register b2);2460inline void z_vllezg(VectorRegister v1, int64_t d2, Register x2, Register b2);24612462inline void z_vlbb( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);2463inline void z_vll( VectorRegister v1, Register r3, int64_t d2, Register b2);24642465// Load (register to register)2466inline void z_vlr( VectorRegister v1, VectorRegister v2);24672468inline void z_vlgv( Register r1, VectorRegister v3, int64_t d2, Register b2, int64_t m4);2469inline void z_vlgvb( Register r1, VectorRegister v3, int64_t d2, Register b2);2470inline void z_vlgvh( Register r1, VectorRegister v3, int64_t d2, Register b2);2471inline void z_vlgvf( Register r1, VectorRegister v3, int64_t d2, Register b2);2472inline void z_vlgvg( Register r1, VectorRegister v3, int64_t d2, Register b2);24732474inline void z_vlvg( VectorRegister v1, Register r3, int64_t d2, Register b2, int64_t m4);2475inline void z_vlvgb( VectorRegister v1, Register r3, int64_t d2, Register b2);2476inline void z_vlvgh( VectorRegister v1, Register r3, int64_t d2, Register b2);2477inline void z_vlvgf( VectorRegister v1, Register r3, int64_t d2, Register b2);2478inline void z_vlvgg( VectorRegister v1, Register r3, int64_t d2, Register b2);24792480inline void z_vlvgp( VectorRegister v1, Register r2, Register r3);24812482// vector register pack2483inline void z_vpk( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2484inline void z_vpkh( VectorRegister v1, VectorRegister v2, VectorRegister v3);2485inline void z_vpkf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2486inline void z_vpkg( VectorRegister v1, VectorRegister v2, VectorRegister v3);24872488inline void z_vpks( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4, int64_t cc5);2489inline void z_vpksh( VectorRegister v1, VectorRegister v2, VectorRegister v3);2490inline void z_vpksf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2491inline void z_vpksg( VectorRegister v1, VectorRegister v2, VectorRegister v3);2492inline void z_vpkshs(VectorRegister v1, VectorRegister v2, VectorRegister v3);2493inline void z_vpksfs(VectorRegister v1, VectorRegister v2, VectorRegister v3);2494inline void z_vpksgs(VectorRegister v1, VectorRegister v2, VectorRegister v3);24952496inline void z_vpkls( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4, int64_t cc5);2497inline void z_vpklsh( VectorRegister v1, VectorRegister v2, VectorRegister v3);2498inline void z_vpklsf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2499inline void z_vpklsg( VectorRegister v1, VectorRegister v2, VectorRegister v3);2500inline void z_vpklshs(VectorRegister v1, VectorRegister v2, VectorRegister v3);2501inline void z_vpklsfs(VectorRegister v1, VectorRegister v2, VectorRegister v3);2502inline void z_vpklsgs(VectorRegister v1, VectorRegister v2, VectorRegister v3);25032504// vector register unpack (sign-extended)2505inline void z_vuph( VectorRegister v1, VectorRegister v2, int64_t m3);2506inline void z_vuphb( VectorRegister v1, VectorRegister v2);2507inline void z_vuphh( VectorRegister v1, VectorRegister v2);2508inline void z_vuphf( VectorRegister v1, VectorRegister v2);2509inline void z_vupl( VectorRegister v1, VectorRegister v2, int64_t m3);2510inline void z_vuplb( VectorRegister v1, VectorRegister v2);2511inline void z_vuplh( VectorRegister v1, VectorRegister v2);2512inline void z_vuplf( VectorRegister v1, VectorRegister v2);25132514// vector register unpack (zero-extended)2515inline void z_vuplh( VectorRegister v1, VectorRegister v2, int64_t m3);2516inline void z_vuplhb( VectorRegister v1, VectorRegister v2);2517inline void z_vuplhh( VectorRegister v1, VectorRegister v2);2518inline void z_vuplhf( VectorRegister v1, VectorRegister v2);2519inline void z_vupll( VectorRegister v1, VectorRegister v2, int64_t m3);2520inline void z_vupllb( VectorRegister v1, VectorRegister v2);2521inline void z_vupllh( VectorRegister v1, VectorRegister v2);2522inline void z_vupllf( VectorRegister v1, VectorRegister v2);25232524// vector register merge high/low2525inline void z_vmrh( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2526inline void z_vmrhb(VectorRegister v1, VectorRegister v2, VectorRegister v3);2527inline void z_vmrhh(VectorRegister v1, VectorRegister v2, VectorRegister v3);2528inline void z_vmrhf(VectorRegister v1, VectorRegister v2, VectorRegister v3);2529inline void z_vmrhg(VectorRegister v1, VectorRegister v2, VectorRegister v3);25302531inline void z_vmrl( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2532inline void z_vmrlb(VectorRegister v1, VectorRegister v2, VectorRegister v3);2533inline void z_vmrlh(VectorRegister v1, VectorRegister v2, VectorRegister v3);2534inline void z_vmrlf(VectorRegister v1, VectorRegister v2, VectorRegister v3);2535inline void z_vmrlg(VectorRegister v1, VectorRegister v2, VectorRegister v3);25362537// vector register permute2538inline void z_vperm( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);2539inline void z_vpdi( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);25402541// vector register replicate2542inline void z_vrep( VectorRegister v1, VectorRegister v3, int64_t imm2, int64_t m4);2543inline void z_vrepb( VectorRegister v1, VectorRegister v3, int64_t imm2);2544inline void z_vreph( VectorRegister v1, VectorRegister v3, int64_t imm2);2545inline void z_vrepf( VectorRegister v1, VectorRegister v3, int64_t imm2);2546inline void z_vrepg( VectorRegister v1, VectorRegister v3, int64_t imm2);2547inline void z_vrepi( VectorRegister v1, int64_t imm2, int64_t m3);2548inline void z_vrepib(VectorRegister v1, int64_t imm2);2549inline void z_vrepih(VectorRegister v1, int64_t imm2);2550inline void z_vrepif(VectorRegister v1, int64_t imm2);2551inline void z_vrepig(VectorRegister v1, int64_t imm2);25522553inline void z_vsel( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);2554inline void z_vseg( VectorRegister v1, VectorRegister v2, int64_t imm3);25552556// Load (immediate)2557inline void z_vleib( VectorRegister v1, int64_t imm2, int64_t m3);2558inline void z_vleih( VectorRegister v1, int64_t imm2, int64_t m3);2559inline void z_vleif( VectorRegister v1, int64_t imm2, int64_t m3);2560inline void z_vleig( VectorRegister v1, int64_t imm2, int64_t m3);25612562// Store2563inline void z_vstm( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);2564inline void z_vst( VectorRegister v1, int64_t d2, Register x2, Register b2);2565inline void z_vsteb( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);2566inline void z_vsteh( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);2567inline void z_vstef( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);2568inline void z_vsteg( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);2569inline void z_vstl( VectorRegister v1, Register r3, int64_t d2, Register b2);25702571// Misc2572inline void z_vgm( VectorRegister v1, int64_t imm2, int64_t imm3, int64_t m4);2573inline void z_vgmb( VectorRegister v1, int64_t imm2, int64_t imm3);2574inline void z_vgmh( VectorRegister v1, int64_t imm2, int64_t imm3);2575inline void z_vgmf( VectorRegister v1, int64_t imm2, int64_t imm3);2576inline void z_vgmg( VectorRegister v1, int64_t imm2, int64_t imm3);25772578inline void z_vgbm( VectorRegister v1, int64_t imm2);2579inline void z_vzero( VectorRegister v1); // preferred method to set vreg to all zeroes2580inline void z_vone( VectorRegister v1); // preferred method to set vreg to all ones25812582//---< Vector Arithmetic Instructions >---25832584// Load2585inline void z_vlc( VectorRegister v1, VectorRegister v2, int64_t m3);2586inline void z_vlcb( VectorRegister v1, VectorRegister v2);2587inline void z_vlch( VectorRegister v1, VectorRegister v2);2588inline void z_vlcf( VectorRegister v1, VectorRegister v2);2589inline void z_vlcg( VectorRegister v1, VectorRegister v2);2590inline void z_vlp( VectorRegister v1, VectorRegister v2, int64_t m3);2591inline void z_vlpb( VectorRegister v1, VectorRegister v2);2592inline void z_vlph( VectorRegister v1, VectorRegister v2);2593inline void z_vlpf( VectorRegister v1, VectorRegister v2);2594inline void z_vlpg( VectorRegister v1, VectorRegister v2);25952596// ADD2597inline void z_va( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2598inline void z_vab( VectorRegister v1, VectorRegister v2, VectorRegister v3);2599inline void z_vah( VectorRegister v1, VectorRegister v2, VectorRegister v3);2600inline void z_vaf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2601inline void z_vag( VectorRegister v1, VectorRegister v2, VectorRegister v3);2602inline void z_vaq( VectorRegister v1, VectorRegister v2, VectorRegister v3);2603inline void z_vacc( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2604inline void z_vaccb( VectorRegister v1, VectorRegister v2, VectorRegister v3);2605inline void z_vacch( VectorRegister v1, VectorRegister v2, VectorRegister v3);2606inline void z_vaccf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2607inline void z_vaccg( VectorRegister v1, VectorRegister v2, VectorRegister v3);2608inline void z_vaccq( VectorRegister v1, VectorRegister v2, VectorRegister v3);26092610// SUB2611inline void z_vs( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2612inline void z_vsb( VectorRegister v1, VectorRegister v2, VectorRegister v3);2613inline void z_vsh( VectorRegister v1, VectorRegister v2, VectorRegister v3);2614inline void z_vsf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2615inline void z_vsg( VectorRegister v1, VectorRegister v2, VectorRegister v3);2616inline void z_vsq( VectorRegister v1, VectorRegister v2, VectorRegister v3);2617inline void z_vscbi( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2618inline void z_vscbib( VectorRegister v1, VectorRegister v2, VectorRegister v3);2619inline void z_vscbih( VectorRegister v1, VectorRegister v2, VectorRegister v3);2620inline void z_vscbif( VectorRegister v1, VectorRegister v2, VectorRegister v3);2621inline void z_vscbig( VectorRegister v1, VectorRegister v2, VectorRegister v3);2622inline void z_vscbiq( VectorRegister v1, VectorRegister v2, VectorRegister v3);26232624// MULTIPLY2625inline void z_vml( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2626inline void z_vmh( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2627inline void z_vmlh( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2628inline void z_vme( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2629inline void z_vmle( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2630inline void z_vmo( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2631inline void z_vmlo( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);26322633// MULTIPLY & ADD2634inline void z_vmal( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);2635inline void z_vmah( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);2636inline void z_vmalh( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);2637inline void z_vmae( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);2638inline void z_vmale( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);2639inline void z_vmao( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);2640inline void z_vmalo( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);26412642// VECTOR SUM2643inline void z_vsum( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2644inline void z_vsumb( VectorRegister v1, VectorRegister v2, VectorRegister v3);2645inline void z_vsumh( VectorRegister v1, VectorRegister v2, VectorRegister v3);2646inline void z_vsumg( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2647inline void z_vsumgh( VectorRegister v1, VectorRegister v2, VectorRegister v3);2648inline void z_vsumgf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2649inline void z_vsumq( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2650inline void z_vsumqf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2651inline void z_vsumqg( VectorRegister v1, VectorRegister v2, VectorRegister v3);26522653// Average2654inline void z_vavg( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2655inline void z_vavgb( VectorRegister v1, VectorRegister v2, VectorRegister v3);2656inline void z_vavgh( VectorRegister v1, VectorRegister v2, VectorRegister v3);2657inline void z_vavgf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2658inline void z_vavgg( VectorRegister v1, VectorRegister v2, VectorRegister v3);2659inline void z_vavgl( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2660inline void z_vavglb( VectorRegister v1, VectorRegister v2, VectorRegister v3);2661inline void z_vavglh( VectorRegister v1, VectorRegister v2, VectorRegister v3);2662inline void z_vavglf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2663inline void z_vavglg( VectorRegister v1, VectorRegister v2, VectorRegister v3);26642665// VECTOR Galois Field Multiply Sum2666inline void z_vgfm( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2667inline void z_vgfmb( VectorRegister v1, VectorRegister v2, VectorRegister v3);2668inline void z_vgfmh( VectorRegister v1, VectorRegister v2, VectorRegister v3);2669inline void z_vgfmf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2670inline void z_vgfmg( VectorRegister v1, VectorRegister v2, VectorRegister v3);2671// VECTOR Galois Field Multiply Sum and Accumulate2672inline void z_vgfma( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);2673inline void z_vgfmab( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);2674inline void z_vgfmah( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);2675inline void z_vgfmaf( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);2676inline void z_vgfmag( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);26772678//---< Vector Logical Instructions >---26792680// AND2681inline void z_vn( VectorRegister v1, VectorRegister v2, VectorRegister v3);2682inline void z_vnc( VectorRegister v1, VectorRegister v2, VectorRegister v3);26832684// XOR2685inline void z_vx( VectorRegister v1, VectorRegister v2, VectorRegister v3);26862687// NOR2688inline void z_vno( VectorRegister v1, VectorRegister v2, VectorRegister v3);26892690// OR2691inline void z_vo( VectorRegister v1, VectorRegister v2, VectorRegister v3);26922693// Comparison (element-wise)2694inline void z_vceq( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4, int64_t cc5);2695inline void z_vceqb( VectorRegister v1, VectorRegister v2, VectorRegister v3);2696inline void z_vceqh( VectorRegister v1, VectorRegister v2, VectorRegister v3);2697inline void z_vceqf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2698inline void z_vceqg( VectorRegister v1, VectorRegister v2, VectorRegister v3);2699inline void z_vceqbs( VectorRegister v1, VectorRegister v2, VectorRegister v3);2700inline void z_vceqhs( VectorRegister v1, VectorRegister v2, VectorRegister v3);2701inline void z_vceqfs( VectorRegister v1, VectorRegister v2, VectorRegister v3);2702inline void z_vceqgs( VectorRegister v1, VectorRegister v2, VectorRegister v3);2703inline void z_vch( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4, int64_t cc5);2704inline void z_vchb( VectorRegister v1, VectorRegister v2, VectorRegister v3);2705inline void z_vchh( VectorRegister v1, VectorRegister v2, VectorRegister v3);2706inline void z_vchf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2707inline void z_vchg( VectorRegister v1, VectorRegister v2, VectorRegister v3);2708inline void z_vchbs( VectorRegister v1, VectorRegister v2, VectorRegister v3);2709inline void z_vchhs( VectorRegister v1, VectorRegister v2, VectorRegister v3);2710inline void z_vchfs( VectorRegister v1, VectorRegister v2, VectorRegister v3);2711inline void z_vchgs( VectorRegister v1, VectorRegister v2, VectorRegister v3);2712inline void z_vchl( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4, int64_t cc5);2713inline void z_vchlb( VectorRegister v1, VectorRegister v2, VectorRegister v3);2714inline void z_vchlh( VectorRegister v1, VectorRegister v2, VectorRegister v3);2715inline void z_vchlf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2716inline void z_vchlg( VectorRegister v1, VectorRegister v2, VectorRegister v3);2717inline void z_vchlbs( VectorRegister v1, VectorRegister v2, VectorRegister v3);2718inline void z_vchlhs( VectorRegister v1, VectorRegister v2, VectorRegister v3);2719inline void z_vchlfs( VectorRegister v1, VectorRegister v2, VectorRegister v3);2720inline void z_vchlgs( VectorRegister v1, VectorRegister v2, VectorRegister v3);27212722// Max/Min (element-wise)2723inline void z_vmx( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2724inline void z_vmxb( VectorRegister v1, VectorRegister v2, VectorRegister v3);2725inline void z_vmxh( VectorRegister v1, VectorRegister v2, VectorRegister v3);2726inline void z_vmxf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2727inline void z_vmxg( VectorRegister v1, VectorRegister v2, VectorRegister v3);2728inline void z_vmxl( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2729inline void z_vmxlb( VectorRegister v1, VectorRegister v2, VectorRegister v3);2730inline void z_vmxlh( VectorRegister v1, VectorRegister v2, VectorRegister v3);2731inline void z_vmxlf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2732inline void z_vmxlg( VectorRegister v1, VectorRegister v2, VectorRegister v3);2733inline void z_vmn( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2734inline void z_vmnb( VectorRegister v1, VectorRegister v2, VectorRegister v3);2735inline void z_vmnh( VectorRegister v1, VectorRegister v2, VectorRegister v3);2736inline void z_vmnf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2737inline void z_vmng( VectorRegister v1, VectorRegister v2, VectorRegister v3);2738inline void z_vmnl( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2739inline void z_vmnlb( VectorRegister v1, VectorRegister v2, VectorRegister v3);2740inline void z_vmnlh( VectorRegister v1, VectorRegister v2, VectorRegister v3);2741inline void z_vmnlf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2742inline void z_vmnlg( VectorRegister v1, VectorRegister v2, VectorRegister v3);27432744// Leading/Trailing Zeros, population count2745inline void z_vclz( VectorRegister v1, VectorRegister v2, int64_t m3);2746inline void z_vclzb( VectorRegister v1, VectorRegister v2);2747inline void z_vclzh( VectorRegister v1, VectorRegister v2);2748inline void z_vclzf( VectorRegister v1, VectorRegister v2);2749inline void z_vclzg( VectorRegister v1, VectorRegister v2);2750inline void z_vctz( VectorRegister v1, VectorRegister v2, int64_t m3);2751inline void z_vctzb( VectorRegister v1, VectorRegister v2);2752inline void z_vctzh( VectorRegister v1, VectorRegister v2);2753inline void z_vctzf( VectorRegister v1, VectorRegister v2);2754inline void z_vctzg( VectorRegister v1, VectorRegister v2);2755inline void z_vpopct( VectorRegister v1, VectorRegister v2, int64_t m3);27562757// Rotate/Shift2758inline void z_verllv( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2759inline void z_verllvb(VectorRegister v1, VectorRegister v2, VectorRegister v3);2760inline void z_verllvh(VectorRegister v1, VectorRegister v2, VectorRegister v3);2761inline void z_verllvf(VectorRegister v1, VectorRegister v2, VectorRegister v3);2762inline void z_verllvg(VectorRegister v1, VectorRegister v2, VectorRegister v3);2763inline void z_verll( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2, int64_t m4);2764inline void z_verllb( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);2765inline void z_verllh( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);2766inline void z_verllf( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);2767inline void z_verllg( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);2768inline void z_verim( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4, int64_t m5);2769inline void z_verimb( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4);2770inline void z_verimh( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4);2771inline void z_verimf( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4);2772inline void z_verimg( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4);27732774inline void z_veslv( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2775inline void z_veslvb( VectorRegister v1, VectorRegister v2, VectorRegister v3);2776inline void z_veslvh( VectorRegister v1, VectorRegister v2, VectorRegister v3);2777inline void z_veslvf( VectorRegister v1, VectorRegister v2, VectorRegister v3);2778inline void z_veslvg( VectorRegister v1, VectorRegister v2, VectorRegister v3);2779inline void z_vesl( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2, int64_t m4);2780inline void z_veslb( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);2781inline void z_veslh( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);2782inline void z_veslf( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);2783inline void z_veslg( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);27842785inline void z_vesrav( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2786inline void z_vesravb(VectorRegister v1, VectorRegister v2, VectorRegister v3);2787inline void z_vesravh(VectorRegister v1, VectorRegister v2, VectorRegister v3);2788inline void z_vesravf(VectorRegister v1, VectorRegister v2, VectorRegister v3);2789inline void z_vesravg(VectorRegister v1, VectorRegister v2, VectorRegister v3);2790inline void z_vesra( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2, int64_t m4);2791inline void z_vesrab( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);2792inline void z_vesrah( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);2793inline void z_vesraf( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);2794inline void z_vesrag( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);2795inline void z_vesrlv( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);2796inline void z_vesrlvb(VectorRegister v1, VectorRegister v2, VectorRegister v3);2797inline void z_vesrlvh(VectorRegister v1, VectorRegister v2, VectorRegister v3);2798inline void z_vesrlvf(VectorRegister v1, VectorRegister v2, VectorRegister v3);2799inline void z_vesrlvg(VectorRegister v1, VectorRegister v2, VectorRegister v3);2800inline void z_vesrl( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2, int64_t m4);2801inline void z_vesrlb( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);2802inline void z_vesrlh( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);2803inline void z_vesrlf( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);2804inline void z_vesrlg( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);28052806inline void z_vsl( VectorRegister v1, VectorRegister v2, VectorRegister v3);2807inline void z_vslb( VectorRegister v1, VectorRegister v2, VectorRegister v3);2808inline void z_vsldb( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4);28092810inline void z_vsra( VectorRegister v1, VectorRegister v2, VectorRegister v3);2811inline void z_vsrab( VectorRegister v1, VectorRegister v2, VectorRegister v3);2812inline void z_vsrl( VectorRegister v1, VectorRegister v2, VectorRegister v3);2813inline void z_vsrlb( VectorRegister v1, VectorRegister v2, VectorRegister v3);28142815// Test under Mask2816inline void z_vtm( VectorRegister v1, VectorRegister v2);28172818//---< Vector String Instructions >---2819inline void z_vfae( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4, int64_t cc5); // Find any element2820inline void z_vfaeb( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);2821inline void z_vfaeh( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);2822inline void z_vfaef( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);2823inline void z_vfee( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4, int64_t cc5); // Find element equal2824inline void z_vfeeb( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);2825inline void z_vfeeh( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);2826inline void z_vfeef( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);2827inline void z_vfene( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4, int64_t cc5); // Find element not equal2828inline void z_vfeneb( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);2829inline void z_vfeneh( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);2830inline void z_vfenef( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);2831inline void z_vstrc( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t imm5, int64_t cc6); // String range compare2832inline void z_vstrcb( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t cc6);2833inline void z_vstrch( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t cc6);2834inline void z_vstrcf( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t cc6);2835inline void z_vistr( VectorRegister v1, VectorRegister v2, int64_t imm3, int64_t cc5); // Isolate String2836inline void z_vistrb( VectorRegister v1, VectorRegister v2, int64_t cc5);2837inline void z_vistrh( VectorRegister v1, VectorRegister v2, int64_t cc5);2838inline void z_vistrf( VectorRegister v1, VectorRegister v2, int64_t cc5);2839inline void z_vistrbs(VectorRegister v1, VectorRegister v2);2840inline void z_vistrhs(VectorRegister v1, VectorRegister v2);2841inline void z_vistrfs(VectorRegister v1, VectorRegister v2);284228432844// Floatingpoint instructions2845// ==========================28462847// compare instructions2848inline void z_cebr(FloatRegister r1, FloatRegister r2); // compare (r1, r2) ; float2849inline void z_ceb(FloatRegister r1, int64_t d2, Register x2, Register b2); // compare (r1, *(d2_imm12+x2+b2)) ; float2850inline void z_ceb(FloatRegister r1, const Address &a); // compare (r1, *(d2_imm12+x2+b2)) ; float2851inline void z_cdbr(FloatRegister r1, FloatRegister r2); // compare (r1, r2) ; double2852inline void z_cdb(FloatRegister r1, int64_t d2, Register x2, Register b2); // compare (r1, *(d2_imm12+x2+b2)) ; double2853inline void z_cdb(FloatRegister r1, const Address &a); // compare (r1, *(d2_imm12+x2+b2)) ; double28542855// load instructions2856inline void z_le( FloatRegister r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_uimm12+x2+b2) ; float2857inline void z_ley(FloatRegister r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; float2858inline void z_ld( FloatRegister r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_uimm12+x2+b2) ; double2859inline void z_ldy(FloatRegister r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; double2860inline void z_le( FloatRegister r1, const Address &a); // load r1 = *(a) ; float2861inline void z_ley(FloatRegister r1, const Address &a); // load r1 = *(a) ; float2862inline void z_ld( FloatRegister r1, const Address &a); // load r1 = *(a) ; double2863inline void z_ldy(FloatRegister r1, const Address &a); // load r1 = *(a) ; double28642865// store instructions2866inline void z_ste( FloatRegister r1, int64_t d2, Register x2, Register b2); // store *(d2_uimm12+x2+b2) = r1 ; float2867inline void z_stey(FloatRegister r1, int64_t d2, Register x2, Register b2); // store *(d2_imm20+x2+b2) = r1 ; float2868inline void z_std( FloatRegister r1, int64_t d2, Register x2, Register b2); // store *(d2_uimm12+x2+b2) = r1 ; double2869inline void z_stdy(FloatRegister r1, int64_t d2, Register x2, Register b2); // store *(d2_imm20+x2+b2) = r1 ; double2870inline void z_ste( FloatRegister r1, const Address &a); // store *(a) = r1 ; float2871inline void z_stey(FloatRegister r1, const Address &a); // store *(a) = r1 ; float2872inline void z_std( FloatRegister r1, const Address &a); // store *(a) = r1 ; double2873inline void z_stdy(FloatRegister r1, const Address &a); // store *(a) = r1 ; double28742875// load and store immediates2876inline void z_lzer(FloatRegister r1); // r1 = 0 ; single2877inline void z_lzdr(FloatRegister r1); // r1 = 0 ; double28782879// Move and Convert instructions2880inline void z_ler(FloatRegister r1, FloatRegister r2); // move r1 = r2 ; float2881inline void z_ldr(FloatRegister r1, FloatRegister r2); // move r1 = r2 ; double2882inline void z_ledbr(FloatRegister r1, FloatRegister r2); // conv / round r1 = r2 ; float <- double2883inline void z_ldebr(FloatRegister r1, FloatRegister r2); // conv r1 = r2 ; double <- float28842885// move between integer and float registers2886inline void z_cefbr( FloatRegister r1, Register r2); // r1 = r2; float <-- int322887inline void z_cdfbr( FloatRegister r1, Register r2); // r1 = r2; double <-- int322888inline void z_cegbr( FloatRegister r1, Register r2); // r1 = r2; float <-- int642889inline void z_cdgbr( FloatRegister r1, Register r2); // r1 = r2; double <-- int6428902891// rounding mode for float-2-int conversions2892inline void z_cfebr(Register r1, FloatRegister r2, RoundingMode m); // conv r1 = r2 ; int32 <-- float2893inline void z_cfdbr(Register r1, FloatRegister r2, RoundingMode m); // conv r1 = r2 ; int32 <-- double2894inline void z_cgebr(Register r1, FloatRegister r2, RoundingMode m); // conv r1 = r2 ; int64 <-- float2895inline void z_cgdbr(Register r1, FloatRegister r2, RoundingMode m); // conv r1 = r2 ; int64 <-- double28962897inline void z_ldgr(FloatRegister r1, Register r2); // fr1 = r2 ; what kind of conversion? -- z102898inline void z_lgdr(Register r1, FloatRegister r2); // r1 = fr2 ; what kind of conversion? -- z10289929002901// ADD2902inline void z_aebr(FloatRegister f1, FloatRegister f2); // f1 = f1 + f2 ; float2903inline void z_adbr(FloatRegister f1, FloatRegister f2); // f1 = f1 + f2 ; double2904inline void z_aeb( FloatRegister f1, int64_t d2, Register x2, Register b2); // f1 = f1 + *(d2+x2+b2) ; float2905inline void z_adb( FloatRegister f1, int64_t d2, Register x2, Register b2); // f1 = f1 + *(d2+x2+b2) ; double2906inline void z_aeb( FloatRegister f1, const Address& a); // f1 = f1 + *(a) ; float2907inline void z_adb( FloatRegister f1, const Address& a); // f1 = f1 + *(a) ; double29082909// SUB2910inline void z_sebr(FloatRegister f1, FloatRegister f2); // f1 = f1 - f2 ; float2911inline void z_sdbr(FloatRegister f1, FloatRegister f2); // f1 = f1 - f2 ; double2912inline void z_seb( FloatRegister f1, int64_t d2, Register x2, Register b2); // f1 = f1 - *(d2+x2+b2) ; float2913inline void z_sdb( FloatRegister f1, int64_t d2, Register x2, Register b2); // f1 = f1 - *(d2+x2+b2) ; double2914inline void z_seb( FloatRegister f1, const Address& a); // f1 = f1 - *(a) ; float2915inline void z_sdb( FloatRegister f1, const Address& a); // f1 = f1 - *(a) ; double2916// negate2917inline void z_lcebr(FloatRegister r1, FloatRegister r2); // neg r1 = -r2 ; float2918inline void z_lcdbr(FloatRegister r1, FloatRegister r2); // neg r1 = -r2 ; double29192920// Absolute value, monadic if fr2 == noreg.2921inline void z_lpdbr( FloatRegister fr1, FloatRegister fr2 = fnoreg); // fr1 = |fr2|292229232924// MUL2925inline void z_meebr(FloatRegister f1, FloatRegister f2); // f1 = f1 * f2 ; float2926inline void z_mdbr( FloatRegister f1, FloatRegister f2); // f1 = f1 * f2 ; double2927inline void z_meeb( FloatRegister f1, int64_t d2, Register x2, Register b2); // f1 = f1 * *(d2+x2+b2) ; float2928inline void z_mdb( FloatRegister f1, int64_t d2, Register x2, Register b2); // f1 = f1 * *(d2+x2+b2) ; double2929inline void z_meeb( FloatRegister f1, const Address& a);2930inline void z_mdb( FloatRegister f1, const Address& a);29312932// MUL-ADD2933inline void z_maebr(FloatRegister f1, FloatRegister f3, FloatRegister f2); // f1 = f3 * f2 + f1 ; float2934inline void z_madbr(FloatRegister f1, FloatRegister f3, FloatRegister f2); // f1 = f3 * f2 + f1 ; double2935inline void z_msebr(FloatRegister f1, FloatRegister f3, FloatRegister f2); // f1 = f3 * f2 - f1 ; float2936inline void z_msdbr(FloatRegister f1, FloatRegister f3, FloatRegister f2); // f1 = f3 * f2 - f1 ; double2937inline void z_maeb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) + f1 ; float2938inline void z_madb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) + f1 ; double2939inline void z_mseb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) - f1 ; float2940inline void z_msdb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) - f1 ; double2941inline void z_maeb(FloatRegister f1, FloatRegister f3, const Address& a);2942inline void z_madb(FloatRegister f1, FloatRegister f3, const Address& a);2943inline void z_mseb(FloatRegister f1, FloatRegister f3, const Address& a);2944inline void z_msdb(FloatRegister f1, FloatRegister f3, const Address& a);29452946// DIV2947inline void z_debr( FloatRegister f1, FloatRegister f2); // f1 = f1 / f2 ; float2948inline void z_ddbr( FloatRegister f1, FloatRegister f2); // f1 = f1 / f2 ; double2949inline void z_deb( FloatRegister f1, int64_t d2, Register x2, Register b2); // f1 = f1 / *(d2+x2+b2) ; float2950inline void z_ddb( FloatRegister f1, int64_t d2, Register x2, Register b2); // f1 = f1 / *(d2+x2+b2) ; double2951inline void z_deb( FloatRegister f1, const Address& a); // f1 = f1 / *(a) ; float2952inline void z_ddb( FloatRegister f1, const Address& a); // f1 = f1 / *(a) ; double29532954// square root2955inline void z_sqdbr(FloatRegister fr1, FloatRegister fr2); // fr1 = sqrt(fr2) ; double2956inline void z_sqdb( FloatRegister fr1, int64_t d2, Register x2, Register b2); // fr1 = srqt( *(d2+x2+b2)2957inline void z_sqdb( FloatRegister fr1, int64_t d2, Register b2); // fr1 = srqt( *(d2+b2)29582959// Nop instruction2960// ===============29612962// branch never (nop)2963inline void z_nop();2964inline void nop(); // Used by shared code.29652966// ===============================================================================================29672968// Simplified emitters:2969// ====================297029712972// Some memory instructions without index register (just convenience).2973inline void z_layz(Register r1, int64_t d2, Register b2 = Z_R0);2974inline void z_lay(Register r1, int64_t d2, Register b2);2975inline void z_laz(Register r1, int64_t d2, Register b2);2976inline void z_la(Register r1, int64_t d2, Register b2);2977inline void z_l(Register r1, int64_t d2, Register b2);2978inline void z_ly(Register r1, int64_t d2, Register b2);2979inline void z_lg(Register r1, int64_t d2, Register b2);2980inline void z_st(Register r1, int64_t d2, Register b2);2981inline void z_sty(Register r1, int64_t d2, Register b2);2982inline void z_stg(Register r1, int64_t d2, Register b2);2983inline void z_lgf(Register r1, int64_t d2, Register b2);2984inline void z_lgh(Register r1, int64_t d2, Register b2);2985inline void z_llgh(Register r1, int64_t d2, Register b2);2986inline void z_llgf(Register r1, int64_t d2, Register b2);2987inline void z_lgb(Register r1, int64_t d2, Register b2);2988inline void z_cl( Register r1, int64_t d2, Register b2);2989inline void z_c(Register r1, int64_t d2, Register b2);2990inline void z_cg(Register r1, int64_t d2, Register b2);2991inline void z_sh(Register r1, int64_t d2, Register b2);2992inline void z_shy(Register r1, int64_t d2, Register b2);2993inline void z_ste(FloatRegister r1, int64_t d2, Register b2);2994inline void z_std(FloatRegister r1, int64_t d2, Register b2);2995inline void z_stdy(FloatRegister r1, int64_t d2, Register b2);2996inline void z_stey(FloatRegister r1, int64_t d2, Register b2);2997inline void z_ld(FloatRegister r1, int64_t d2, Register b2);2998inline void z_ldy(FloatRegister r1, int64_t d2, Register b2);2999inline void z_le(FloatRegister r1, int64_t d2, Register b2);3000inline void z_ley(FloatRegister r1, int64_t d2, Register b2);30013002inline void z_agf(Register r1, int64_t d2, Register b2);30033004inline void z_exrl(Register r1, Label& L);3005inline void z_larl(Register r1, Label& L);3006inline void z_bru( Label& L);3007inline void z_brul(Label& L);3008inline void z_brul(address a);3009inline void z_brh( Label& L);3010inline void z_brl( Label& L);3011inline void z_bre( Label& L);3012inline void z_brnh(Label& L);3013inline void z_brnl(Label& L);3014inline void z_brne(Label& L);3015inline void z_brz( Label& L);3016inline void z_brnz(Label& L);3017inline void z_brnaz(Label& L);3018inline void z_braz(Label& L);3019inline void z_brnp(Label& L);30203021inline void z_btrue( Label& L);3022inline void z_bfalse(Label& L);30233024inline void z_bvat(Label& L); // all true3025inline void z_bvnt(Label& L); // not all true (mixed or all false)3026inline void z_bvmix(Label& L); // mixed true and false3027inline void z_bvnf(Label& L); // not all false (mixed or all true)3028inline void z_bvaf(Label& L); // all false30293030inline void z_brno( Label& L);303130323033inline void z_basr(Register r1, Register r2);3034inline void z_brasl(Register r1, address a);3035inline void z_brct(Register r1, address a);3036inline void z_brct(Register r1, Label& L);30373038inline void z_brxh(Register r1, Register r3, address a);3039inline void z_brxh(Register r1, Register r3, Label& L);30403041inline void z_brxle(Register r1, Register r3, address a);3042inline void z_brxle(Register r1, Register r3, Label& L);30433044inline void z_brxhg(Register r1, Register r3, address a);3045inline void z_brxhg(Register r1, Register r3, Label& L);30463047inline void z_brxlg(Register r1, Register r3, address a);3048inline void z_brxlg(Register r1, Register r3, Label& L);30493050// Ppopulation count intrinsics.3051inline void z_flogr(Register r1, Register r2); // find leftmost one3052inline void z_popcnt(Register r1, Register r2); // population count3053inline void z_ahhhr(Register r1, Register r2, Register r3); // ADD halfword high high3054inline void z_ahhlr(Register r1, Register r2, Register r3); // ADD halfword high low30553056inline void z_tam();3057inline void z_stckf(int64_t d2, Register b2);3058inline void z_stm( Register r1, Register r3, int64_t d2, Register b2);3059inline void z_stmy(Register r1, Register r3, int64_t d2, Register b2);3060inline void z_stmg(Register r1, Register r3, int64_t d2, Register b2);3061inline void z_lm( Register r1, Register r3, int64_t d2, Register b2);3062inline void z_lmy(Register r1, Register r3, int64_t d2, Register b2);3063inline void z_lmg(Register r1, Register r3, int64_t d2, Register b2);30643065inline void z_cs( Register r1, Register r3, int64_t d2, Register b2);3066inline void z_csy(Register r1, Register r3, int64_t d2, Register b2);3067inline void z_csg(Register r1, Register r3, int64_t d2, Register b2);3068inline void z_cs( Register r1, Register r3, const Address& a);3069inline void z_csy(Register r1, Register r3, const Address& a);3070inline void z_csg(Register r1, Register r3, const Address& a);30713072inline void z_cvd(Register r1, int64_t d2, Register x2, Register b2);3073inline void z_cvdg(Register r1, int64_t d2, Register x2, Register b2);3074inline void z_cvd(Register r1, int64_t d2, Register b2);3075inline void z_cvdg(Register r1, int64_t d2, Register b2);30763077// Instruction queries:3078// instruction properties and recognize emitted instructions3079// ===========================================================30803081static int nop_size() { return 2; }30823083static int z_brul_size() { return 6; }30843085static bool is_z_basr(short x) {3086return (BASR_ZOPC == (x & BASR_MASK));3087}3088static bool is_z_algr(long x) {3089return (ALGR_ZOPC == (x & RRE_MASK));3090}3091static bool is_z_lb(long x) {3092return (LB_ZOPC == (x & LB_MASK));3093}3094static bool is_z_lh(int x) {3095return (LH_ZOPC == (x & LH_MASK));3096}3097static bool is_z_l(int x) {3098return (L_ZOPC == (x & L_MASK));3099}3100static bool is_z_lgr(long x) {3101return (LGR_ZOPC == (x & RRE_MASK));3102}3103static bool is_z_ly(long x) {3104return (LY_ZOPC == (x & LY_MASK));3105}3106static bool is_z_lg(long x) {3107return (LG_ZOPC == (x & LG_MASK));3108}3109static bool is_z_llgh(long x) {3110return (LLGH_ZOPC == (x & LLGH_MASK));3111}3112static bool is_z_llgf(long x) {3113return (LLGF_ZOPC == (x & LLGF_MASK));3114}3115static bool is_z_le(int x) {3116return (LE_ZOPC == (x & LE_MASK));3117}3118static bool is_z_ld(int x) {3119return (LD_ZOPC == (x & LD_MASK));3120}3121static bool is_z_st(int x) {3122return (ST_ZOPC == (x & ST_MASK));3123}3124static bool is_z_stc(int x) {3125return (STC_ZOPC == (x & STC_MASK));3126}3127static bool is_z_stg(long x) {3128return (STG_ZOPC == (x & STG_MASK));3129}3130static bool is_z_sth(int x) {3131return (STH_ZOPC == (x & STH_MASK));3132}3133static bool is_z_ste(int x) {3134return (STE_ZOPC == (x & STE_MASK));3135}3136static bool is_z_std(int x) {3137return (STD_ZOPC == (x & STD_MASK));3138}3139static bool is_z_slag(long x) {3140return (SLAG_ZOPC == (x & SLAG_MASK));3141}3142static bool is_z_tmy(long x) {3143return (TMY_ZOPC == (x & TMY_MASK));3144}3145static bool is_z_tm(long x) {3146return ((unsigned int)TM_ZOPC == (x & (unsigned int)TM_MASK));3147}3148static bool is_z_bcr(long x) {3149return (BCR_ZOPC == (x & BCR_MASK));3150}3151static bool is_z_nop(long x) {3152return is_z_bcr(x) && ((x & 0x00ff) == 0);3153}3154static bool is_z_nop(address x) {3155return is_z_nop(* (short *) x);3156}3157static bool is_z_br(long x) {3158return is_z_bcr(x) && ((x & 0x00f0) == 0x00f0);3159}3160static bool is_z_brc(long x, int cond) {3161return ((unsigned int)BRC_ZOPC == (x & BRC_MASK)) && ((cond<<20) == (x & 0x00f00000U));3162}3163// Make use of lightweight sync.3164static bool is_z_sync_full(long x) {3165return is_z_bcr(x) && (((x & 0x00f0)>>4)==bcondFullSync) && ((x & 0x000f)==0x0000);3166}3167static bool is_z_sync_light(long x) {3168return is_z_bcr(x) && (((x & 0x00f0)>>4)==bcondLightSync) && ((x & 0x000f)==0x0000);3169}3170static bool is_z_sync(long x) {3171return is_z_sync_full(x) || is_z_sync_light(x);3172}31733174static bool is_z_brasl(long x) {3175return (BRASL_ZOPC == (x & BRASL_MASK));3176}3177static bool is_z_brasl(address a) {3178long x = (*((long *)a))>>16;3179return is_z_brasl(x);3180}3181static bool is_z_larl(long x) {3182return (LARL_ZOPC == (x & LARL_MASK));3183}3184static bool is_z_lgrl(long x) {3185return (LGRL_ZOPC == (x & LGRL_MASK));3186}3187static bool is_z_lgrl(address a) {3188long x = (*((long *)a))>>16;3189return is_z_lgrl(x);3190}31913192static bool is_z_lghi(unsigned long x) {3193return (unsigned int)LGHI_ZOPC == (x & (unsigned int)LGHI_MASK);3194}31953196static bool is_z_llill(unsigned long x) {3197return (unsigned int)LLILL_ZOPC == (x & (unsigned int)LLI_MASK);3198}3199static bool is_z_llilh(unsigned long x) {3200return (unsigned int)LLILH_ZOPC == (x & (unsigned int)LLI_MASK);3201}3202static bool is_z_llihl(unsigned long x) {3203return (unsigned int)LLIHL_ZOPC == (x & (unsigned int)LLI_MASK);3204}3205static bool is_z_llihh(unsigned long x) {3206return (unsigned int)LLIHH_ZOPC == (x & (unsigned int)LLI_MASK);3207}3208static bool is_z_llilf(unsigned long x) {3209return LLILF_ZOPC == (x & LLIF_MASK);3210}3211static bool is_z_llihf(unsigned long x) {3212return LLIHF_ZOPC == (x & LLIF_MASK);3213}32143215static bool is_z_iill(unsigned long x) {3216return (unsigned int)IILL_ZOPC == (x & (unsigned int)II_MASK);3217}3218static bool is_z_iilh(unsigned long x) {3219return (unsigned int)IILH_ZOPC == (x & (unsigned int)II_MASK);3220}3221static bool is_z_iihl(unsigned long x) {3222return (unsigned int)IIHL_ZOPC == (x & (unsigned int)II_MASK);3223}3224static bool is_z_iihh(unsigned long x) {3225return (unsigned int)IIHH_ZOPC == (x & (unsigned int)II_MASK);3226}3227static bool is_z_iilf(unsigned long x) {3228return IILF_ZOPC == (x & IIF_MASK);3229}3230static bool is_z_iihf(unsigned long x) {3231return IIHF_ZOPC == (x & IIF_MASK);3232}32333234static inline bool is_equal(unsigned long inst, unsigned long idef);3235static inline bool is_equal(unsigned long inst, unsigned long idef, unsigned long imask);3236static inline bool is_equal(address iloc, unsigned long idef);3237static inline bool is_equal(address iloc, unsigned long idef, unsigned long imask);32383239static inline bool is_sigtrap_range_check(address pc);3240static inline bool is_sigtrap_zero_check(address pc);32413242//-----------------3243// memory barriers3244//-----------------3245// machine barrier instructions:3246//3247// - z_sync Two-way memory barrier, aka fence.3248// Only load-after-store-order is not guaranteed in the3249// 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 implementation3255// Load|Store3256// - z_acquire orders Load|Store, empty implementation3257// Load|Load3258// - z_fence orders Store|Store, implemented as z_sync.3259// Load|Store,3260// Load|Load,3261// Store|Load3262//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.32673268inline void z_sync();3269inline void z_release();3270inline void z_acquire();3271inline void z_fence();32723273// Creation3274Assembler(CodeBuffer* code) : AbstractAssembler(code) { }32753276};32773278#endif // CPU_S390_ASSEMBLER_S390_HPP327932803281