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