Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/jdk17u
Path: blob/master/src/hotspot/cpu/ppc/assembler_ppc.hpp
64440 views
1
/*
2
* Copyright (c) 2002, 2021, Oracle and/or its affiliates. All rights reserved.
3
* Copyright (c) 2012, 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_PPC_ASSEMBLER_PPC_HPP
27
#define CPU_PPC_ASSEMBLER_PPC_HPP
28
29
#include "asm/assembler.hpp"
30
#include "asm/register.hpp"
31
32
// Address is an abstraction used to represent a memory location
33
// as used in assembler instructions.
34
// PPC instructions grok either baseReg + indexReg or baseReg + disp.
35
class Address {
36
private:
37
Register _base; // Base register.
38
Register _index; // Index register.
39
intptr_t _disp; // Displacement.
40
41
public:
42
Address(Register b, Register i, address d = 0)
43
: _base(b), _index(i), _disp((intptr_t)d) {
44
assert(i == noreg || d == 0, "can't have both");
45
}
46
47
Address(Register b, address d = 0)
48
: _base(b), _index(noreg), _disp((intptr_t)d) {}
49
50
Address(Register b, ByteSize d)
51
: _base(b), _index(noreg), _disp((intptr_t)d) {}
52
53
Address(Register b, intptr_t d)
54
: _base(b), _index(noreg), _disp(d) {}
55
56
Address(Register b, RegisterOrConstant roc)
57
: _base(b), _index(noreg), _disp(0) {
58
if (roc.is_constant()) _disp = roc.as_constant(); else _index = roc.as_register();
59
}
60
61
Address()
62
: _base(noreg), _index(noreg), _disp(0) {}
63
64
// accessors
65
Register base() const { return _base; }
66
Register index() const { return _index; }
67
int disp() const { return (int)_disp; }
68
bool is_const() const { return _base == noreg && _index == noreg; }
69
};
70
71
class AddressLiteral {
72
private:
73
address _address;
74
RelocationHolder _rspec;
75
76
RelocationHolder rspec_from_rtype(relocInfo::relocType rtype, address addr) {
77
switch (rtype) {
78
case relocInfo::external_word_type:
79
return external_word_Relocation::spec(addr);
80
case relocInfo::internal_word_type:
81
return internal_word_Relocation::spec(addr);
82
case relocInfo::opt_virtual_call_type:
83
return opt_virtual_call_Relocation::spec();
84
case relocInfo::static_call_type:
85
return static_call_Relocation::spec();
86
case relocInfo::runtime_call_type:
87
return runtime_call_Relocation::spec();
88
case relocInfo::none:
89
return RelocationHolder();
90
default:
91
ShouldNotReachHere();
92
return RelocationHolder();
93
}
94
}
95
96
protected:
97
// creation
98
AddressLiteral() : _address(NULL), _rspec(NULL) {}
99
100
public:
101
AddressLiteral(address addr, RelocationHolder const& rspec)
102
: _address(addr),
103
_rspec(rspec) {}
104
105
AddressLiteral(address addr, relocInfo::relocType rtype = relocInfo::none)
106
: _address((address) addr),
107
_rspec(rspec_from_rtype(rtype, (address) addr)) {}
108
109
AddressLiteral(oop* addr, relocInfo::relocType rtype = relocInfo::none)
110
: _address((address) addr),
111
_rspec(rspec_from_rtype(rtype, (address) addr)) {}
112
113
intptr_t value() const { return (intptr_t) _address; }
114
115
const RelocationHolder& rspec() const { return _rspec; }
116
};
117
118
// Argument is an abstraction used to represent an outgoing
119
// actual argument or an incoming formal parameter, whether
120
// it resides in memory or in a register, in a manner consistent
121
// with the PPC Application Binary Interface, or ABI. This is
122
// often referred to as the native or C calling convention.
123
124
class Argument {
125
private:
126
int _number; // The number of the argument.
127
public:
128
enum {
129
// Only 8 registers may contain integer parameters.
130
n_register_parameters = 8,
131
// Can have up to 8 floating registers.
132
n_float_register_parameters = 8,
133
134
// PPC C calling conventions.
135
// The first eight arguments are passed in int regs if they are int.
136
n_int_register_parameters_c = 8,
137
// The first thirteen float arguments are passed in float regs.
138
n_float_register_parameters_c = 13,
139
// Only the first 8 parameters are not placed on the stack. Aix disassembly
140
// shows that xlC places all float args after argument 8 on the stack AND
141
// in a register. This is not documented, but we follow this convention, too.
142
n_regs_not_on_stack_c = 8,
143
};
144
// creation
145
Argument(int number) : _number(number) {}
146
147
int number() const { return _number; }
148
149
// Locating register-based arguments:
150
bool is_register() const { return _number < n_register_parameters; }
151
152
Register as_register() const {
153
assert(is_register(), "must be a register argument");
154
return as_Register(number() + R3_ARG1->encoding());
155
}
156
};
157
158
#if !defined(ABI_ELFv2)
159
// A ppc64 function descriptor.
160
struct FunctionDescriptor {
161
private:
162
address _entry;
163
address _toc;
164
address _env;
165
166
public:
167
inline address entry() const { return _entry; }
168
inline address toc() const { return _toc; }
169
inline address env() const { return _env; }
170
171
inline void set_entry(address entry) { _entry = entry; }
172
inline void set_toc( address toc) { _toc = toc; }
173
inline void set_env( address env) { _env = env; }
174
175
inline static ByteSize entry_offset() { return byte_offset_of(FunctionDescriptor, _entry); }
176
inline static ByteSize toc_offset() { return byte_offset_of(FunctionDescriptor, _toc); }
177
inline static ByteSize env_offset() { return byte_offset_of(FunctionDescriptor, _env); }
178
179
// Friend functions can be called without loading toc and env.
180
enum {
181
friend_toc = 0xcafe,
182
friend_env = 0xc0de
183
};
184
185
inline bool is_friend_function() const {
186
return (toc() == (address) friend_toc) && (env() == (address) friend_env);
187
}
188
189
// Constructor for stack-allocated instances.
190
FunctionDescriptor() {
191
_entry = (address) 0xbad;
192
_toc = (address) 0xbad;
193
_env = (address) 0xbad;
194
}
195
};
196
#endif
197
198
199
// The PPC Assembler: Pure assembler doing NO optimizations on the
200
// instruction level; i.e., what you write is what you get. The
201
// Assembler is generating code into a CodeBuffer.
202
203
class Assembler : public AbstractAssembler {
204
protected:
205
// Displacement routines
206
static int patched_branch(int dest_pos, int inst, int inst_pos);
207
static int branch_destination(int inst, int pos);
208
209
friend class AbstractAssembler;
210
211
// Code patchers need various routines like inv_wdisp()
212
friend class NativeInstruction;
213
friend class NativeGeneralJump;
214
friend class Relocation;
215
216
public:
217
218
enum shifts {
219
XO_21_29_SHIFT = 2,
220
XO_21_30_SHIFT = 1,
221
XO_27_29_SHIFT = 2,
222
XO_30_31_SHIFT = 0,
223
SPR_5_9_SHIFT = 11u, // SPR_5_9 field in bits 11 -- 15
224
SPR_0_4_SHIFT = 16u, // SPR_0_4 field in bits 16 -- 20
225
RS_SHIFT = 21u, // RS field in bits 21 -- 25
226
OPCODE_SHIFT = 26u, // opcode in bits 26 -- 31
227
228
// Shift counts in prefix word
229
PRE_TYPE_SHIFT = 24u, // Prefix type in bits 24 -- 25
230
PRE_ST1_SHIFT = 23u, // ST1 field in bits 23 -- 23
231
PRE_R_SHIFT = 20u, // R-bit in bits 20 -- 20
232
PRE_ST4_SHIFT = 20u, // ST4 field in bits 23 -- 20
233
};
234
235
enum opcdxos_masks {
236
XL_FORM_OPCODE_MASK = (63u << OPCODE_SHIFT) | (1023u << 1),
237
ADDI_OPCODE_MASK = (63u << OPCODE_SHIFT),
238
ADDIS_OPCODE_MASK = (63u << OPCODE_SHIFT),
239
BXX_OPCODE_MASK = (63u << OPCODE_SHIFT),
240
BCXX_OPCODE_MASK = (63u << OPCODE_SHIFT),
241
// trap instructions
242
TDI_OPCODE_MASK = (63u << OPCODE_SHIFT),
243
TWI_OPCODE_MASK = (63u << OPCODE_SHIFT),
244
TD_OPCODE_MASK = (63u << OPCODE_SHIFT) | (1023u << 1),
245
TW_OPCODE_MASK = (63u << OPCODE_SHIFT) | (1023u << 1),
246
LD_OPCODE_MASK = (63u << OPCODE_SHIFT) | (3u << XO_30_31_SHIFT), // DS-FORM
247
STD_OPCODE_MASK = LD_OPCODE_MASK,
248
STDU_OPCODE_MASK = STD_OPCODE_MASK,
249
STDX_OPCODE_MASK = (63u << OPCODE_SHIFT) | (1023u << 1),
250
STDUX_OPCODE_MASK = STDX_OPCODE_MASK,
251
STW_OPCODE_MASK = (63u << OPCODE_SHIFT),
252
STWU_OPCODE_MASK = STW_OPCODE_MASK,
253
STWX_OPCODE_MASK = (63u << OPCODE_SHIFT) | (1023u << 1),
254
STWUX_OPCODE_MASK = STWX_OPCODE_MASK,
255
MTCTR_OPCODE_MASK = ~(31u << RS_SHIFT),
256
ORI_OPCODE_MASK = (63u << OPCODE_SHIFT),
257
ORIS_OPCODE_MASK = (63u << OPCODE_SHIFT),
258
RLDICR_OPCODE_MASK = (63u << OPCODE_SHIFT) | (7u << XO_27_29_SHIFT)
259
};
260
261
enum opcdxos {
262
ADD_OPCODE = (31u << OPCODE_SHIFT | 266u << 1),
263
ADDC_OPCODE = (31u << OPCODE_SHIFT | 10u << 1),
264
ADDI_OPCODE = (14u << OPCODE_SHIFT),
265
ADDIS_OPCODE = (15u << OPCODE_SHIFT),
266
ADDIC__OPCODE = (13u << OPCODE_SHIFT),
267
ADDE_OPCODE = (31u << OPCODE_SHIFT | 138u << 1),
268
ADDME_OPCODE = (31u << OPCODE_SHIFT | 234u << 1),
269
ADDZE_OPCODE = (31u << OPCODE_SHIFT | 202u << 1),
270
SUBF_OPCODE = (31u << OPCODE_SHIFT | 40u << 1),
271
SUBFC_OPCODE = (31u << OPCODE_SHIFT | 8u << 1),
272
SUBFE_OPCODE = (31u << OPCODE_SHIFT | 136u << 1),
273
SUBFIC_OPCODE = (8u << OPCODE_SHIFT),
274
SUBFME_OPCODE = (31u << OPCODE_SHIFT | 232u << 1),
275
SUBFZE_OPCODE = (31u << OPCODE_SHIFT | 200u << 1),
276
DIVW_OPCODE = (31u << OPCODE_SHIFT | 491u << 1),
277
DIVWU_OPCODE = (31u << OPCODE_SHIFT | 459u << 1),
278
MULLW_OPCODE = (31u << OPCODE_SHIFT | 235u << 1),
279
MULHW_OPCODE = (31u << OPCODE_SHIFT | 75u << 1),
280
MULHWU_OPCODE = (31u << OPCODE_SHIFT | 11u << 1),
281
MULLI_OPCODE = (7u << OPCODE_SHIFT),
282
AND_OPCODE = (31u << OPCODE_SHIFT | 28u << 1),
283
ANDI_OPCODE = (28u << OPCODE_SHIFT),
284
ANDIS_OPCODE = (29u << OPCODE_SHIFT),
285
ANDC_OPCODE = (31u << OPCODE_SHIFT | 60u << 1),
286
ORC_OPCODE = (31u << OPCODE_SHIFT | 412u << 1),
287
OR_OPCODE = (31u << OPCODE_SHIFT | 444u << 1),
288
ORI_OPCODE = (24u << OPCODE_SHIFT),
289
ORIS_OPCODE = (25u << OPCODE_SHIFT),
290
XOR_OPCODE = (31u << OPCODE_SHIFT | 316u << 1),
291
XORI_OPCODE = (26u << OPCODE_SHIFT),
292
XORIS_OPCODE = (27u << OPCODE_SHIFT),
293
294
NEG_OPCODE = (31u << OPCODE_SHIFT | 104u << 1),
295
296
RLWINM_OPCODE = (21u << OPCODE_SHIFT),
297
CLRRWI_OPCODE = RLWINM_OPCODE,
298
CLRLWI_OPCODE = RLWINM_OPCODE,
299
300
RLWIMI_OPCODE = (20u << OPCODE_SHIFT),
301
302
SLW_OPCODE = (31u << OPCODE_SHIFT | 24u << 1),
303
SLWI_OPCODE = RLWINM_OPCODE,
304
SRW_OPCODE = (31u << OPCODE_SHIFT | 536u << 1),
305
SRWI_OPCODE = RLWINM_OPCODE,
306
SRAW_OPCODE = (31u << OPCODE_SHIFT | 792u << 1),
307
SRAWI_OPCODE = (31u << OPCODE_SHIFT | 824u << 1),
308
309
CMP_OPCODE = (31u << OPCODE_SHIFT | 0u << 1),
310
CMPI_OPCODE = (11u << OPCODE_SHIFT),
311
CMPL_OPCODE = (31u << OPCODE_SHIFT | 32u << 1),
312
CMPLI_OPCODE = (10u << OPCODE_SHIFT),
313
CMPRB_OPCODE = (31u << OPCODE_SHIFT | 192u << 1),
314
CMPEQB_OPCODE = (31u << OPCODE_SHIFT | 224u << 1),
315
316
ISEL_OPCODE = (31u << OPCODE_SHIFT | 15u << 1),
317
318
// Special purpose registers
319
MTSPR_OPCODE = (31u << OPCODE_SHIFT | 467u << 1),
320
MFSPR_OPCODE = (31u << OPCODE_SHIFT | 339u << 1),
321
322
MTXER_OPCODE = (MTSPR_OPCODE | 1 << SPR_0_4_SHIFT),
323
MFXER_OPCODE = (MFSPR_OPCODE | 1 << SPR_0_4_SHIFT),
324
325
MTDSCR_OPCODE = (MTSPR_OPCODE | 3 << SPR_0_4_SHIFT),
326
MFDSCR_OPCODE = (MFSPR_OPCODE | 3 << SPR_0_4_SHIFT),
327
328
MTLR_OPCODE = (MTSPR_OPCODE | 8 << SPR_0_4_SHIFT),
329
MFLR_OPCODE = (MFSPR_OPCODE | 8 << SPR_0_4_SHIFT),
330
331
MTCTR_OPCODE = (MTSPR_OPCODE | 9 << SPR_0_4_SHIFT),
332
MFCTR_OPCODE = (MFSPR_OPCODE | 9 << SPR_0_4_SHIFT),
333
334
// Attention: Higher and lower half are inserted in reversed order.
335
MTTFHAR_OPCODE = (MTSPR_OPCODE | 4 << SPR_5_9_SHIFT | 0 << SPR_0_4_SHIFT),
336
MFTFHAR_OPCODE = (MFSPR_OPCODE | 4 << SPR_5_9_SHIFT | 0 << SPR_0_4_SHIFT),
337
MTTFIAR_OPCODE = (MTSPR_OPCODE | 4 << SPR_5_9_SHIFT | 1 << SPR_0_4_SHIFT),
338
MFTFIAR_OPCODE = (MFSPR_OPCODE | 4 << SPR_5_9_SHIFT | 1 << SPR_0_4_SHIFT),
339
MTTEXASR_OPCODE = (MTSPR_OPCODE | 4 << SPR_5_9_SHIFT | 2 << SPR_0_4_SHIFT),
340
MFTEXASR_OPCODE = (MFSPR_OPCODE | 4 << SPR_5_9_SHIFT | 2 << SPR_0_4_SHIFT),
341
MTTEXASRU_OPCODE = (MTSPR_OPCODE | 4 << SPR_5_9_SHIFT | 3 << SPR_0_4_SHIFT),
342
MFTEXASRU_OPCODE = (MFSPR_OPCODE | 4 << SPR_5_9_SHIFT | 3 << SPR_0_4_SHIFT),
343
344
MTVRSAVE_OPCODE = (MTSPR_OPCODE | 8 << SPR_5_9_SHIFT | 0 << SPR_0_4_SHIFT),
345
MFVRSAVE_OPCODE = (MFSPR_OPCODE | 8 << SPR_5_9_SHIFT | 0 << SPR_0_4_SHIFT),
346
347
MFTB_OPCODE = (MFSPR_OPCODE | 8 << SPR_5_9_SHIFT | 12 << SPR_0_4_SHIFT),
348
349
MTCRF_OPCODE = (31u << OPCODE_SHIFT | 144u << 1),
350
MFCR_OPCODE = (31u << OPCODE_SHIFT | 19u << 1),
351
MCRF_OPCODE = (19u << OPCODE_SHIFT | 0u << 1),
352
MCRXRX_OPCODE = (31u << OPCODE_SHIFT | 576u << 1),
353
SETB_OPCODE = (31u << OPCODE_SHIFT | 128u << 1),
354
355
SETBC_OPCODE = (31u << OPCODE_SHIFT | 384u << 1),
356
SETNBC_OPCODE = (31u << OPCODE_SHIFT | 448u << 1),
357
358
// condition register logic instructions
359
CRAND_OPCODE = (19u << OPCODE_SHIFT | 257u << 1),
360
CRNAND_OPCODE = (19u << OPCODE_SHIFT | 225u << 1),
361
CROR_OPCODE = (19u << OPCODE_SHIFT | 449u << 1),
362
CRXOR_OPCODE = (19u << OPCODE_SHIFT | 193u << 1),
363
CRNOR_OPCODE = (19u << OPCODE_SHIFT | 33u << 1),
364
CREQV_OPCODE = (19u << OPCODE_SHIFT | 289u << 1),
365
CRANDC_OPCODE = (19u << OPCODE_SHIFT | 129u << 1),
366
CRORC_OPCODE = (19u << OPCODE_SHIFT | 417u << 1),
367
368
BCLR_OPCODE = (19u << OPCODE_SHIFT | 16u << 1),
369
BXX_OPCODE = (18u << OPCODE_SHIFT),
370
BCXX_OPCODE = (16u << OPCODE_SHIFT),
371
372
// CTR-related opcodes
373
BCCTR_OPCODE = (19u << OPCODE_SHIFT | 528u << 1),
374
375
LWZ_OPCODE = (32u << OPCODE_SHIFT),
376
LWZX_OPCODE = (31u << OPCODE_SHIFT | 23u << 1),
377
LWZU_OPCODE = (33u << OPCODE_SHIFT),
378
LWBRX_OPCODE = (31u << OPCODE_SHIFT | 534 << 1),
379
380
LHA_OPCODE = (42u << OPCODE_SHIFT),
381
LHAX_OPCODE = (31u << OPCODE_SHIFT | 343u << 1),
382
LHAU_OPCODE = (43u << OPCODE_SHIFT),
383
384
LHZ_OPCODE = (40u << OPCODE_SHIFT),
385
LHZX_OPCODE = (31u << OPCODE_SHIFT | 279u << 1),
386
LHZU_OPCODE = (41u << OPCODE_SHIFT),
387
LHBRX_OPCODE = (31u << OPCODE_SHIFT | 790 << 1),
388
389
LBZ_OPCODE = (34u << OPCODE_SHIFT),
390
LBZX_OPCODE = (31u << OPCODE_SHIFT | 87u << 1),
391
LBZU_OPCODE = (35u << OPCODE_SHIFT),
392
393
STW_OPCODE = (36u << OPCODE_SHIFT),
394
STWX_OPCODE = (31u << OPCODE_SHIFT | 151u << 1),
395
STWU_OPCODE = (37u << OPCODE_SHIFT),
396
STWUX_OPCODE = (31u << OPCODE_SHIFT | 183u << 1),
397
STWBRX_OPCODE = (31u << OPCODE_SHIFT | 662u << 1),
398
399
STH_OPCODE = (44u << OPCODE_SHIFT),
400
STHX_OPCODE = (31u << OPCODE_SHIFT | 407u << 1),
401
STHU_OPCODE = (45u << OPCODE_SHIFT),
402
STHBRX_OPCODE = (31u << OPCODE_SHIFT | 918u << 1),
403
404
STB_OPCODE = (38u << OPCODE_SHIFT),
405
STBX_OPCODE = (31u << OPCODE_SHIFT | 215u << 1),
406
STBU_OPCODE = (39u << OPCODE_SHIFT),
407
408
EXTSB_OPCODE = (31u << OPCODE_SHIFT | 954u << 1),
409
EXTSH_OPCODE = (31u << OPCODE_SHIFT | 922u << 1),
410
EXTSW_OPCODE = (31u << OPCODE_SHIFT | 986u << 1), // X-FORM
411
412
// 32 bit opcode encodings
413
414
LWA_OPCODE = (58u << OPCODE_SHIFT | 2u << XO_30_31_SHIFT), // DS-FORM
415
LWAX_OPCODE = (31u << OPCODE_SHIFT | 341u << XO_21_30_SHIFT), // X-FORM
416
417
CNTLZW_OPCODE = (31u << OPCODE_SHIFT | 26u << XO_21_30_SHIFT), // X-FORM
418
CNTTZW_OPCODE = (31u << OPCODE_SHIFT | 538u << XO_21_30_SHIFT), // X-FORM
419
420
// 64 bit opcode encodings
421
422
LD_OPCODE = (58u << OPCODE_SHIFT | 0u << XO_30_31_SHIFT), // DS-FORM
423
LDU_OPCODE = (58u << OPCODE_SHIFT | 1u << XO_30_31_SHIFT), // DS-FORM
424
LDX_OPCODE = (31u << OPCODE_SHIFT | 21u << XO_21_30_SHIFT), // X-FORM
425
LDBRX_OPCODE = (31u << OPCODE_SHIFT | 532u << 1), // X-FORM
426
427
STD_OPCODE = (62u << OPCODE_SHIFT | 0u << XO_30_31_SHIFT), // DS-FORM
428
STDU_OPCODE = (62u << OPCODE_SHIFT | 1u << XO_30_31_SHIFT), // DS-FORM
429
STDUX_OPCODE = (31u << OPCODE_SHIFT | 181u << 1), // X-FORM
430
STDX_OPCODE = (31u << OPCODE_SHIFT | 149u << XO_21_30_SHIFT), // X-FORM
431
STDBRX_OPCODE = (31u << OPCODE_SHIFT | 660u << 1), // X-FORM
432
433
RLDICR_OPCODE = (30u << OPCODE_SHIFT | 1u << XO_27_29_SHIFT), // MD-FORM
434
RLDICL_OPCODE = (30u << OPCODE_SHIFT | 0u << XO_27_29_SHIFT), // MD-FORM
435
RLDIC_OPCODE = (30u << OPCODE_SHIFT | 2u << XO_27_29_SHIFT), // MD-FORM
436
RLDIMI_OPCODE = (30u << OPCODE_SHIFT | 3u << XO_27_29_SHIFT), // MD-FORM
437
438
SRADI_OPCODE = (31u << OPCODE_SHIFT | 413u << XO_21_29_SHIFT), // XS-FORM
439
440
SLD_OPCODE = (31u << OPCODE_SHIFT | 27u << 1), // X-FORM
441
SRD_OPCODE = (31u << OPCODE_SHIFT | 539u << 1), // X-FORM
442
SRAD_OPCODE = (31u << OPCODE_SHIFT | 794u << 1), // X-FORM
443
444
MULLD_OPCODE = (31u << OPCODE_SHIFT | 233u << 1), // XO-FORM
445
MULHD_OPCODE = (31u << OPCODE_SHIFT | 73u << 1), // XO-FORM
446
MULHDU_OPCODE = (31u << OPCODE_SHIFT | 9u << 1), // XO-FORM
447
DIVD_OPCODE = (31u << OPCODE_SHIFT | 489u << 1), // XO-FORM
448
449
CNTLZD_OPCODE = (31u << OPCODE_SHIFT | 58u << XO_21_30_SHIFT), // X-FORM
450
CNTTZD_OPCODE = (31u << OPCODE_SHIFT | 570u << XO_21_30_SHIFT), // X-FORM
451
NAND_OPCODE = (31u << OPCODE_SHIFT | 476u << XO_21_30_SHIFT), // X-FORM
452
NOR_OPCODE = (31u << OPCODE_SHIFT | 124u << XO_21_30_SHIFT), // X-FORM
453
454
// Byte reverse opcodes (introduced with Power10)
455
BRH_OPCODE = (31u << OPCODE_SHIFT | 219u << 1), // X-FORM
456
BRW_OPCODE = (31u << OPCODE_SHIFT | 155u << 1), // X-FORM
457
BRD_OPCODE = (31u << OPCODE_SHIFT | 187u << 1), // X-FORM
458
459
// opcodes only used for floating arithmetic
460
FADD_OPCODE = (63u << OPCODE_SHIFT | 21u << 1),
461
FADDS_OPCODE = (59u << OPCODE_SHIFT | 21u << 1),
462
FCMPU_OPCODE = (63u << OPCODE_SHIFT | 00u << 1),
463
FDIV_OPCODE = (63u << OPCODE_SHIFT | 18u << 1),
464
FDIVS_OPCODE = (59u << OPCODE_SHIFT | 18u << 1),
465
FMR_OPCODE = (63u << OPCODE_SHIFT | 72u << 1),
466
FRIN_OPCODE = (63u << OPCODE_SHIFT | 392u << 1),
467
FRIP_OPCODE = (63u << OPCODE_SHIFT | 456u << 1),
468
FRIM_OPCODE = (63u << OPCODE_SHIFT | 488u << 1),
469
// These are special Power6 opcodes, reused for "lfdepx" and "stfdepx"
470
// on Power7. Do not use.
471
// MFFGPR_OPCODE = (31u << OPCODE_SHIFT | 607u << 1),
472
// MFTGPR_OPCODE = (31u << OPCODE_SHIFT | 735u << 1),
473
CMPB_OPCODE = (31u << OPCODE_SHIFT | 508 << 1),
474
POPCNTB_OPCODE = (31u << OPCODE_SHIFT | 122 << 1),
475
POPCNTW_OPCODE = (31u << OPCODE_SHIFT | 378 << 1),
476
POPCNTD_OPCODE = (31u << OPCODE_SHIFT | 506 << 1),
477
FABS_OPCODE = (63u << OPCODE_SHIFT | 264u << 1),
478
FNABS_OPCODE = (63u << OPCODE_SHIFT | 136u << 1),
479
FMUL_OPCODE = (63u << OPCODE_SHIFT | 25u << 1),
480
FMULS_OPCODE = (59u << OPCODE_SHIFT | 25u << 1),
481
FNEG_OPCODE = (63u << OPCODE_SHIFT | 40u << 1),
482
FSUB_OPCODE = (63u << OPCODE_SHIFT | 20u << 1),
483
FSUBS_OPCODE = (59u << OPCODE_SHIFT | 20u << 1),
484
485
// PPC64-internal FPU conversion opcodes
486
FCFID_OPCODE = (63u << OPCODE_SHIFT | 846u << 1),
487
FCFIDS_OPCODE = (59u << OPCODE_SHIFT | 846u << 1),
488
FCTID_OPCODE = (63u << OPCODE_SHIFT | 814u << 1),
489
FCTIDZ_OPCODE = (63u << OPCODE_SHIFT | 815u << 1),
490
FCTIW_OPCODE = (63u << OPCODE_SHIFT | 14u << 1),
491
FCTIWZ_OPCODE = (63u << OPCODE_SHIFT | 15u << 1),
492
FRSP_OPCODE = (63u << OPCODE_SHIFT | 12u << 1),
493
494
// Fused multiply-accumulate instructions.
495
FMADD_OPCODE = (63u << OPCODE_SHIFT | 29u << 1),
496
FMADDS_OPCODE = (59u << OPCODE_SHIFT | 29u << 1),
497
FMSUB_OPCODE = (63u << OPCODE_SHIFT | 28u << 1),
498
FMSUBS_OPCODE = (59u << OPCODE_SHIFT | 28u << 1),
499
FNMADD_OPCODE = (63u << OPCODE_SHIFT | 31u << 1),
500
FNMADDS_OPCODE = (59u << OPCODE_SHIFT | 31u << 1),
501
FNMSUB_OPCODE = (63u << OPCODE_SHIFT | 30u << 1),
502
FNMSUBS_OPCODE = (59u << OPCODE_SHIFT | 30u << 1),
503
504
LFD_OPCODE = (50u << OPCODE_SHIFT | 00u << 1),
505
LFDU_OPCODE = (51u << OPCODE_SHIFT | 00u << 1),
506
LFDX_OPCODE = (31u << OPCODE_SHIFT | 599u << 1),
507
LFS_OPCODE = (48u << OPCODE_SHIFT | 00u << 1),
508
LFSU_OPCODE = (49u << OPCODE_SHIFT | 00u << 1),
509
LFSX_OPCODE = (31u << OPCODE_SHIFT | 535u << 1),
510
511
STFD_OPCODE = (54u << OPCODE_SHIFT | 00u << 1),
512
STFDU_OPCODE = (55u << OPCODE_SHIFT | 00u << 1),
513
STFDX_OPCODE = (31u << OPCODE_SHIFT | 727u << 1),
514
STFS_OPCODE = (52u << OPCODE_SHIFT | 00u << 1),
515
STFSU_OPCODE = (53u << OPCODE_SHIFT | 00u << 1),
516
STFSX_OPCODE = (31u << OPCODE_SHIFT | 663u << 1),
517
518
FSQRT_OPCODE = (63u << OPCODE_SHIFT | 22u << 1), // A-FORM
519
FSQRTS_OPCODE = (59u << OPCODE_SHIFT | 22u << 1), // A-FORM
520
521
// Vector instruction support for >= Power6
522
// Vector Storage Access
523
LVEBX_OPCODE = (31u << OPCODE_SHIFT | 7u << 1),
524
LVEHX_OPCODE = (31u << OPCODE_SHIFT | 39u << 1),
525
LVEWX_OPCODE = (31u << OPCODE_SHIFT | 71u << 1),
526
LVX_OPCODE = (31u << OPCODE_SHIFT | 103u << 1),
527
LVXL_OPCODE = (31u << OPCODE_SHIFT | 359u << 1),
528
STVEBX_OPCODE = (31u << OPCODE_SHIFT | 135u << 1),
529
STVEHX_OPCODE = (31u << OPCODE_SHIFT | 167u << 1),
530
STVEWX_OPCODE = (31u << OPCODE_SHIFT | 199u << 1),
531
STVX_OPCODE = (31u << OPCODE_SHIFT | 231u << 1),
532
STVXL_OPCODE = (31u << OPCODE_SHIFT | 487u << 1),
533
LVSL_OPCODE = (31u << OPCODE_SHIFT | 6u << 1),
534
LVSR_OPCODE = (31u << OPCODE_SHIFT | 38u << 1),
535
536
// Vector-Scalar (VSX) instruction support.
537
LXV_OPCODE = (61u << OPCODE_SHIFT | 1u ),
538
LXVL_OPCODE = (31u << OPCODE_SHIFT | 269u << 1),
539
STXV_OPCODE = (61u << OPCODE_SHIFT | 5u ),
540
STXVL_OPCODE = (31u << OPCODE_SHIFT | 397u << 1),
541
LXVD2X_OPCODE = (31u << OPCODE_SHIFT | 844u << 1),
542
STXVD2X_OPCODE = (31u << OPCODE_SHIFT | 972u << 1),
543
MTVSRD_OPCODE = (31u << OPCODE_SHIFT | 179u << 1),
544
MTVSRDD_OPCODE = (31u << OPCODE_SHIFT | 435u << 1),
545
MTVSRWZ_OPCODE = (31u << OPCODE_SHIFT | 243u << 1),
546
MFVSRD_OPCODE = (31u << OPCODE_SHIFT | 51u << 1),
547
MTVSRWA_OPCODE = (31u << OPCODE_SHIFT | 211u << 1),
548
MFVSRWZ_OPCODE = (31u << OPCODE_SHIFT | 115u << 1),
549
XXPERMDI_OPCODE= (60u << OPCODE_SHIFT | 10u << 3),
550
XXMRGHW_OPCODE = (60u << OPCODE_SHIFT | 18u << 3),
551
XXMRGLW_OPCODE = (60u << OPCODE_SHIFT | 50u << 3),
552
XXSPLTW_OPCODE = (60u << OPCODE_SHIFT | 164u << 2),
553
XXLAND_OPCODE = (60u << OPCODE_SHIFT | 130u << 3),
554
XXLOR_OPCODE = (60u << OPCODE_SHIFT | 146u << 3),
555
XXLXOR_OPCODE = (60u << OPCODE_SHIFT | 154u << 3),
556
XXLEQV_OPCODE = (60u << OPCODE_SHIFT | 186u << 3),
557
XVDIVSP_OPCODE = (60u << OPCODE_SHIFT | 88u << 3),
558
XXBRD_OPCODE = (60u << OPCODE_SHIFT | 475u << 2 | 23u << 16), // XX2-FORM
559
XXBRW_OPCODE = (60u << OPCODE_SHIFT | 475u << 2 | 15u << 16), // XX2-FORM
560
XXPERM_OPCODE = (60u << OPCODE_SHIFT | 26u << 3),
561
XXSEL_OPCODE = (60u << OPCODE_SHIFT | 3u << 4),
562
XXSPLTIB_OPCODE= (60u << OPCODE_SHIFT | 360u << 1),
563
XVDIVDP_OPCODE = (60u << OPCODE_SHIFT | 120u << 3),
564
XVABSSP_OPCODE = (60u << OPCODE_SHIFT | 409u << 2),
565
XVABSDP_OPCODE = (60u << OPCODE_SHIFT | 473u << 2),
566
XVNEGSP_OPCODE = (60u << OPCODE_SHIFT | 441u << 2),
567
XVNEGDP_OPCODE = (60u << OPCODE_SHIFT | 505u << 2),
568
XVSQRTSP_OPCODE= (60u << OPCODE_SHIFT | 139u << 2),
569
XVSQRTDP_OPCODE= (60u << OPCODE_SHIFT | 203u << 2),
570
XSCVDPSPN_OPCODE=(60u << OPCODE_SHIFT | 267u << 2),
571
XVADDDP_OPCODE = (60u << OPCODE_SHIFT | 96u << 3),
572
XVSUBDP_OPCODE = (60u << OPCODE_SHIFT | 104u << 3),
573
XVMULSP_OPCODE = (60u << OPCODE_SHIFT | 80u << 3),
574
XVMULDP_OPCODE = (60u << OPCODE_SHIFT | 112u << 3),
575
XVMADDASP_OPCODE=(60u << OPCODE_SHIFT | 65u << 3),
576
XVMADDADP_OPCODE=(60u << OPCODE_SHIFT | 97u << 3),
577
XVMSUBASP_OPCODE=(60u << OPCODE_SHIFT | 81u << 3),
578
XVMSUBADP_OPCODE=(60u << OPCODE_SHIFT | 113u << 3),
579
XVNMSUBASP_OPCODE=(60u<< OPCODE_SHIFT | 209u << 3),
580
XVNMSUBADP_OPCODE=(60u<< OPCODE_SHIFT | 241u << 3),
581
XVRDPI_OPCODE = (60u << OPCODE_SHIFT | 201u << 2),
582
XVRDPIC_OPCODE = (60u << OPCODE_SHIFT | 235u << 2),
583
XVRDPIM_OPCODE = (60u << OPCODE_SHIFT | 249u << 2),
584
XVRDPIP_OPCODE = (60u << OPCODE_SHIFT | 233u << 2),
585
586
// Deliver A Random Number (introduced with POWER9)
587
DARN_OPCODE = (31u << OPCODE_SHIFT | 755u << 1),
588
589
// Vector Permute and Formatting
590
VPKPX_OPCODE = (4u << OPCODE_SHIFT | 782u ),
591
VPKSHSS_OPCODE = (4u << OPCODE_SHIFT | 398u ),
592
VPKSWSS_OPCODE = (4u << OPCODE_SHIFT | 462u ),
593
VPKSHUS_OPCODE = (4u << OPCODE_SHIFT | 270u ),
594
VPKSWUS_OPCODE = (4u << OPCODE_SHIFT | 334u ),
595
VPKUHUM_OPCODE = (4u << OPCODE_SHIFT | 14u ),
596
VPKUWUM_OPCODE = (4u << OPCODE_SHIFT | 78u ),
597
VPKUHUS_OPCODE = (4u << OPCODE_SHIFT | 142u ),
598
VPKUWUS_OPCODE = (4u << OPCODE_SHIFT | 206u ),
599
VUPKHPX_OPCODE = (4u << OPCODE_SHIFT | 846u ),
600
VUPKHSB_OPCODE = (4u << OPCODE_SHIFT | 526u ),
601
VUPKHSH_OPCODE = (4u << OPCODE_SHIFT | 590u ),
602
VUPKLPX_OPCODE = (4u << OPCODE_SHIFT | 974u ),
603
VUPKLSB_OPCODE = (4u << OPCODE_SHIFT | 654u ),
604
VUPKLSH_OPCODE = (4u << OPCODE_SHIFT | 718u ),
605
606
VMRGHB_OPCODE = (4u << OPCODE_SHIFT | 12u ),
607
VMRGHW_OPCODE = (4u << OPCODE_SHIFT | 140u ),
608
VMRGHH_OPCODE = (4u << OPCODE_SHIFT | 76u ),
609
VMRGLB_OPCODE = (4u << OPCODE_SHIFT | 268u ),
610
VMRGLW_OPCODE = (4u << OPCODE_SHIFT | 396u ),
611
VMRGLH_OPCODE = (4u << OPCODE_SHIFT | 332u ),
612
613
VSPLT_OPCODE = (4u << OPCODE_SHIFT | 524u ),
614
VSPLTH_OPCODE = (4u << OPCODE_SHIFT | 588u ),
615
VSPLTW_OPCODE = (4u << OPCODE_SHIFT | 652u ),
616
VSPLTISB_OPCODE= (4u << OPCODE_SHIFT | 780u ),
617
VSPLTISH_OPCODE= (4u << OPCODE_SHIFT | 844u ),
618
VSPLTISW_OPCODE= (4u << OPCODE_SHIFT | 908u ),
619
620
VPEXTD_OPCODE = (4u << OPCODE_SHIFT | 1421u ),
621
VPERM_OPCODE = (4u << OPCODE_SHIFT | 43u ),
622
VSEL_OPCODE = (4u << OPCODE_SHIFT | 42u ),
623
624
VSL_OPCODE = (4u << OPCODE_SHIFT | 452u ),
625
VSLDOI_OPCODE = (4u << OPCODE_SHIFT | 44u ),
626
VSLO_OPCODE = (4u << OPCODE_SHIFT | 1036u ),
627
VSR_OPCODE = (4u << OPCODE_SHIFT | 708u ),
628
VSRO_OPCODE = (4u << OPCODE_SHIFT | 1100u ),
629
630
// Vector Integer
631
VADDCUW_OPCODE = (4u << OPCODE_SHIFT | 384u ),
632
VADDSHS_OPCODE = (4u << OPCODE_SHIFT | 832u ),
633
VADDSBS_OPCODE = (4u << OPCODE_SHIFT | 768u ),
634
VADDSWS_OPCODE = (4u << OPCODE_SHIFT | 896u ),
635
VADDUBM_OPCODE = (4u << OPCODE_SHIFT | 0u ),
636
VADDUWM_OPCODE = (4u << OPCODE_SHIFT | 128u ),
637
VADDUHM_OPCODE = (4u << OPCODE_SHIFT | 64u ),
638
VADDUDM_OPCODE = (4u << OPCODE_SHIFT | 192u ),
639
VADDUBS_OPCODE = (4u << OPCODE_SHIFT | 512u ),
640
VADDUWS_OPCODE = (4u << OPCODE_SHIFT | 640u ),
641
VADDUHS_OPCODE = (4u << OPCODE_SHIFT | 576u ),
642
VADDFP_OPCODE = (4u << OPCODE_SHIFT | 10u ),
643
VSUBCUW_OPCODE = (4u << OPCODE_SHIFT | 1408u ),
644
VSUBSHS_OPCODE = (4u << OPCODE_SHIFT | 1856u ),
645
VSUBSBS_OPCODE = (4u << OPCODE_SHIFT | 1792u ),
646
VSUBSWS_OPCODE = (4u << OPCODE_SHIFT | 1920u ),
647
VSUBUBM_OPCODE = (4u << OPCODE_SHIFT | 1024u ),
648
VSUBUWM_OPCODE = (4u << OPCODE_SHIFT | 1152u ),
649
VSUBUHM_OPCODE = (4u << OPCODE_SHIFT | 1088u ),
650
VSUBUDM_OPCODE = (4u << OPCODE_SHIFT | 1216u ),
651
VSUBUBS_OPCODE = (4u << OPCODE_SHIFT | 1536u ),
652
VSUBUWS_OPCODE = (4u << OPCODE_SHIFT | 1664u ),
653
VSUBUHS_OPCODE = (4u << OPCODE_SHIFT | 1600u ),
654
VSUBFP_OPCODE = (4u << OPCODE_SHIFT | 74u ),
655
656
VMULESB_OPCODE = (4u << OPCODE_SHIFT | 776u ),
657
VMULEUB_OPCODE = (4u << OPCODE_SHIFT | 520u ),
658
VMULESH_OPCODE = (4u << OPCODE_SHIFT | 840u ),
659
VMULEUH_OPCODE = (4u << OPCODE_SHIFT | 584u ),
660
VMULOSB_OPCODE = (4u << OPCODE_SHIFT | 264u ),
661
VMULOUB_OPCODE = (4u << OPCODE_SHIFT | 8u ),
662
VMULOSH_OPCODE = (4u << OPCODE_SHIFT | 328u ),
663
VMULOSW_OPCODE = (4u << OPCODE_SHIFT | 392u ),
664
VMULOUH_OPCODE = (4u << OPCODE_SHIFT | 72u ),
665
VMULUWM_OPCODE = (4u << OPCODE_SHIFT | 137u ),
666
VMHADDSHS_OPCODE=(4u << OPCODE_SHIFT | 32u ),
667
VMHRADDSHS_OPCODE=(4u << OPCODE_SHIFT | 33u ),
668
VMLADDUHM_OPCODE=(4u << OPCODE_SHIFT | 34u ),
669
VMSUBUHM_OPCODE= (4u << OPCODE_SHIFT | 36u ),
670
VMSUMMBM_OPCODE= (4u << OPCODE_SHIFT | 37u ),
671
VMSUMSHM_OPCODE= (4u << OPCODE_SHIFT | 40u ),
672
VMSUMSHS_OPCODE= (4u << OPCODE_SHIFT | 41u ),
673
VMSUMUHM_OPCODE= (4u << OPCODE_SHIFT | 38u ),
674
VMSUMUHS_OPCODE= (4u << OPCODE_SHIFT | 39u ),
675
VMADDFP_OPCODE = (4u << OPCODE_SHIFT | 46u ),
676
677
VSUMSWS_OPCODE = (4u << OPCODE_SHIFT | 1928u ),
678
VSUM2SWS_OPCODE= (4u << OPCODE_SHIFT | 1672u ),
679
VSUM4SBS_OPCODE= (4u << OPCODE_SHIFT | 1800u ),
680
VSUM4UBS_OPCODE= (4u << OPCODE_SHIFT | 1544u ),
681
VSUM4SHS_OPCODE= (4u << OPCODE_SHIFT | 1608u ),
682
683
VAVGSB_OPCODE = (4u << OPCODE_SHIFT | 1282u ),
684
VAVGSW_OPCODE = (4u << OPCODE_SHIFT | 1410u ),
685
VAVGSH_OPCODE = (4u << OPCODE_SHIFT | 1346u ),
686
VAVGUB_OPCODE = (4u << OPCODE_SHIFT | 1026u ),
687
VAVGUW_OPCODE = (4u << OPCODE_SHIFT | 1154u ),
688
VAVGUH_OPCODE = (4u << OPCODE_SHIFT | 1090u ),
689
690
VMAXSB_OPCODE = (4u << OPCODE_SHIFT | 258u ),
691
VMAXSW_OPCODE = (4u << OPCODE_SHIFT | 386u ),
692
VMAXSH_OPCODE = (4u << OPCODE_SHIFT | 322u ),
693
VMAXUB_OPCODE = (4u << OPCODE_SHIFT | 2u ),
694
VMAXUW_OPCODE = (4u << OPCODE_SHIFT | 130u ),
695
VMAXUH_OPCODE = (4u << OPCODE_SHIFT | 66u ),
696
VMINSB_OPCODE = (4u << OPCODE_SHIFT | 770u ),
697
VMINSW_OPCODE = (4u << OPCODE_SHIFT | 898u ),
698
VMINSH_OPCODE = (4u << OPCODE_SHIFT | 834u ),
699
VMINUB_OPCODE = (4u << OPCODE_SHIFT | 514u ),
700
VMINUW_OPCODE = (4u << OPCODE_SHIFT | 642u ),
701
VMINUH_OPCODE = (4u << OPCODE_SHIFT | 578u ),
702
703
VCMPEQUB_OPCODE= (4u << OPCODE_SHIFT | 6u ),
704
VCMPEQUH_OPCODE= (4u << OPCODE_SHIFT | 70u ),
705
VCMPEQUW_OPCODE= (4u << OPCODE_SHIFT | 134u ),
706
VCMPGTSH_OPCODE= (4u << OPCODE_SHIFT | 838u ),
707
VCMPGTSB_OPCODE= (4u << OPCODE_SHIFT | 774u ),
708
VCMPGTSW_OPCODE= (4u << OPCODE_SHIFT | 902u ),
709
VCMPGTUB_OPCODE= (4u << OPCODE_SHIFT | 518u ),
710
VCMPGTUH_OPCODE= (4u << OPCODE_SHIFT | 582u ),
711
VCMPGTUW_OPCODE= (4u << OPCODE_SHIFT | 646u ),
712
713
VAND_OPCODE = (4u << OPCODE_SHIFT | 1028u ),
714
VANDC_OPCODE = (4u << OPCODE_SHIFT | 1092u ),
715
VNOR_OPCODE = (4u << OPCODE_SHIFT | 1284u ),
716
VOR_OPCODE = (4u << OPCODE_SHIFT | 1156u ),
717
VXOR_OPCODE = (4u << OPCODE_SHIFT | 1220u ),
718
VRLD_OPCODE = (4u << OPCODE_SHIFT | 196u ),
719
VRLB_OPCODE = (4u << OPCODE_SHIFT | 4u ),
720
VRLW_OPCODE = (4u << OPCODE_SHIFT | 132u ),
721
VRLH_OPCODE = (4u << OPCODE_SHIFT | 68u ),
722
VSLB_OPCODE = (4u << OPCODE_SHIFT | 260u ),
723
VSKW_OPCODE = (4u << OPCODE_SHIFT | 388u ),
724
VSLH_OPCODE = (4u << OPCODE_SHIFT | 324u ),
725
VSRB_OPCODE = (4u << OPCODE_SHIFT | 516u ),
726
VSRW_OPCODE = (4u << OPCODE_SHIFT | 644u ),
727
VSRH_OPCODE = (4u << OPCODE_SHIFT | 580u ),
728
VSRAB_OPCODE = (4u << OPCODE_SHIFT | 772u ),
729
VSRAW_OPCODE = (4u << OPCODE_SHIFT | 900u ),
730
VSRAH_OPCODE = (4u << OPCODE_SHIFT | 836u ),
731
VPOPCNTW_OPCODE= (4u << OPCODE_SHIFT | 1923u ),
732
733
// Vector Floating-Point
734
// not implemented yet
735
736
// Vector Status and Control
737
MTVSCR_OPCODE = (4u << OPCODE_SHIFT | 1604u ),
738
MFVSCR_OPCODE = (4u << OPCODE_SHIFT | 1540u ),
739
740
// AES (introduced with Power 8)
741
VCIPHER_OPCODE = (4u << OPCODE_SHIFT | 1288u),
742
VCIPHERLAST_OPCODE = (4u << OPCODE_SHIFT | 1289u),
743
VNCIPHER_OPCODE = (4u << OPCODE_SHIFT | 1352u),
744
VNCIPHERLAST_OPCODE = (4u << OPCODE_SHIFT | 1353u),
745
VSBOX_OPCODE = (4u << OPCODE_SHIFT | 1480u),
746
747
// SHA (introduced with Power 8)
748
VSHASIGMAD_OPCODE = (4u << OPCODE_SHIFT | 1730u),
749
VSHASIGMAW_OPCODE = (4u << OPCODE_SHIFT | 1666u),
750
751
// Vector Binary Polynomial Multiplication (introduced with Power 8)
752
VPMSUMB_OPCODE = (4u << OPCODE_SHIFT | 1032u),
753
VPMSUMD_OPCODE = (4u << OPCODE_SHIFT | 1224u),
754
VPMSUMH_OPCODE = (4u << OPCODE_SHIFT | 1096u),
755
VPMSUMW_OPCODE = (4u << OPCODE_SHIFT | 1160u),
756
757
// Vector Permute and Xor (introduced with Power 8)
758
VPERMXOR_OPCODE = (4u << OPCODE_SHIFT | 45u),
759
760
// Transactional Memory instructions (introduced with Power 8)
761
TBEGIN_OPCODE = (31u << OPCODE_SHIFT | 654u << 1),
762
TEND_OPCODE = (31u << OPCODE_SHIFT | 686u << 1),
763
TABORT_OPCODE = (31u << OPCODE_SHIFT | 910u << 1),
764
TABORTWC_OPCODE = (31u << OPCODE_SHIFT | 782u << 1),
765
TABORTWCI_OPCODE = (31u << OPCODE_SHIFT | 846u << 1),
766
TABORTDC_OPCODE = (31u << OPCODE_SHIFT | 814u << 1),
767
TABORTDCI_OPCODE = (31u << OPCODE_SHIFT | 878u << 1),
768
TSR_OPCODE = (31u << OPCODE_SHIFT | 750u << 1),
769
TCHECK_OPCODE = (31u << OPCODE_SHIFT | 718u << 1),
770
771
// Icache and dcache related instructions
772
DCBA_OPCODE = (31u << OPCODE_SHIFT | 758u << 1),
773
DCBZ_OPCODE = (31u << OPCODE_SHIFT | 1014u << 1),
774
DCBST_OPCODE = (31u << OPCODE_SHIFT | 54u << 1),
775
DCBF_OPCODE = (31u << OPCODE_SHIFT | 86u << 1),
776
777
DCBT_OPCODE = (31u << OPCODE_SHIFT | 278u << 1),
778
DCBTST_OPCODE = (31u << OPCODE_SHIFT | 246u << 1),
779
ICBI_OPCODE = (31u << OPCODE_SHIFT | 982u << 1),
780
781
// Instruction synchronization
782
ISYNC_OPCODE = (19u << OPCODE_SHIFT | 150u << 1),
783
// Memory barriers
784
SYNC_OPCODE = (31u << OPCODE_SHIFT | 598u << 1),
785
EIEIO_OPCODE = (31u << OPCODE_SHIFT | 854u << 1),
786
787
// Wait instructions for polling.
788
WAIT_OPCODE = (31u << OPCODE_SHIFT | 62u << 1),
789
790
// Trap instructions
791
TDI_OPCODE = (2u << OPCODE_SHIFT),
792
TWI_OPCODE = (3u << OPCODE_SHIFT),
793
TD_OPCODE = (31u << OPCODE_SHIFT | 68u << 1),
794
TW_OPCODE = (31u << OPCODE_SHIFT | 4u << 1),
795
796
// Atomics.
797
LBARX_OPCODE = (31u << OPCODE_SHIFT | 52u << 1),
798
LHARX_OPCODE = (31u << OPCODE_SHIFT | 116u << 1),
799
LWARX_OPCODE = (31u << OPCODE_SHIFT | 20u << 1),
800
LDARX_OPCODE = (31u << OPCODE_SHIFT | 84u << 1),
801
LQARX_OPCODE = (31u << OPCODE_SHIFT | 276u << 1),
802
STBCX_OPCODE = (31u << OPCODE_SHIFT | 694u << 1),
803
STHCX_OPCODE = (31u << OPCODE_SHIFT | 726u << 1),
804
STWCX_OPCODE = (31u << OPCODE_SHIFT | 150u << 1),
805
STDCX_OPCODE = (31u << OPCODE_SHIFT | 214u << 1),
806
STQCX_OPCODE = (31u << OPCODE_SHIFT | 182u << 1)
807
808
};
809
810
enum opcdeos_mask {
811
// Mask for prefix primary opcode field
812
PREFIX_OPCODE_MASK = (63u << OPCODE_SHIFT),
813
// Mask for prefix opcode and type fields
814
PREFIX_OPCODE_TYPE_MASK = (63u << OPCODE_SHIFT) | (3u << PRE_TYPE_SHIFT),
815
// Masks for type 00/10 and type 01/11, including opcode, type, and st fieds
816
PREFIX_OPCODE_TYPEx0_MASK = PREFIX_OPCODE_TYPE_MASK | ( 1u << PRE_ST1_SHIFT),
817
PREFIX_OPCODE_TYPEx1_MASK = PREFIX_OPCODE_TYPE_MASK | (15u << PRE_ST4_SHIFT),
818
819
// Masks for each instructions
820
PADDI_PREFIX_OPCODE_MASK = PREFIX_OPCODE_TYPEx0_MASK,
821
PADDI_SUFFIX_OPCODE_MASK = ADDI_OPCODE_MASK,
822
};
823
824
enum opcdeos {
825
PREFIX_PRIMARY_OPCODE = (1u << OPCODE_SHIFT),
826
827
// Prefixed addi/li
828
PADDI_PREFIX_OPCODE = PREFIX_PRIMARY_OPCODE | (2u << PRE_TYPE_SHIFT),
829
PADDI_SUFFIX_OPCODE = ADDI_OPCODE,
830
};
831
832
// Trap instructions TO bits
833
enum trap_to_bits {
834
// single bits
835
traptoLessThanSigned = 1 << 4, // 0, left end
836
traptoGreaterThanSigned = 1 << 3,
837
traptoEqual = 1 << 2,
838
traptoLessThanUnsigned = 1 << 1,
839
traptoGreaterThanUnsigned = 1 << 0, // 4, right end
840
841
// compound ones
842
traptoUnconditional = (traptoLessThanSigned |
843
traptoGreaterThanSigned |
844
traptoEqual |
845
traptoLessThanUnsigned |
846
traptoGreaterThanUnsigned)
847
};
848
849
// Branch hints BH field
850
enum branch_hint_bh {
851
// bclr cases:
852
bhintbhBCLRisReturn = 0,
853
bhintbhBCLRisNotReturnButSame = 1,
854
bhintbhBCLRisNotPredictable = 3,
855
856
// bcctr cases:
857
bhintbhBCCTRisNotReturnButSame = 0,
858
bhintbhBCCTRisNotPredictable = 3
859
};
860
861
// Branch prediction hints AT field
862
enum branch_hint_at {
863
bhintatNoHint = 0, // at=00
864
bhintatIsNotTaken = 2, // at=10
865
bhintatIsTaken = 3 // at=11
866
};
867
868
// Branch prediction hints
869
enum branch_hint_concept {
870
// Use the same encoding as branch_hint_at to simply code.
871
bhintNoHint = bhintatNoHint,
872
bhintIsNotTaken = bhintatIsNotTaken,
873
bhintIsTaken = bhintatIsTaken
874
};
875
876
// Used in BO field of branch instruction.
877
enum branch_condition {
878
bcondCRbiIs0 = 4, // bo=001at
879
bcondCRbiIs1 = 12, // bo=011at
880
bcondAlways = 20 // bo=10100
881
};
882
883
// Branch condition with combined prediction hints.
884
enum branch_condition_with_hint {
885
bcondCRbiIs0_bhintNoHint = bcondCRbiIs0 | bhintatNoHint,
886
bcondCRbiIs0_bhintIsNotTaken = bcondCRbiIs0 | bhintatIsNotTaken,
887
bcondCRbiIs0_bhintIsTaken = bcondCRbiIs0 | bhintatIsTaken,
888
bcondCRbiIs1_bhintNoHint = bcondCRbiIs1 | bhintatNoHint,
889
bcondCRbiIs1_bhintIsNotTaken = bcondCRbiIs1 | bhintatIsNotTaken,
890
bcondCRbiIs1_bhintIsTaken = bcondCRbiIs1 | bhintatIsTaken,
891
};
892
893
// Elemental Memory Barriers (>=Power 8)
894
enum Elemental_Membar_mask_bits {
895
StoreStore = 1 << 0,
896
StoreLoad = 1 << 1,
897
LoadStore = 1 << 2,
898
LoadLoad = 1 << 3
899
};
900
901
// Branch prediction hints.
902
inline static int add_bhint_to_boint(const int bhint, const int boint) {
903
switch (boint) {
904
case bcondCRbiIs0:
905
case bcondCRbiIs1:
906
// branch_hint and branch_hint_at have same encodings
907
assert( (int)bhintNoHint == (int)bhintatNoHint
908
&& (int)bhintIsNotTaken == (int)bhintatIsNotTaken
909
&& (int)bhintIsTaken == (int)bhintatIsTaken,
910
"wrong encodings");
911
assert((bhint & 0x03) == bhint, "wrong encodings");
912
return (boint & ~0x03) | bhint;
913
case bcondAlways:
914
// no branch_hint
915
return boint;
916
default:
917
ShouldNotReachHere();
918
return 0;
919
}
920
}
921
922
// Extract bcond from boint.
923
inline static int inv_boint_bcond(const int boint) {
924
int r_bcond = boint & ~0x03;
925
assert(r_bcond == bcondCRbiIs0 ||
926
r_bcond == bcondCRbiIs1 ||
927
r_bcond == bcondAlways,
928
"bad branch condition");
929
return r_bcond;
930
}
931
932
// Extract bhint from boint.
933
inline static int inv_boint_bhint(const int boint) {
934
int r_bhint = boint & 0x03;
935
assert(r_bhint == bhintatNoHint ||
936
r_bhint == bhintatIsNotTaken ||
937
r_bhint == bhintatIsTaken,
938
"bad branch hint");
939
return r_bhint;
940
}
941
942
// Calculate opposite of given bcond.
943
inline static int opposite_bcond(const int bcond) {
944
switch (bcond) {
945
case bcondCRbiIs0:
946
return bcondCRbiIs1;
947
case bcondCRbiIs1:
948
return bcondCRbiIs0;
949
default:
950
ShouldNotReachHere();
951
return 0;
952
}
953
}
954
955
// Calculate opposite of given bhint.
956
inline static int opposite_bhint(const int bhint) {
957
switch (bhint) {
958
case bhintatNoHint:
959
return bhintatNoHint;
960
case bhintatIsNotTaken:
961
return bhintatIsTaken;
962
case bhintatIsTaken:
963
return bhintatIsNotTaken;
964
default:
965
ShouldNotReachHere();
966
return 0;
967
}
968
}
969
970
// PPC branch instructions
971
enum ppcops {
972
b_op = 18,
973
bc_op = 16,
974
bcr_op = 19
975
};
976
977
enum Condition {
978
negative = 0,
979
less = 0,
980
positive = 1,
981
greater = 1,
982
zero = 2,
983
equal = 2,
984
summary_overflow = 3,
985
};
986
987
public:
988
// Helper functions for groups of instructions
989
990
enum Predict { pt = 1, pn = 0 }; // pt = predict taken
991
992
//---< calculate length of instruction >---
993
// With PPC64 being a RISC architecture, this always is BytesPerInstWord
994
// instruction must start at passed address
995
static unsigned int instr_len(unsigned char *instr) { return BytesPerInstWord; }
996
997
//---< longest instructions >---
998
static unsigned int instr_maxlen() { return BytesPerInstWord; }
999
1000
// Test if x is within signed immediate range for nbits.
1001
static bool is_simm(int x, unsigned int nbits) {
1002
assert(0 < nbits && nbits < 32, "out of bounds");
1003
const int min = -(((int)1) << nbits-1);
1004
const int maxplus1 = (((int)1) << nbits-1);
1005
return min <= x && x < maxplus1;
1006
}
1007
1008
static bool is_simm(jlong x, unsigned int nbits) {
1009
assert(0 < nbits && nbits < 64, "out of bounds");
1010
const jlong min = -(((jlong)1) << nbits-1);
1011
const jlong maxplus1 = (((jlong)1) << nbits-1);
1012
return min <= x && x < maxplus1;
1013
}
1014
1015
// Test if x is within unsigned immediate range for nbits.
1016
static bool is_uimm(int x, unsigned int nbits) {
1017
assert(0 < nbits && nbits < 32, "out of bounds");
1018
const unsigned int maxplus1 = (((unsigned int)1) << nbits);
1019
return (unsigned int)x < maxplus1;
1020
}
1021
1022
static bool is_uimm(jlong x, unsigned int nbits) {
1023
assert(0 < nbits && nbits < 64, "out of bounds");
1024
const julong maxplus1 = (((julong)1) << nbits);
1025
return (julong)x < maxplus1;
1026
}
1027
1028
protected:
1029
// helpers
1030
1031
// X is supposed to fit in a field "nbits" wide
1032
// and be sign-extended. Check the range.
1033
static void assert_signed_range(intptr_t x, int nbits) {
1034
assert(nbits == 32 || (-(1 << nbits-1) <= x && x < (1 << nbits-1)),
1035
"value out of range");
1036
}
1037
1038
static void assert_signed_word_disp_range(intptr_t x, int nbits) {
1039
assert((x & 3) == 0, "not word aligned");
1040
assert_signed_range(x, nbits + 2);
1041
}
1042
1043
static void assert_unsigned_const(int x, int nbits) {
1044
assert(juint(x) < juint(1 << nbits), "unsigned constant out of range");
1045
}
1046
1047
static int fmask(juint hi_bit, juint lo_bit) {
1048
assert(hi_bit >= lo_bit && hi_bit < 32, "bad bits");
1049
return (1 << ( hi_bit-lo_bit + 1 )) - 1;
1050
}
1051
1052
// inverse of u_field
1053
static int inv_u_field(int x, int hi_bit, int lo_bit) {
1054
juint r = juint(x) >> lo_bit;
1055
r &= fmask(hi_bit, lo_bit);
1056
return int(r);
1057
}
1058
1059
// signed version: extract from field and sign-extend
1060
static int inv_s_field_ppc(int x, int hi_bit, int lo_bit) {
1061
x = x << (31-hi_bit);
1062
x = x >> (31-hi_bit+lo_bit);
1063
return x;
1064
}
1065
1066
static int u_field(int x, int hi_bit, int lo_bit) {
1067
assert((x & ~fmask(hi_bit, lo_bit)) == 0, "value out of range");
1068
int r = x << lo_bit;
1069
assert(inv_u_field(r, hi_bit, lo_bit) == x, "just checking");
1070
return r;
1071
}
1072
1073
// Same as u_field for signed values
1074
static int s_field(int x, int hi_bit, int lo_bit) {
1075
int nbits = hi_bit - lo_bit + 1;
1076
assert(nbits == 32 || (-(1 << nbits-1) <= x && x < (1 << nbits-1)),
1077
"value out of range");
1078
x &= fmask(hi_bit, lo_bit);
1079
int r = x << lo_bit;
1080
return r;
1081
}
1082
1083
// inv_op for ppc instructions
1084
static int inv_op_ppc(int x) { return inv_u_field(x, 31, 26); }
1085
1086
// Determine target address from li, bd field of branch instruction.
1087
static intptr_t inv_li_field(int x) {
1088
intptr_t r = inv_s_field_ppc(x, 25, 2);
1089
r = (r << 2);
1090
return r;
1091
}
1092
static intptr_t inv_bd_field(int x, intptr_t pos) {
1093
intptr_t r = inv_s_field_ppc(x, 15, 2);
1094
r = (r << 2) + pos;
1095
return r;
1096
}
1097
1098
#define inv_opp_u_field(x, hi_bit, lo_bit) inv_u_field(x, 31-(lo_bit), 31-(hi_bit))
1099
#define inv_opp_s_field(x, hi_bit, lo_bit) inv_s_field_ppc(x, 31-(lo_bit), 31-(hi_bit))
1100
// Extract instruction fields from instruction words.
1101
public:
1102
static int inv_ra_field(int x) { return inv_opp_u_field(x, 15, 11); }
1103
static int inv_rb_field(int x) { return inv_opp_u_field(x, 20, 16); }
1104
static int inv_rt_field(int x) { return inv_opp_u_field(x, 10, 6); }
1105
static int inv_rta_field(int x) { return inv_opp_u_field(x, 15, 11); }
1106
static int inv_rs_field(int x) { return inv_opp_u_field(x, 10, 6); }
1107
// Ds uses opp_s_field(x, 31, 16), but lowest 2 bits must be 0.
1108
// Inv_ds_field uses range (x, 29, 16) but shifts by 2 to ensure that lowest bits are 0.
1109
static int inv_ds_field(int x) { return inv_opp_s_field(x, 29, 16) << 2; }
1110
static int inv_d1_field(int x) { return inv_opp_s_field(x, 31, 16); }
1111
static int inv_si_field(int x) { return inv_opp_s_field(x, 31, 16); }
1112
static int inv_to_field(int x) { return inv_opp_u_field(x, 10, 6); }
1113
static int inv_lk_field(int x) { return inv_opp_u_field(x, 31, 31); }
1114
static int inv_bo_field(int x) { return inv_opp_u_field(x, 10, 6); }
1115
static int inv_bi_field(int x) { return inv_opp_u_field(x, 15, 11); }
1116
1117
// For extended opcodes (prefixed instructions) introduced with Power 10
1118
static long inv_r_eo( int x) { return inv_opp_u_field(x, 11, 11); }
1119
static long inv_type( int x) { return inv_opp_u_field(x, 7, 6); }
1120
static long inv_st_x0( int x) { return inv_opp_u_field(x, 8, 8); }
1121
static long inv_st_x1( int x) { return inv_opp_u_field(x, 11, 8); }
1122
1123
// - 8LS:D/MLS:D Formats
1124
static long inv_d0_eo( long x) { return inv_opp_u_field(x, 31, 14); }
1125
1126
// - 8RR:XX4/8RR:D Formats
1127
static long inv_imm0_eo(int x) { return inv_opp_u_field(x, 31, 16); }
1128
static long inv_uimm_eo(int x) { return inv_opp_u_field(x, 31, 29); }
1129
static long inv_imm_eo( int x) { return inv_opp_u_field(x, 31, 24); }
1130
1131
#define opp_u_field(x, hi_bit, lo_bit) u_field(x, 31-(lo_bit), 31-(hi_bit))
1132
#define opp_s_field(x, hi_bit, lo_bit) s_field(x, 31-(lo_bit), 31-(hi_bit))
1133
1134
// instruction fields
1135
static int aa( int x) { return opp_u_field(x, 30, 30); }
1136
static int ba( int x) { return opp_u_field(x, 15, 11); }
1137
static int bb( int x) { return opp_u_field(x, 20, 16); }
1138
static int bc( int x) { return opp_u_field(x, 25, 21); }
1139
static int bd( int x) { return opp_s_field(x, 29, 16); }
1140
static int bf( ConditionRegister cr) { return bf(cr->encoding()); }
1141
static int bf( int x) { return opp_u_field(x, 8, 6); }
1142
static int bfa(ConditionRegister cr) { return bfa(cr->encoding()); }
1143
static int bfa( int x) { return opp_u_field(x, 13, 11); }
1144
static int bh( int x) { return opp_u_field(x, 20, 19); }
1145
static int bi( int x) { return opp_u_field(x, 15, 11); }
1146
static int bi0(ConditionRegister cr, Condition c) { return (cr->encoding() << 2) | c; }
1147
static int bo( int x) { return opp_u_field(x, 10, 6); }
1148
static int bt( int x) { return opp_u_field(x, 10, 6); }
1149
static int d1( int x) { return opp_s_field(x, 31, 16); }
1150
static int ds( int x) { assert((x & 0x3) == 0, "unaligned offset"); return opp_s_field(x, 31, 16); }
1151
static int eh( int x) { return opp_u_field(x, 31, 31); }
1152
static int flm( int x) { return opp_u_field(x, 14, 7); }
1153
static int fra( FloatRegister r) { return fra(r->encoding());}
1154
static int frb( FloatRegister r) { return frb(r->encoding());}
1155
static int frc( FloatRegister r) { return frc(r->encoding());}
1156
static int frs( FloatRegister r) { return frs(r->encoding());}
1157
static int frt( FloatRegister r) { return frt(r->encoding());}
1158
static int fra( int x) { return opp_u_field(x, 15, 11); }
1159
static int frb( int x) { return opp_u_field(x, 20, 16); }
1160
static int frc( int x) { return opp_u_field(x, 25, 21); }
1161
static int frs( int x) { return opp_u_field(x, 10, 6); }
1162
static int frt( int x) { return opp_u_field(x, 10, 6); }
1163
static int fxm( int x) { return opp_u_field(x, 19, 12); }
1164
static int imm8( int x) { return opp_u_field(uimm(x, 8), 20, 13); }
1165
static int l10( int x) { assert(x == 0 || x == 1, "must be 0 or 1"); return opp_u_field(x, 10, 10); }
1166
static int l14( int x) { return opp_u_field(x, 15, 14); }
1167
static int l15( int x) { return opp_u_field(x, 15, 15); }
1168
static int l910( int x) { return opp_u_field(x, 10, 9); }
1169
static int e1215( int x) { return opp_u_field(x, 15, 12); }
1170
static int lev( int x) { return opp_u_field(x, 26, 20); }
1171
static int li( int x) { return opp_s_field(x, 29, 6); }
1172
static int lk( int x) { return opp_u_field(x, 31, 31); }
1173
static int mb2125( int x) { return opp_u_field(x, 25, 21); }
1174
static int me2630( int x) { return opp_u_field(x, 30, 26); }
1175
static int mb2126( int x) { return opp_u_field(((x & 0x1f) << 1) | ((x & 0x20) >> 5), 26, 21); }
1176
static int me2126( int x) { return mb2126(x); }
1177
static int nb( int x) { return opp_u_field(x, 20, 16); }
1178
//static int opcd( int x) { return opp_u_field(x, 5, 0); } // is contained in our opcodes
1179
static int oe( int x) { return opp_u_field(x, 21, 21); }
1180
static int ra( Register r) { return ra(r->encoding()); }
1181
static int ra( int x) { return opp_u_field(x, 15, 11); }
1182
static int rb( Register r) { return rb(r->encoding()); }
1183
static int rb( int x) { return opp_u_field(x, 20, 16); }
1184
static int rc( int x) { return opp_u_field(x, 31, 31); }
1185
static int rs( Register r) { return rs(r->encoding()); }
1186
static int rs( int x) { return opp_u_field(x, 10, 6); }
1187
// we don't want to use R0 in memory accesses, because it has value `0' then
1188
static int ra0mem( Register r) { assert(r != R0, "cannot use register R0 in memory access"); return ra(r); }
1189
static int ra0mem( int x) { assert(x != 0, "cannot use register 0 in memory access"); return ra(x); }
1190
1191
// register r is target
1192
static int rt( Register r) { return rs(r); }
1193
static int rt( int x) { return rs(x); }
1194
static int rta( Register r) { return ra(r); }
1195
static int rta0mem( Register r) { rta(r); return ra0mem(r); }
1196
1197
static int sh1620( int x) { return opp_u_field(x, 20, 16); }
1198
static int sh30( int x) { return opp_u_field(x, 30, 30); }
1199
static int sh162030( int x) { return sh1620(x & 0x1f) | sh30((x & 0x20) >> 5); }
1200
static int si( int x) { return opp_s_field(x, 31, 16); }
1201
static int spr( int x) { return opp_u_field(x, 20, 11); }
1202
static int sr( int x) { return opp_u_field(x, 15, 12); }
1203
static int tbr( int x) { return opp_u_field(x, 20, 11); }
1204
static int th( int x) { return opp_u_field(x, 10, 7); }
1205
static int thct( int x) { assert((x&8) == 0, "must be valid cache specification"); return th(x); }
1206
static int thds( int x) { assert((x&8) == 8, "must be valid stream specification"); return th(x); }
1207
static int to( int x) { return opp_u_field(x, 10, 6); }
1208
static int u( int x) { return opp_u_field(x, 19, 16); }
1209
static int ui( int x) { return opp_u_field(x, 31, 16); }
1210
1211
// Support vector instructions for >= Power6.
1212
static int vra( int x) { return opp_u_field(x, 15, 11); }
1213
static int vrb( int x) { return opp_u_field(x, 20, 16); }
1214
static int vrc( int x) { return opp_u_field(x, 25, 21); }
1215
static int vrs( int x) { return opp_u_field(x, 10, 6); }
1216
static int vrt( int x) { return opp_u_field(x, 10, 6); }
1217
1218
static int vra( VectorRegister r) { return vra(r->encoding());}
1219
static int vrb( VectorRegister r) { return vrb(r->encoding());}
1220
static int vrc( VectorRegister r) { return vrc(r->encoding());}
1221
static int vrs( VectorRegister r) { return vrs(r->encoding());}
1222
static int vrt( VectorRegister r) { return vrt(r->encoding());}
1223
1224
// Only used on SHA sigma instructions (VX-form)
1225
static int vst( int x) { return opp_u_field(x, 16, 16); }
1226
static int vsix( int x) { return opp_u_field(x, 20, 17); }
1227
1228
// Support Vector-Scalar (VSX) instructions.
1229
static int vsra( int x) { return opp_u_field(x & 0x1F, 15, 11) | opp_u_field((x & 0x20) >> 5, 29, 29); }
1230
static int vsrb( int x) { return opp_u_field(x & 0x1F, 20, 16) | opp_u_field((x & 0x20) >> 5, 30, 30); }
1231
static int vsrc( int x) { return opp_u_field(x & 0x1F, 25, 21) | opp_u_field((x & 0x20) >> 5, 28, 28); }
1232
static int vsrs( int x) { return opp_u_field(x & 0x1F, 10, 6) | opp_u_field((x & 0x20) >> 5, 31, 31); }
1233
static int vsrt( int x) { return vsrs(x); }
1234
static int vsdm( int x) { return opp_u_field(x, 23, 22); }
1235
static int vsrs_dq( int x) { return opp_u_field(x & 0x1F, 10, 6) | opp_u_field((x & 0x20) >> 5, 28, 28); }
1236
static int vsrt_dq( int x) { return vsrs_dq(x); }
1237
1238
static int vsra( VectorSRegister r) { return vsra(r->encoding());}
1239
static int vsrb( VectorSRegister r) { return vsrb(r->encoding());}
1240
static int vsrc( VectorSRegister r) { return vsrc(r->encoding());}
1241
static int vsrs( VectorSRegister r) { return vsrs(r->encoding());}
1242
static int vsrt( VectorSRegister r) { return vsrt(r->encoding());}
1243
static int vsrs_dq(VectorSRegister r) { return vsrs_dq(r->encoding());}
1244
static int vsrt_dq(VectorSRegister r) { return vsrt_dq(r->encoding());}
1245
1246
static int vsplt_uim( int x) { return opp_u_field(x, 15, 12); } // for vsplt* instructions
1247
static int vsplti_sim(int x) { return opp_u_field(x, 15, 11); } // for vsplti* instructions
1248
static int vsldoi_shb(int x) { return opp_u_field(x, 25, 22); } // for vsldoi instruction
1249
static int vcmp_rc( int x) { return opp_u_field(x, 21, 21); } // for vcmp* instructions
1250
static int xxsplt_uim(int x) { return opp_u_field(x, 15, 14); } // for xxsplt* instructions
1251
1252
// For extended opcodes (prefixed instructions) introduced with Power 10
1253
static long r_eo( int x) { return opp_u_field(x, 11, 11); }
1254
static long type( int x) { return opp_u_field(x, 7, 6); }
1255
static long st_x0( int x) { return opp_u_field(x, 8, 8); }
1256
static long st_x1( int x) { return opp_u_field(x, 11, 8); }
1257
1258
// - 8LS:D/MLS:D Formats
1259
static long d0_eo( long x) { return opp_u_field((x >> 16) & 0x3FFFF, 31, 14); }
1260
static long d1_eo( long x) { return opp_u_field(x & 0xFFFF, 31, 16); }
1261
static long s0_eo( long x) { return d0_eo(x); }
1262
static long s1_eo( long x) { return d1_eo(x); }
1263
1264
// - 8RR:XX4/8RR:D Formats
1265
static long imm0_eo( int x) { return opp_u_field(x >> 16, 31, 16); }
1266
static long imm1_eo( int x) { return opp_u_field(x & 0xFFFF, 31, 16); }
1267
static long uimm_eo( int x) { return opp_u_field(x, 31, 29); }
1268
static long imm_eo( int x) { return opp_u_field(x, 31, 24); }
1269
1270
//static int xo1( int x) { return opp_u_field(x, 29, 21); }// is contained in our opcodes
1271
//static int xo2( int x) { return opp_u_field(x, 30, 21); }// is contained in our opcodes
1272
//static int xo3( int x) { return opp_u_field(x, 30, 22); }// is contained in our opcodes
1273
//static int xo4( int x) { return opp_u_field(x, 30, 26); }// is contained in our opcodes
1274
//static int xo5( int x) { return opp_u_field(x, 29, 27); }// is contained in our opcodes
1275
//static int xo6( int x) { return opp_u_field(x, 30, 27); }// is contained in our opcodes
1276
//static int xo7( int x) { return opp_u_field(x, 31, 30); }// is contained in our opcodes
1277
1278
protected:
1279
// Compute relative address for branch.
1280
static intptr_t disp(intptr_t x, intptr_t off) {
1281
int xx = x - off;
1282
xx = xx >> 2;
1283
return xx;
1284
}
1285
1286
public:
1287
// signed immediate, in low bits, nbits long
1288
static int simm(int x, int nbits) {
1289
assert_signed_range(x, nbits);
1290
return x & ((1 << nbits) - 1);
1291
}
1292
1293
// unsigned immediate, in low bits, nbits long
1294
static int uimm(int x, int nbits) {
1295
assert_unsigned_const(x, nbits);
1296
return x & ((1 << nbits) - 1);
1297
}
1298
1299
static void set_imm(int* instr, short s) {
1300
// imm is always in the lower 16 bits of the instruction,
1301
// so this is endian-neutral. Same for the get_imm below.
1302
uint32_t w = *(uint32_t *)instr;
1303
*instr = (int)((w & ~0x0000FFFF) | (s & 0x0000FFFF));
1304
}
1305
1306
static int get_imm(address a, int instruction_number) {
1307
return (short)((int *)a)[instruction_number];
1308
}
1309
1310
static inline int hi16_signed( int x) { return (int)(int16_t)(x >> 16); }
1311
static inline int lo16_unsigned(int x) { return x & 0xffff; }
1312
1313
protected:
1314
1315
// Extract the top 32 bits in a 64 bit word.
1316
static int32_t hi32(int64_t x) {
1317
int32_t r = int32_t((uint64_t)x >> 32);
1318
return r;
1319
}
1320
1321
public:
1322
1323
static inline unsigned int align_addr(unsigned int addr, unsigned int a) {
1324
return ((addr + (a - 1)) & ~(a - 1));
1325
}
1326
1327
static inline bool is_aligned(unsigned int addr, unsigned int a) {
1328
return (0 == addr % a);
1329
}
1330
1331
void flush() {
1332
AbstractAssembler::flush();
1333
}
1334
1335
inline void emit_int32(int); // shadows AbstractAssembler::emit_int32
1336
inline void emit_data(int);
1337
inline void emit_data(int, RelocationHolder const&);
1338
inline void emit_data(int, relocInfo::relocType rtype);
1339
1340
// Emit an address.
1341
inline address emit_addr(const address addr = NULL);
1342
1343
#if !defined(ABI_ELFv2)
1344
// Emit a function descriptor with the specified entry point, TOC,
1345
// and ENV. If the entry point is NULL, the descriptor will point
1346
// just past the descriptor.
1347
// Use values from friend functions as defaults.
1348
inline address emit_fd(address entry = NULL,
1349
address toc = (address) FunctionDescriptor::friend_toc,
1350
address env = (address) FunctionDescriptor::friend_env);
1351
#endif
1352
1353
/////////////////////////////////////////////////////////////////////////////////////
1354
// PPC instructions
1355
/////////////////////////////////////////////////////////////////////////////////////
1356
1357
// Memory instructions use r0 as hard coded 0, e.g. to simulate loading
1358
// immediates. The normal instruction encoders enforce that r0 is not
1359
// passed to them. Use either extended mnemonics encoders or the special ra0
1360
// versions.
1361
1362
// Issue an illegal instruction.
1363
inline void illtrap();
1364
static inline bool is_illtrap(int x);
1365
1366
// PPC 1, section 3.3.8, Fixed-Point Arithmetic Instructions
1367
inline void addi( Register d, Register a, int si16);
1368
inline void addis(Register d, Register a, int si16);
1369
1370
// Prefixed add immediate, introduced by POWER10
1371
inline void paddi(Register d, Register a, long si34, bool r);
1372
inline void pli( Register d, long si34);
1373
1374
private:
1375
inline void addi_r0ok( Register d, Register a, int si16);
1376
inline void addis_r0ok(Register d, Register a, int si16);
1377
inline void paddi_r0ok(Register d, Register a, long si34, bool r);
1378
public:
1379
inline void addic_( Register d, Register a, int si16);
1380
inline void subfic( Register d, Register a, int si16);
1381
inline void add( Register d, Register a, Register b);
1382
inline void add_( Register d, Register a, Register b);
1383
inline void subf( Register d, Register a, Register b); // d = b - a "Sub_from", as in ppc spec.
1384
inline void sub( Register d, Register a, Register b); // d = a - b Swap operands of subf for readability.
1385
inline void subf_( Register d, Register a, Register b);
1386
inline void addc( Register d, Register a, Register b);
1387
inline void addc_( Register d, Register a, Register b);
1388
inline void subfc( Register d, Register a, Register b);
1389
inline void subfc_( Register d, Register a, Register b);
1390
inline void adde( Register d, Register a, Register b);
1391
inline void adde_( Register d, Register a, Register b);
1392
inline void subfe( Register d, Register a, Register b);
1393
inline void subfe_( Register d, Register a, Register b);
1394
inline void addme( Register d, Register a);
1395
inline void addme_( Register d, Register a);
1396
inline void subfme( Register d, Register a);
1397
inline void subfme_(Register d, Register a);
1398
inline void addze( Register d, Register a);
1399
inline void addze_( Register d, Register a);
1400
inline void subfze( Register d, Register a);
1401
inline void subfze_(Register d, Register a);
1402
inline void neg( Register d, Register a);
1403
inline void neg_( Register d, Register a);
1404
inline void mulli( Register d, Register a, int si16);
1405
inline void mulld( Register d, Register a, Register b);
1406
inline void mulld_( Register d, Register a, Register b);
1407
inline void mullw( Register d, Register a, Register b);
1408
inline void mullw_( Register d, Register a, Register b);
1409
inline void mulhw( Register d, Register a, Register b);
1410
inline void mulhw_( Register d, Register a, Register b);
1411
inline void mulhwu( Register d, Register a, Register b);
1412
inline void mulhwu_(Register d, Register a, Register b);
1413
inline void mulhd( Register d, Register a, Register b);
1414
inline void mulhd_( Register d, Register a, Register b);
1415
inline void mulhdu( Register d, Register a, Register b);
1416
inline void mulhdu_(Register d, Register a, Register b);
1417
inline void divd( Register d, Register a, Register b);
1418
inline void divd_( Register d, Register a, Register b);
1419
inline void divw( Register d, Register a, Register b);
1420
inline void divw_( Register d, Register a, Register b);
1421
inline void divwu( Register d, Register a, Register b);
1422
inline void divwu_( Register d, Register a, Register b);
1423
1424
// Fixed-Point Arithmetic Instructions with Overflow detection
1425
inline void addo( Register d, Register a, Register b);
1426
inline void addo_( Register d, Register a, Register b);
1427
inline void subfo( Register d, Register a, Register b);
1428
inline void subfo_( Register d, Register a, Register b);
1429
inline void addco( Register d, Register a, Register b);
1430
inline void addco_( Register d, Register a, Register b);
1431
inline void subfco( Register d, Register a, Register b);
1432
inline void subfco_( Register d, Register a, Register b);
1433
inline void addeo( Register d, Register a, Register b);
1434
inline void addeo_( Register d, Register a, Register b);
1435
inline void subfeo( Register d, Register a, Register b);
1436
inline void subfeo_( Register d, Register a, Register b);
1437
inline void addmeo( Register d, Register a);
1438
inline void addmeo_( Register d, Register a);
1439
inline void subfmeo( Register d, Register a);
1440
inline void subfmeo_(Register d, Register a);
1441
inline void addzeo( Register d, Register a);
1442
inline void addzeo_( Register d, Register a);
1443
inline void subfzeo( Register d, Register a);
1444
inline void subfzeo_(Register d, Register a);
1445
inline void nego( Register d, Register a);
1446
inline void nego_( Register d, Register a);
1447
inline void mulldo( Register d, Register a, Register b);
1448
inline void mulldo_( Register d, Register a, Register b);
1449
inline void mullwo( Register d, Register a, Register b);
1450
inline void mullwo_( Register d, Register a, Register b);
1451
inline void divdo( Register d, Register a, Register b);
1452
inline void divdo_( Register d, Register a, Register b);
1453
inline void divwo( Register d, Register a, Register b);
1454
inline void divwo_( Register d, Register a, Register b);
1455
1456
// extended mnemonics
1457
inline void li( Register d, int si16);
1458
inline void lis( Register d, int si16);
1459
inline void addir(Register d, int si16, Register a);
1460
inline void subi( Register d, Register a, int si16);
1461
1462
static bool is_addi(int x) {
1463
return ADDI_OPCODE == (x & ADDI_OPCODE_MASK);
1464
}
1465
static bool is_addis(int x) {
1466
return ADDIS_OPCODE == (x & ADDIS_OPCODE_MASK);
1467
}
1468
static bool is_bxx(int x) {
1469
return BXX_OPCODE == (x & BXX_OPCODE_MASK);
1470
}
1471
static bool is_b(int x) {
1472
return BXX_OPCODE == (x & BXX_OPCODE_MASK) && inv_lk_field(x) == 0;
1473
}
1474
static bool is_bl(int x) {
1475
return BXX_OPCODE == (x & BXX_OPCODE_MASK) && inv_lk_field(x) == 1;
1476
}
1477
static bool is_bcxx(int x) {
1478
return BCXX_OPCODE == (x & BCXX_OPCODE_MASK);
1479
}
1480
static bool is_bxx_or_bcxx(int x) {
1481
return is_bxx(x) || is_bcxx(x);
1482
}
1483
static bool is_bctrl(int x) {
1484
return x == 0x4e800421;
1485
}
1486
static bool is_bctr(int x) {
1487
return x == 0x4e800420;
1488
}
1489
static bool is_bclr(int x) {
1490
return BCLR_OPCODE == (x & XL_FORM_OPCODE_MASK);
1491
}
1492
static bool is_li(int x) {
1493
return is_addi(x) && inv_ra_field(x)==0;
1494
}
1495
static bool is_lis(int x) {
1496
return is_addis(x) && inv_ra_field(x)==0;
1497
}
1498
static bool is_mtctr(int x) {
1499
return MTCTR_OPCODE == (x & MTCTR_OPCODE_MASK);
1500
}
1501
static bool is_ld(int x) {
1502
return LD_OPCODE == (x & LD_OPCODE_MASK);
1503
}
1504
static bool is_std(int x) {
1505
return STD_OPCODE == (x & STD_OPCODE_MASK);
1506
}
1507
static bool is_stdu(int x) {
1508
return STDU_OPCODE == (x & STDU_OPCODE_MASK);
1509
}
1510
static bool is_stdx(int x) {
1511
return STDX_OPCODE == (x & STDX_OPCODE_MASK);
1512
}
1513
static bool is_stdux(int x) {
1514
return STDUX_OPCODE == (x & STDUX_OPCODE_MASK);
1515
}
1516
static bool is_stwx(int x) {
1517
return STWX_OPCODE == (x & STWX_OPCODE_MASK);
1518
}
1519
static bool is_stwux(int x) {
1520
return STWUX_OPCODE == (x & STWUX_OPCODE_MASK);
1521
}
1522
static bool is_stw(int x) {
1523
return STW_OPCODE == (x & STW_OPCODE_MASK);
1524
}
1525
static bool is_stwu(int x) {
1526
return STWU_OPCODE == (x & STWU_OPCODE_MASK);
1527
}
1528
static bool is_ori(int x) {
1529
return ORI_OPCODE == (x & ORI_OPCODE_MASK);
1530
};
1531
static bool is_oris(int x) {
1532
return ORIS_OPCODE == (x & ORIS_OPCODE_MASK);
1533
};
1534
static bool is_rldicr(int x) {
1535
return (RLDICR_OPCODE == (x & RLDICR_OPCODE_MASK));
1536
};
1537
static bool is_nop(int x) {
1538
return x == 0x60000000;
1539
}
1540
// endgroup opcode for Power6
1541
static bool is_endgroup(int x) {
1542
return is_ori(x) && inv_ra_field(x) == 1 && inv_rs_field(x) == 1 && inv_d1_field(x) == 0;
1543
}
1544
1545
1546
private:
1547
// PPC 1, section 3.3.9, Fixed-Point Compare Instructions
1548
inline void cmpi( ConditionRegister bf, int l, Register a, int si16);
1549
inline void cmp( ConditionRegister bf, int l, Register a, Register b);
1550
inline void cmpli(ConditionRegister bf, int l, Register a, int ui16);
1551
inline void cmpl( ConditionRegister bf, int l, Register a, Register b);
1552
1553
public:
1554
// extended mnemonics of Compare Instructions
1555
inline void cmpwi( ConditionRegister crx, Register a, int si16);
1556
inline void cmpdi( ConditionRegister crx, Register a, int si16);
1557
inline void cmpw( ConditionRegister crx, Register a, Register b);
1558
inline void cmpd( ConditionRegister crx, Register a, Register b);
1559
inline void cmplwi(ConditionRegister crx, Register a, int ui16);
1560
inline void cmpldi(ConditionRegister crx, Register a, int ui16);
1561
inline void cmplw( ConditionRegister crx, Register a, Register b);
1562
inline void cmpld( ConditionRegister crx, Register a, Register b);
1563
1564
// >= Power9
1565
inline void cmprb( ConditionRegister bf, int l, Register a, Register b);
1566
inline void cmpeqb(ConditionRegister bf, Register a, Register b);
1567
1568
inline void isel( Register d, Register a, Register b, int bc);
1569
// Convenient version which takes: Condition register, Condition code and invert flag. Omit b to keep old value.
1570
inline void isel( Register d, ConditionRegister cr, Condition cc, bool inv, Register a, Register b = noreg);
1571
// Set d = 0 if (cr.cc) equals 1, otherwise b.
1572
inline void isel_0( Register d, ConditionRegister cr, Condition cc, Register b = noreg);
1573
1574
// PPC 1, section 3.3.11, Fixed-Point Logical Instructions
1575
void andi( Register a, Register s, long ui16); // optimized version
1576
inline void andi_( Register a, Register s, int ui16);
1577
inline void andis_( Register a, Register s, int ui16);
1578
inline void ori( Register a, Register s, int ui16);
1579
inline void oris( Register a, Register s, int ui16);
1580
inline void xori( Register a, Register s, int ui16);
1581
inline void xoris( Register a, Register s, int ui16);
1582
inline void andr( Register a, Register s, Register b); // suffixed by 'r' as 'and' is C++ keyword
1583
inline void and_( Register a, Register s, Register b);
1584
// Turn or0(rx,rx,rx) into a nop and avoid that we accidently emit a
1585
// SMT-priority change instruction (see SMT instructions below).
1586
inline void or_unchecked(Register a, Register s, Register b);
1587
inline void orr( Register a, Register s, Register b); // suffixed by 'r' as 'or' is C++ keyword
1588
inline void or_( Register a, Register s, Register b);
1589
inline void xorr( Register a, Register s, Register b); // suffixed by 'r' as 'xor' is C++ keyword
1590
inline void xor_( Register a, Register s, Register b);
1591
inline void nand( Register a, Register s, Register b);
1592
inline void nand_( Register a, Register s, Register b);
1593
inline void nor( Register a, Register s, Register b);
1594
inline void nor_( Register a, Register s, Register b);
1595
inline void andc( Register a, Register s, Register b);
1596
inline void andc_( Register a, Register s, Register b);
1597
inline void orc( Register a, Register s, Register b);
1598
inline void orc_( Register a, Register s, Register b);
1599
inline void extsb( Register a, Register s);
1600
inline void extsb_( Register a, Register s);
1601
inline void extsh( Register a, Register s);
1602
inline void extsh_( Register a, Register s);
1603
inline void extsw( Register a, Register s);
1604
inline void extsw_( Register a, Register s);
1605
1606
// extended mnemonics
1607
inline void nop();
1608
// NOP for FP and BR units (different versions to allow them to be in one group)
1609
inline void fpnop0();
1610
inline void fpnop1();
1611
inline void brnop0();
1612
inline void brnop1();
1613
inline void brnop2();
1614
1615
inline void mr( Register d, Register s);
1616
inline void ori_opt( Register d, int ui16);
1617
inline void oris_opt(Register d, int ui16);
1618
1619
// endgroup opcode for Power6
1620
inline void endgroup();
1621
1622
// count instructions
1623
inline void cntlzw( Register a, Register s);
1624
inline void cntlzw_( Register a, Register s);
1625
inline void cntlzd( Register a, Register s);
1626
inline void cntlzd_( Register a, Register s);
1627
inline void cnttzw( Register a, Register s);
1628
inline void cnttzw_( Register a, Register s);
1629
inline void cnttzd( Register a, Register s);
1630
inline void cnttzd_( Register a, Register s);
1631
1632
// PPC 1, section 3.3.12, Fixed-Point Rotate and Shift Instructions
1633
inline void sld( Register a, Register s, Register b);
1634
inline void sld_( Register a, Register s, Register b);
1635
inline void slw( Register a, Register s, Register b);
1636
inline void slw_( Register a, Register s, Register b);
1637
inline void srd( Register a, Register s, Register b);
1638
inline void srd_( Register a, Register s, Register b);
1639
inline void srw( Register a, Register s, Register b);
1640
inline void srw_( Register a, Register s, Register b);
1641
inline void srad( Register a, Register s, Register b);
1642
inline void srad_( Register a, Register s, Register b);
1643
inline void sraw( Register a, Register s, Register b);
1644
inline void sraw_( Register a, Register s, Register b);
1645
inline void sradi( Register a, Register s, int sh6);
1646
inline void sradi_( Register a, Register s, int sh6);
1647
inline void srawi( Register a, Register s, int sh5);
1648
inline void srawi_( Register a, Register s, int sh5);
1649
1650
// extended mnemonics for Shift Instructions
1651
inline void sldi( Register a, Register s, int sh6);
1652
inline void sldi_( Register a, Register s, int sh6);
1653
inline void slwi( Register a, Register s, int sh5);
1654
inline void slwi_( Register a, Register s, int sh5);
1655
inline void srdi( Register a, Register s, int sh6);
1656
inline void srdi_( Register a, Register s, int sh6);
1657
inline void srwi( Register a, Register s, int sh5);
1658
inline void srwi_( Register a, Register s, int sh5);
1659
1660
inline void clrrdi( Register a, Register s, int ui6);
1661
inline void clrrdi_( Register a, Register s, int ui6);
1662
inline void clrldi( Register a, Register s, int ui6);
1663
inline void clrldi_( Register a, Register s, int ui6);
1664
inline void clrlsldi(Register a, Register s, int clrl6, int shl6);
1665
inline void clrlsldi_(Register a, Register s, int clrl6, int shl6);
1666
inline void extrdi( Register a, Register s, int n, int b);
1667
// testbit with condition register
1668
inline void testbitdi(ConditionRegister cr, Register a, Register s, int ui6);
1669
1670
// Byte reverse instructions (introduced with Power10)
1671
inline void brh( Register a, Register s);
1672
inline void brw( Register a, Register s);
1673
inline void brd( Register a, Register s);
1674
1675
// rotate instructions
1676
inline void rotldi( Register a, Register s, int n);
1677
inline void rotrdi( Register a, Register s, int n);
1678
inline void rotlwi( Register a, Register s, int n);
1679
inline void rotrwi( Register a, Register s, int n);
1680
1681
// Rotate Instructions
1682
inline void rldic( Register a, Register s, int sh6, int mb6);
1683
inline void rldic_( Register a, Register s, int sh6, int mb6);
1684
inline void rldicr( Register a, Register s, int sh6, int mb6);
1685
inline void rldicr_( Register a, Register s, int sh6, int mb6);
1686
inline void rldicl( Register a, Register s, int sh6, int mb6);
1687
inline void rldicl_( Register a, Register s, int sh6, int mb6);
1688
inline void rlwinm( Register a, Register s, int sh5, int mb5, int me5);
1689
inline void rlwinm_( Register a, Register s, int sh5, int mb5, int me5);
1690
inline void rldimi( Register a, Register s, int sh6, int mb6);
1691
inline void rldimi_( Register a, Register s, int sh6, int mb6);
1692
inline void rlwimi( Register a, Register s, int sh5, int mb5, int me5);
1693
inline void insrdi( Register a, Register s, int n, int b);
1694
inline void insrwi( Register a, Register s, int n, int b);
1695
1696
// PPC 1, section 3.3.2 Fixed-Point Load Instructions
1697
// 4 bytes
1698
inline void lwzx( Register d, Register s1, Register s2);
1699
inline void lwz( Register d, int si16, Register s1);
1700
inline void lwzu( Register d, int si16, Register s1);
1701
1702
// 4 bytes
1703
inline void lwax( Register d, Register s1, Register s2);
1704
inline void lwa( Register d, int si16, Register s1);
1705
1706
// 4 bytes reversed
1707
inline void lwbrx( Register d, Register s1, Register s2);
1708
1709
// 2 bytes
1710
inline void lhzx( Register d, Register s1, Register s2);
1711
inline void lhz( Register d, int si16, Register s1);
1712
inline void lhzu( Register d, int si16, Register s1);
1713
1714
// 2 bytes reversed
1715
inline void lhbrx( Register d, Register s1, Register s2);
1716
1717
// 2 bytes
1718
inline void lhax( Register d, Register s1, Register s2);
1719
inline void lha( Register d, int si16, Register s1);
1720
inline void lhau( Register d, int si16, Register s1);
1721
1722
// 1 byte
1723
inline void lbzx( Register d, Register s1, Register s2);
1724
inline void lbz( Register d, int si16, Register s1);
1725
inline void lbzu( Register d, int si16, Register s1);
1726
1727
// 8 bytes
1728
inline void ldx( Register d, Register s1, Register s2);
1729
inline void ld( Register d, int si16, Register s1);
1730
inline void ldu( Register d, int si16, Register s1);
1731
1732
// 8 bytes reversed
1733
inline void ldbrx( Register d, Register s1, Register s2);
1734
1735
// For convenience. Load pointer into d from b+s1.
1736
inline void ld_ptr(Register d, int b, Register s1);
1737
inline void ld_ptr(Register d, ByteSize b, Register s1);
1738
1739
// PPC 1, section 3.3.3 Fixed-Point Store Instructions
1740
inline void stwx( Register d, Register s1, Register s2);
1741
inline void stw( Register d, int si16, Register s1);
1742
inline void stwu( Register d, int si16, Register s1);
1743
inline void stwbrx( Register d, Register s1, Register s2);
1744
1745
inline void sthx( Register d, Register s1, Register s2);
1746
inline void sth( Register d, int si16, Register s1);
1747
inline void sthu( Register d, int si16, Register s1);
1748
inline void sthbrx( Register d, Register s1, Register s2);
1749
1750
inline void stbx( Register d, Register s1, Register s2);
1751
inline void stb( Register d, int si16, Register s1);
1752
inline void stbu( Register d, int si16, Register s1);
1753
1754
inline void stdx( Register d, Register s1, Register s2);
1755
inline void std( Register d, int si16, Register s1);
1756
inline void stdu( Register d, int si16, Register s1);
1757
inline void stdux(Register s, Register a, Register b);
1758
inline void stdbrx( Register d, Register s1, Register s2);
1759
1760
inline void st_ptr(Register d, int si16, Register s1);
1761
inline void st_ptr(Register d, ByteSize b, Register s1);
1762
1763
// PPC 1, section 3.3.13 Move To/From System Register Instructions
1764
inline void mtlr( Register s1);
1765
inline void mflr( Register d);
1766
inline void mtctr(Register s1);
1767
inline void mfctr(Register d);
1768
inline void mtcrf(int fxm, Register s);
1769
inline void mfcr( Register d);
1770
inline void mcrf( ConditionRegister crd, ConditionRegister cra);
1771
inline void mtcr( Register s);
1772
// >= Power9
1773
inline void mcrxrx(ConditionRegister cra);
1774
inline void setb( Register d, ConditionRegister cra);
1775
1776
// >= Power10
1777
inline void setbc( Register d, int biint);
1778
inline void setbc( Register d, ConditionRegister cr, Condition cc);
1779
inline void setnbc(Register d, int biint);
1780
inline void setnbc(Register d, ConditionRegister cr, Condition cc);
1781
1782
// Special purpose registers
1783
// Exception Register
1784
inline void mtxer(Register s1);
1785
inline void mfxer(Register d);
1786
// Vector Register Save Register
1787
inline void mtvrsave(Register s1);
1788
inline void mfvrsave(Register d);
1789
// Timebase
1790
inline void mftb(Register d);
1791
// Introduced with Power 8:
1792
// Data Stream Control Register
1793
inline void mtdscr(Register s1);
1794
inline void mfdscr(Register d );
1795
// Transactional Memory Registers
1796
inline void mftfhar(Register d);
1797
inline void mftfiar(Register d);
1798
inline void mftexasr(Register d);
1799
inline void mftexasru(Register d);
1800
1801
// TEXASR bit description
1802
enum transaction_failure_reason {
1803
// Upper half (TEXASRU):
1804
tm_failure_code = 0, // The Failure Code is copied from tabort or treclaim operand.
1805
tm_failure_persistent = 7, // The failure is likely to recur on each execution.
1806
tm_disallowed = 8, // The instruction is not permitted.
1807
tm_nesting_of = 9, // The maximum transaction level was exceeded.
1808
tm_footprint_of = 10, // The tracking limit for transactional storage accesses was exceeded.
1809
tm_self_induced_cf = 11, // A self-induced conflict occurred in Suspended state.
1810
tm_non_trans_cf = 12, // A conflict occurred with a non-transactional access by another processor.
1811
tm_trans_cf = 13, // A conflict occurred with another transaction.
1812
tm_translation_cf = 14, // A conflict occurred with a TLB invalidation.
1813
tm_inst_fetch_cf = 16, // An instruction fetch was performed from a block that was previously written transactionally.
1814
tm_tabort = 31, // Termination was caused by the execution of an abort instruction.
1815
// Lower half:
1816
tm_suspended = 32, // Failure was recorded in Suspended state.
1817
tm_failure_summary = 36, // Failure has been detected and recorded.
1818
tm_tfiar_exact = 37, // Value in the TFIAR is exact.
1819
tm_rot = 38, // Rollback-only transaction.
1820
tm_transaction_level = 52, // Transaction level (nesting depth + 1).
1821
};
1822
1823
// PPC 1, section 2.4.1 Branch Instructions
1824
inline void b( address a, relocInfo::relocType rt = relocInfo::none);
1825
inline void b( Label& L);
1826
inline void bl( address a, relocInfo::relocType rt = relocInfo::none);
1827
inline void bl( Label& L);
1828
inline void bc( int boint, int biint, address a, relocInfo::relocType rt = relocInfo::none);
1829
inline void bc( int boint, int biint, Label& L);
1830
inline void bcl(int boint, int biint, address a, relocInfo::relocType rt = relocInfo::none);
1831
inline void bcl(int boint, int biint, Label& L);
1832
1833
inline void bclr( int boint, int biint, int bhint, relocInfo::relocType rt = relocInfo::none);
1834
inline void bclrl( int boint, int biint, int bhint, relocInfo::relocType rt = relocInfo::none);
1835
inline void bcctr( int boint, int biint, int bhint = bhintbhBCCTRisNotReturnButSame,
1836
relocInfo::relocType rt = relocInfo::none);
1837
inline void bcctrl(int boint, int biint, int bhint = bhintbhBCLRisReturn,
1838
relocInfo::relocType rt = relocInfo::none);
1839
1840
// helper function for b, bcxx
1841
inline bool is_within_range_of_b(address a, address pc);
1842
inline bool is_within_range_of_bcxx(address a, address pc);
1843
1844
// get the destination of a bxx branch (b, bl, ba, bla)
1845
static inline address bxx_destination(address baddr);
1846
static inline address bxx_destination(int instr, address pc);
1847
static inline intptr_t bxx_destination_offset(int instr, intptr_t bxx_pos);
1848
1849
// extended mnemonics for branch instructions
1850
inline void blt(ConditionRegister crx, Label& L);
1851
inline void bgt(ConditionRegister crx, Label& L);
1852
inline void beq(ConditionRegister crx, Label& L);
1853
inline void bso(ConditionRegister crx, Label& L);
1854
inline void bge(ConditionRegister crx, Label& L);
1855
inline void ble(ConditionRegister crx, Label& L);
1856
inline void bne(ConditionRegister crx, Label& L);
1857
inline void bns(ConditionRegister crx, Label& L);
1858
1859
// Branch instructions with static prediction hints.
1860
inline void blt_predict_taken( ConditionRegister crx, Label& L);
1861
inline void bgt_predict_taken( ConditionRegister crx, Label& L);
1862
inline void beq_predict_taken( ConditionRegister crx, Label& L);
1863
inline void bso_predict_taken( ConditionRegister crx, Label& L);
1864
inline void bge_predict_taken( ConditionRegister crx, Label& L);
1865
inline void ble_predict_taken( ConditionRegister crx, Label& L);
1866
inline void bne_predict_taken( ConditionRegister crx, Label& L);
1867
inline void bns_predict_taken( ConditionRegister crx, Label& L);
1868
inline void blt_predict_not_taken(ConditionRegister crx, Label& L);
1869
inline void bgt_predict_not_taken(ConditionRegister crx, Label& L);
1870
inline void beq_predict_not_taken(ConditionRegister crx, Label& L);
1871
inline void bso_predict_not_taken(ConditionRegister crx, Label& L);
1872
inline void bge_predict_not_taken(ConditionRegister crx, Label& L);
1873
inline void ble_predict_not_taken(ConditionRegister crx, Label& L);
1874
inline void bne_predict_not_taken(ConditionRegister crx, Label& L);
1875
inline void bns_predict_not_taken(ConditionRegister crx, Label& L);
1876
1877
// for use in conjunction with testbitdi:
1878
inline void btrue( ConditionRegister crx, Label& L);
1879
inline void bfalse(ConditionRegister crx, Label& L);
1880
1881
inline void bltl(ConditionRegister crx, Label& L);
1882
inline void bgtl(ConditionRegister crx, Label& L);
1883
inline void beql(ConditionRegister crx, Label& L);
1884
inline void bsol(ConditionRegister crx, Label& L);
1885
inline void bgel(ConditionRegister crx, Label& L);
1886
inline void blel(ConditionRegister crx, Label& L);
1887
inline void bnel(ConditionRegister crx, Label& L);
1888
inline void bnsl(ConditionRegister crx, Label& L);
1889
1890
// extended mnemonics for Branch Instructions via LR
1891
// We use `blr' for returns.
1892
inline void blr(relocInfo::relocType rt = relocInfo::none);
1893
1894
// extended mnemonics for Branch Instructions with CTR
1895
// bdnz means `decrement CTR and jump to L if CTR is not zero'
1896
inline void bdnz(Label& L);
1897
// Decrement and branch if result is zero.
1898
inline void bdz(Label& L);
1899
// we use `bctr[l]' for jumps/calls in function descriptor glue
1900
// code, e.g. calls to runtime functions
1901
inline void bctr( relocInfo::relocType rt = relocInfo::none);
1902
inline void bctrl(relocInfo::relocType rt = relocInfo::none);
1903
// conditional jumps/branches via CTR
1904
inline void beqctr( ConditionRegister crx, relocInfo::relocType rt = relocInfo::none);
1905
inline void beqctrl(ConditionRegister crx, relocInfo::relocType rt = relocInfo::none);
1906
inline void bnectr( ConditionRegister crx, relocInfo::relocType rt = relocInfo::none);
1907
inline void bnectrl(ConditionRegister crx, relocInfo::relocType rt = relocInfo::none);
1908
1909
// condition register logic instructions
1910
// NOTE: There's a preferred form: d and s2 should point into the same condition register.
1911
inline void crand( int d, int s1, int s2);
1912
inline void crnand(int d, int s1, int s2);
1913
inline void cror( int d, int s1, int s2);
1914
inline void crxor( int d, int s1, int s2);
1915
inline void crnor( int d, int s1, int s2);
1916
inline void creqv( int d, int s1, int s2);
1917
inline void crandc(int d, int s1, int s2);
1918
inline void crorc( int d, int s1, int s2);
1919
1920
// More convenient version.
1921
int condition_register_bit(ConditionRegister cr, Condition c) {
1922
return 4 * (int)(intptr_t)cr + c;
1923
}
1924
void crand( ConditionRegister crdst, Condition cdst, ConditionRegister crsrc, Condition csrc);
1925
void crnand(ConditionRegister crdst, Condition cdst, ConditionRegister crsrc, Condition csrc);
1926
void cror( ConditionRegister crdst, Condition cdst, ConditionRegister crsrc, Condition csrc);
1927
void crxor( ConditionRegister crdst, Condition cdst, ConditionRegister crsrc, Condition csrc);
1928
void crnor( ConditionRegister crdst, Condition cdst, ConditionRegister crsrc, Condition csrc);
1929
void creqv( ConditionRegister crdst, Condition cdst, ConditionRegister crsrc, Condition csrc);
1930
void crandc(ConditionRegister crdst, Condition cdst, ConditionRegister crsrc, Condition csrc);
1931
void crorc( ConditionRegister crdst, Condition cdst, ConditionRegister crsrc, Condition csrc);
1932
1933
// icache and dcache related instructions
1934
inline void icbi( Register s1, Register s2);
1935
//inline void dcba(Register s1, Register s2); // Instruction for embedded processor only.
1936
inline void dcbz( Register s1, Register s2);
1937
inline void dcbst( Register s1, Register s2);
1938
inline void dcbf( Register s1, Register s2);
1939
1940
enum ct_cache_specification {
1941
ct_primary_cache = 0,
1942
ct_secondary_cache = 2
1943
};
1944
// dcache read hint
1945
inline void dcbt( Register s1, Register s2);
1946
inline void dcbtct( Register s1, Register s2, int ct);
1947
inline void dcbtds( Register s1, Register s2, int ds);
1948
// dcache write hint
1949
inline void dcbtst( Register s1, Register s2);
1950
inline void dcbtstct(Register s1, Register s2, int ct);
1951
1952
// machine barrier instructions:
1953
//
1954
// - sync two-way memory barrier, aka fence
1955
// - lwsync orders Store|Store,
1956
// Load|Store,
1957
// Load|Load,
1958
// but not Store|Load
1959
// - eieio orders memory accesses for device memory (only)
1960
// - isync invalidates speculatively executed instructions
1961
// From the Power ISA 2.06 documentation:
1962
// "[...] an isync instruction prevents the execution of
1963
// instructions following the isync until instructions
1964
// preceding the isync have completed, [...]"
1965
// From IBM's AIX assembler reference:
1966
// "The isync [...] instructions causes the processor to
1967
// refetch any instructions that might have been fetched
1968
// prior to the isync instruction. The instruction isync
1969
// causes the processor to wait for all previous instructions
1970
// to complete. Then any instructions already fetched are
1971
// discarded and instruction processing continues in the
1972
// environment established by the previous instructions."
1973
//
1974
// semantic barrier instructions:
1975
// (as defined in orderAccess.hpp)
1976
//
1977
// - release orders Store|Store, (maps to lwsync)
1978
// Load|Store
1979
// - acquire orders Load|Store, (maps to lwsync)
1980
// Load|Load
1981
// - fence orders Store|Store, (maps to sync)
1982
// Load|Store,
1983
// Load|Load,
1984
// Store|Load
1985
//
1986
private:
1987
inline void sync(int l);
1988
public:
1989
inline void sync();
1990
inline void lwsync();
1991
inline void ptesync();
1992
inline void eieio();
1993
inline void isync();
1994
inline void elemental_membar(int e); // Elemental Memory Barriers (>=Power 8)
1995
1996
// Wait instructions for polling. Attention: May result in SIGILL.
1997
inline void wait();
1998
inline void waitrsv(); // >=Power7
1999
2000
// atomics
2001
inline void lbarx_unchecked(Register d, Register a, Register b, int eh1 = 0); // >=Power 8
2002
inline void lharx_unchecked(Register d, Register a, Register b, int eh1 = 0); // >=Power 8
2003
inline void lwarx_unchecked(Register d, Register a, Register b, int eh1 = 0);
2004
inline void ldarx_unchecked(Register d, Register a, Register b, int eh1 = 0);
2005
inline void lqarx_unchecked(Register d, Register a, Register b, int eh1 = 0); // >=Power 8
2006
inline bool lxarx_hint_exclusive_access();
2007
inline void lbarx( Register d, Register a, Register b, bool hint_exclusive_access = false);
2008
inline void lharx( Register d, Register a, Register b, bool hint_exclusive_access = false);
2009
inline void lwarx( Register d, Register a, Register b, bool hint_exclusive_access = false);
2010
inline void ldarx( Register d, Register a, Register b, bool hint_exclusive_access = false);
2011
inline void lqarx( Register d, Register a, Register b, bool hint_exclusive_access = false);
2012
inline void stbcx_( Register s, Register a, Register b);
2013
inline void sthcx_( Register s, Register a, Register b);
2014
inline void stwcx_( Register s, Register a, Register b);
2015
inline void stdcx_( Register s, Register a, Register b);
2016
inline void stqcx_( Register s, Register a, Register b);
2017
2018
// Instructions for adjusting thread priority for simultaneous
2019
// multithreading (SMT) on Power5.
2020
private:
2021
inline void smt_prio_very_low();
2022
inline void smt_prio_medium_high();
2023
inline void smt_prio_high();
2024
2025
public:
2026
inline void smt_prio_low();
2027
inline void smt_prio_medium_low();
2028
inline void smt_prio_medium();
2029
// >= Power7
2030
inline void smt_yield();
2031
inline void smt_mdoio();
2032
inline void smt_mdoom();
2033
// >= Power8
2034
inline void smt_miso();
2035
2036
// trap instructions
2037
inline void twi_0(Register a); // for load with acquire semantics use load+twi_0+isync (trap can't occur)
2038
// NOT FOR DIRECT USE!!
2039
protected:
2040
inline void tdi_unchecked(int tobits, Register a, int si16);
2041
inline void twi_unchecked(int tobits, Register a, int si16);
2042
inline void tdi( int tobits, Register a, int si16); // asserts UseSIGTRAP
2043
inline void twi( int tobits, Register a, int si16); // asserts UseSIGTRAP
2044
inline void td( int tobits, Register a, Register b); // asserts UseSIGTRAP
2045
inline void tw( int tobits, Register a, Register b); // asserts UseSIGTRAP
2046
2047
public:
2048
static bool is_tdi(int x, int tobits, int ra, int si16) {
2049
return (TDI_OPCODE == (x & TDI_OPCODE_MASK))
2050
&& (tobits == inv_to_field(x))
2051
&& (ra == -1/*any reg*/ || ra == inv_ra_field(x))
2052
&& (si16 == inv_si_field(x));
2053
}
2054
2055
static int tdi_get_si16(int x, int tobits, int ra) {
2056
if (TDI_OPCODE == (x & TDI_OPCODE_MASK)
2057
&& (tobits == inv_to_field(x))
2058
&& (ra == -1/*any reg*/ || ra == inv_ra_field(x))) {
2059
return inv_si_field(x);
2060
}
2061
return -1; // No valid tdi instruction.
2062
}
2063
2064
static bool is_twi(int x, int tobits, int ra, int si16) {
2065
return (TWI_OPCODE == (x & TWI_OPCODE_MASK))
2066
&& (tobits == inv_to_field(x))
2067
&& (ra == -1/*any reg*/ || ra == inv_ra_field(x))
2068
&& (si16 == inv_si_field(x));
2069
}
2070
2071
static bool is_twi(int x, int tobits, int ra) {
2072
return (TWI_OPCODE == (x & TWI_OPCODE_MASK))
2073
&& (tobits == inv_to_field(x))
2074
&& (ra == -1/*any reg*/ || ra == inv_ra_field(x));
2075
}
2076
2077
static bool is_td(int x, int tobits, int ra, int rb) {
2078
return (TD_OPCODE == (x & TD_OPCODE_MASK))
2079
&& (tobits == inv_to_field(x))
2080
&& (ra == -1/*any reg*/ || ra == inv_ra_field(x))
2081
&& (rb == -1/*any reg*/ || rb == inv_rb_field(x));
2082
}
2083
2084
static bool is_tw(int x, int tobits, int ra, int rb) {
2085
return (TW_OPCODE == (x & TW_OPCODE_MASK))
2086
&& (tobits == inv_to_field(x))
2087
&& (ra == -1/*any reg*/ || ra == inv_ra_field(x))
2088
&& (rb == -1/*any reg*/ || rb == inv_rb_field(x));
2089
}
2090
2091
// PPC floating point instructions
2092
// PPC 1, section 4.6.2 Floating-Point Load Instructions
2093
inline void lfs( FloatRegister d, int si16, Register a);
2094
inline void lfsu( FloatRegister d, int si16, Register a);
2095
inline void lfsx( FloatRegister d, Register a, Register b);
2096
inline void lfd( FloatRegister d, int si16, Register a);
2097
inline void lfdu( FloatRegister d, int si16, Register a);
2098
inline void lfdx( FloatRegister d, Register a, Register b);
2099
2100
// PPC 1, section 4.6.3 Floating-Point Store Instructions
2101
inline void stfs( FloatRegister s, int si16, Register a);
2102
inline void stfsu( FloatRegister s, int si16, Register a);
2103
inline void stfsx( FloatRegister s, Register a, Register b);
2104
inline void stfd( FloatRegister s, int si16, Register a);
2105
inline void stfdu( FloatRegister s, int si16, Register a);
2106
inline void stfdx( FloatRegister s, Register a, Register b);
2107
2108
// PPC 1, section 4.6.4 Floating-Point Move Instructions
2109
inline void fmr( FloatRegister d, FloatRegister b);
2110
inline void fmr_( FloatRegister d, FloatRegister b);
2111
2112
inline void frin( FloatRegister d, FloatRegister b);
2113
inline void frip( FloatRegister d, FloatRegister b);
2114
inline void frim( FloatRegister d, FloatRegister b);
2115
2116
// inline void mffgpr( FloatRegister d, Register b);
2117
// inline void mftgpr( Register d, FloatRegister b);
2118
inline void cmpb( Register a, Register s, Register b);
2119
inline void popcntb(Register a, Register s);
2120
inline void popcntw(Register a, Register s);
2121
inline void popcntd(Register a, Register s);
2122
2123
inline void fneg( FloatRegister d, FloatRegister b);
2124
inline void fneg_( FloatRegister d, FloatRegister b);
2125
inline void fabs( FloatRegister d, FloatRegister b);
2126
inline void fabs_( FloatRegister d, FloatRegister b);
2127
inline void fnabs( FloatRegister d, FloatRegister b);
2128
inline void fnabs_(FloatRegister d, FloatRegister b);
2129
2130
// PPC 1, section 4.6.5.1 Floating-Point Elementary Arithmetic Instructions
2131
inline void fadd( FloatRegister d, FloatRegister a, FloatRegister b);
2132
inline void fadd_( FloatRegister d, FloatRegister a, FloatRegister b);
2133
inline void fadds( FloatRegister d, FloatRegister a, FloatRegister b);
2134
inline void fadds_(FloatRegister d, FloatRegister a, FloatRegister b);
2135
inline void fsub( FloatRegister d, FloatRegister a, FloatRegister b);
2136
inline void fsub_( FloatRegister d, FloatRegister a, FloatRegister b);
2137
inline void fsubs( FloatRegister d, FloatRegister a, FloatRegister b);
2138
inline void fsubs_(FloatRegister d, FloatRegister a, FloatRegister b);
2139
inline void fmul( FloatRegister d, FloatRegister a, FloatRegister c);
2140
inline void fmul_( FloatRegister d, FloatRegister a, FloatRegister c);
2141
inline void fmuls( FloatRegister d, FloatRegister a, FloatRegister c);
2142
inline void fmuls_(FloatRegister d, FloatRegister a, FloatRegister c);
2143
inline void fdiv( FloatRegister d, FloatRegister a, FloatRegister b);
2144
inline void fdiv_( FloatRegister d, FloatRegister a, FloatRegister b);
2145
inline void fdivs( FloatRegister d, FloatRegister a, FloatRegister b);
2146
inline void fdivs_(FloatRegister d, FloatRegister a, FloatRegister b);
2147
2148
// Fused multiply-accumulate instructions.
2149
// WARNING: Use only when rounding between the 2 parts is not desired.
2150
// Some floating point tck tests will fail if used incorrectly.
2151
inline void fmadd( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
2152
inline void fmadd_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
2153
inline void fmadds( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
2154
inline void fmadds_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
2155
inline void fmsub( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
2156
inline void fmsub_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
2157
inline void fmsubs( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
2158
inline void fmsubs_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
2159
inline void fnmadd( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
2160
inline void fnmadd_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
2161
inline void fnmadds( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
2162
inline void fnmadds_(FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
2163
inline void fnmsub( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
2164
inline void fnmsub_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
2165
inline void fnmsubs( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
2166
inline void fnmsubs_(FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
2167
2168
// PPC 1, section 4.6.6 Floating-Point Rounding and Conversion Instructions
2169
inline void frsp( FloatRegister d, FloatRegister b);
2170
inline void fctid( FloatRegister d, FloatRegister b);
2171
inline void fctidz(FloatRegister d, FloatRegister b);
2172
inline void fctiw( FloatRegister d, FloatRegister b);
2173
inline void fctiwz(FloatRegister d, FloatRegister b);
2174
inline void fcfid( FloatRegister d, FloatRegister b);
2175
inline void fcfids(FloatRegister d, FloatRegister b);
2176
2177
// PPC 1, section 4.6.7 Floating-Point Compare Instructions
2178
inline void fcmpu( ConditionRegister crx, FloatRegister a, FloatRegister b);
2179
2180
inline void fsqrt( FloatRegister d, FloatRegister b);
2181
inline void fsqrts(FloatRegister d, FloatRegister b);
2182
2183
// Vector instructions for >= Power6.
2184
inline void lvebx( VectorRegister d, Register s1, Register s2);
2185
inline void lvehx( VectorRegister d, Register s1, Register s2);
2186
inline void lvewx( VectorRegister d, Register s1, Register s2);
2187
inline void lvx( VectorRegister d, Register s1, Register s2);
2188
inline void lvxl( VectorRegister d, Register s1, Register s2);
2189
inline void stvebx( VectorRegister d, Register s1, Register s2);
2190
inline void stvehx( VectorRegister d, Register s1, Register s2);
2191
inline void stvewx( VectorRegister d, Register s1, Register s2);
2192
inline void stvx( VectorRegister d, Register s1, Register s2);
2193
inline void stvxl( VectorRegister d, Register s1, Register s2);
2194
inline void lvsl( VectorRegister d, Register s1, Register s2);
2195
inline void lvsr( VectorRegister d, Register s1, Register s2);
2196
inline void vpkpx( VectorRegister d, VectorRegister a, VectorRegister b);
2197
inline void vpkshss( VectorRegister d, VectorRegister a, VectorRegister b);
2198
inline void vpkswss( VectorRegister d, VectorRegister a, VectorRegister b);
2199
inline void vpkshus( VectorRegister d, VectorRegister a, VectorRegister b);
2200
inline void vpkswus( VectorRegister d, VectorRegister a, VectorRegister b);
2201
inline void vpkuhum( VectorRegister d, VectorRegister a, VectorRegister b);
2202
inline void vpkuwum( VectorRegister d, VectorRegister a, VectorRegister b);
2203
inline void vpkuhus( VectorRegister d, VectorRegister a, VectorRegister b);
2204
inline void vpkuwus( VectorRegister d, VectorRegister a, VectorRegister b);
2205
inline void vupkhpx( VectorRegister d, VectorRegister b);
2206
inline void vupkhsb( VectorRegister d, VectorRegister b);
2207
inline void vupkhsh( VectorRegister d, VectorRegister b);
2208
inline void vupklpx( VectorRegister d, VectorRegister b);
2209
inline void vupklsb( VectorRegister d, VectorRegister b);
2210
inline void vupklsh( VectorRegister d, VectorRegister b);
2211
inline void vmrghb( VectorRegister d, VectorRegister a, VectorRegister b);
2212
inline void vmrghw( VectorRegister d, VectorRegister a, VectorRegister b);
2213
inline void vmrghh( VectorRegister d, VectorRegister a, VectorRegister b);
2214
inline void vmrglb( VectorRegister d, VectorRegister a, VectorRegister b);
2215
inline void vmrglw( VectorRegister d, VectorRegister a, VectorRegister b);
2216
inline void vmrglh( VectorRegister d, VectorRegister a, VectorRegister b);
2217
inline void vsplt( VectorRegister d, int ui4, VectorRegister b);
2218
inline void vsplth( VectorRegister d, int ui3, VectorRegister b);
2219
inline void vspltw( VectorRegister d, int ui2, VectorRegister b);
2220
inline void vspltisb( VectorRegister d, int si5);
2221
inline void vspltish( VectorRegister d, int si5);
2222
inline void vspltisw( VectorRegister d, int si5);
2223
inline void vperm( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);
2224
inline void vpextd( VectorRegister d, VectorRegister a, VectorRegister b);
2225
inline void vsel( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);
2226
inline void vsl( VectorRegister d, VectorRegister a, VectorRegister b);
2227
inline void vsldoi( VectorRegister d, VectorRegister a, VectorRegister b, int ui4);
2228
inline void vslo( VectorRegister d, VectorRegister a, VectorRegister b);
2229
inline void vsr( VectorRegister d, VectorRegister a, VectorRegister b);
2230
inline void vsro( VectorRegister d, VectorRegister a, VectorRegister b);
2231
inline void vaddcuw( VectorRegister d, VectorRegister a, VectorRegister b);
2232
inline void vaddshs( VectorRegister d, VectorRegister a, VectorRegister b);
2233
inline void vaddsbs( VectorRegister d, VectorRegister a, VectorRegister b);
2234
inline void vaddsws( VectorRegister d, VectorRegister a, VectorRegister b);
2235
inline void vaddubm( VectorRegister d, VectorRegister a, VectorRegister b);
2236
inline void vadduwm( VectorRegister d, VectorRegister a, VectorRegister b);
2237
inline void vadduhm( VectorRegister d, VectorRegister a, VectorRegister b);
2238
inline void vaddudm( VectorRegister d, VectorRegister a, VectorRegister b);
2239
inline void vaddubs( VectorRegister d, VectorRegister a, VectorRegister b);
2240
inline void vadduws( VectorRegister d, VectorRegister a, VectorRegister b);
2241
inline void vadduhs( VectorRegister d, VectorRegister a, VectorRegister b);
2242
inline void vaddfp( VectorRegister d, VectorRegister a, VectorRegister b);
2243
inline void vsubcuw( VectorRegister d, VectorRegister a, VectorRegister b);
2244
inline void vsubshs( VectorRegister d, VectorRegister a, VectorRegister b);
2245
inline void vsubsbs( VectorRegister d, VectorRegister a, VectorRegister b);
2246
inline void vsubsws( VectorRegister d, VectorRegister a, VectorRegister b);
2247
inline void vsububm( VectorRegister d, VectorRegister a, VectorRegister b);
2248
inline void vsubuwm( VectorRegister d, VectorRegister a, VectorRegister b);
2249
inline void vsubuhm( VectorRegister d, VectorRegister a, VectorRegister b);
2250
inline void vsubudm( VectorRegister d, VectorRegister a, VectorRegister b);
2251
inline void vsububs( VectorRegister d, VectorRegister a, VectorRegister b);
2252
inline void vsubuws( VectorRegister d, VectorRegister a, VectorRegister b);
2253
inline void vsubuhs( VectorRegister d, VectorRegister a, VectorRegister b);
2254
inline void vsubfp( VectorRegister d, VectorRegister a, VectorRegister b);
2255
inline void vmulesb( VectorRegister d, VectorRegister a, VectorRegister b);
2256
inline void vmuleub( VectorRegister d, VectorRegister a, VectorRegister b);
2257
inline void vmulesh( VectorRegister d, VectorRegister a, VectorRegister b);
2258
inline void vmuleuh( VectorRegister d, VectorRegister a, VectorRegister b);
2259
inline void vmulosb( VectorRegister d, VectorRegister a, VectorRegister b);
2260
inline void vmuloub( VectorRegister d, VectorRegister a, VectorRegister b);
2261
inline void vmulosh( VectorRegister d, VectorRegister a, VectorRegister b);
2262
inline void vmulosw( VectorRegister d, VectorRegister a, VectorRegister b);
2263
inline void vmulouh( VectorRegister d, VectorRegister a, VectorRegister b);
2264
inline void vmuluwm( VectorRegister d, VectorRegister a, VectorRegister b);
2265
inline void vmhaddshs(VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);
2266
inline void vmhraddshs(VectorRegister d,VectorRegister a, VectorRegister b, VectorRegister c);
2267
inline void vmladduhm(VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);
2268
inline void vmsubuhm( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);
2269
inline void vmsummbm( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);
2270
inline void vmsumshm( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);
2271
inline void vmsumshs( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);
2272
inline void vmsumuhm( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);
2273
inline void vmsumuhs( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);
2274
inline void vmaddfp( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);
2275
inline void vsumsws( VectorRegister d, VectorRegister a, VectorRegister b);
2276
inline void vsum2sws( VectorRegister d, VectorRegister a, VectorRegister b);
2277
inline void vsum4sbs( VectorRegister d, VectorRegister a, VectorRegister b);
2278
inline void vsum4ubs( VectorRegister d, VectorRegister a, VectorRegister b);
2279
inline void vsum4shs( VectorRegister d, VectorRegister a, VectorRegister b);
2280
inline void vavgsb( VectorRegister d, VectorRegister a, VectorRegister b);
2281
inline void vavgsw( VectorRegister d, VectorRegister a, VectorRegister b);
2282
inline void vavgsh( VectorRegister d, VectorRegister a, VectorRegister b);
2283
inline void vavgub( VectorRegister d, VectorRegister a, VectorRegister b);
2284
inline void vavguw( VectorRegister d, VectorRegister a, VectorRegister b);
2285
inline void vavguh( VectorRegister d, VectorRegister a, VectorRegister b);
2286
inline void vmaxsb( VectorRegister d, VectorRegister a, VectorRegister b);
2287
inline void vmaxsw( VectorRegister d, VectorRegister a, VectorRegister b);
2288
inline void vmaxsh( VectorRegister d, VectorRegister a, VectorRegister b);
2289
inline void vmaxub( VectorRegister d, VectorRegister a, VectorRegister b);
2290
inline void vmaxuw( VectorRegister d, VectorRegister a, VectorRegister b);
2291
inline void vmaxuh( VectorRegister d, VectorRegister a, VectorRegister b);
2292
inline void vminsb( VectorRegister d, VectorRegister a, VectorRegister b);
2293
inline void vminsw( VectorRegister d, VectorRegister a, VectorRegister b);
2294
inline void vminsh( VectorRegister d, VectorRegister a, VectorRegister b);
2295
inline void vminub( VectorRegister d, VectorRegister a, VectorRegister b);
2296
inline void vminuw( VectorRegister d, VectorRegister a, VectorRegister b);
2297
inline void vminuh( VectorRegister d, VectorRegister a, VectorRegister b);
2298
inline void vcmpequb( VectorRegister d, VectorRegister a, VectorRegister b);
2299
inline void vcmpequh( VectorRegister d, VectorRegister a, VectorRegister b);
2300
inline void vcmpequw( VectorRegister d, VectorRegister a, VectorRegister b);
2301
inline void vcmpgtsh( VectorRegister d, VectorRegister a, VectorRegister b);
2302
inline void vcmpgtsb( VectorRegister d, VectorRegister a, VectorRegister b);
2303
inline void vcmpgtsw( VectorRegister d, VectorRegister a, VectorRegister b);
2304
inline void vcmpgtub( VectorRegister d, VectorRegister a, VectorRegister b);
2305
inline void vcmpgtuh( VectorRegister d, VectorRegister a, VectorRegister b);
2306
inline void vcmpgtuw( VectorRegister d, VectorRegister a, VectorRegister b);
2307
inline void vcmpequb_(VectorRegister d, VectorRegister a, VectorRegister b);
2308
inline void vcmpequh_(VectorRegister d, VectorRegister a, VectorRegister b);
2309
inline void vcmpequw_(VectorRegister d, VectorRegister a, VectorRegister b);
2310
inline void vcmpgtsh_(VectorRegister d, VectorRegister a, VectorRegister b);
2311
inline void vcmpgtsb_(VectorRegister d, VectorRegister a, VectorRegister b);
2312
inline void vcmpgtsw_(VectorRegister d, VectorRegister a, VectorRegister b);
2313
inline void vcmpgtub_(VectorRegister d, VectorRegister a, VectorRegister b);
2314
inline void vcmpgtuh_(VectorRegister d, VectorRegister a, VectorRegister b);
2315
inline void vcmpgtuw_(VectorRegister d, VectorRegister a, VectorRegister b);
2316
inline void vand( VectorRegister d, VectorRegister a, VectorRegister b);
2317
inline void vandc( VectorRegister d, VectorRegister a, VectorRegister b);
2318
inline void vnor( VectorRegister d, VectorRegister a, VectorRegister b);
2319
inline void vor( VectorRegister d, VectorRegister a, VectorRegister b);
2320
inline void vmr( VectorRegister d, VectorRegister a);
2321
inline void vxor( VectorRegister d, VectorRegister a, VectorRegister b);
2322
inline void vrld( VectorRegister d, VectorRegister a, VectorRegister b);
2323
inline void vrlb( VectorRegister d, VectorRegister a, VectorRegister b);
2324
inline void vrlw( VectorRegister d, VectorRegister a, VectorRegister b);
2325
inline void vrlh( VectorRegister d, VectorRegister a, VectorRegister b);
2326
inline void vslb( VectorRegister d, VectorRegister a, VectorRegister b);
2327
inline void vskw( VectorRegister d, VectorRegister a, VectorRegister b);
2328
inline void vslh( VectorRegister d, VectorRegister a, VectorRegister b);
2329
inline void vsrb( VectorRegister d, VectorRegister a, VectorRegister b);
2330
inline void vsrw( VectorRegister d, VectorRegister a, VectorRegister b);
2331
inline void vsrh( VectorRegister d, VectorRegister a, VectorRegister b);
2332
inline void vsrab( VectorRegister d, VectorRegister a, VectorRegister b);
2333
inline void vsraw( VectorRegister d, VectorRegister a, VectorRegister b);
2334
inline void vsrah( VectorRegister d, VectorRegister a, VectorRegister b);
2335
inline void vpopcntw( VectorRegister d, VectorRegister b);
2336
// Vector Floating-Point not implemented yet
2337
inline void mtvscr( VectorRegister b);
2338
inline void mfvscr( VectorRegister d);
2339
2340
// Vector-Scalar (VSX) instructions.
2341
inline void lxv( VectorSRegister d, int si16, Register a);
2342
inline void stxv( VectorSRegister d, int si16, Register a);
2343
inline void lxvl( VectorSRegister d, Register a, Register b);
2344
inline void stxvl( VectorSRegister d, Register a, Register b);
2345
inline void lxvd2x( VectorSRegister d, Register a);
2346
inline void lxvd2x( VectorSRegister d, Register a, Register b);
2347
inline void stxvd2x( VectorSRegister d, Register a);
2348
inline void stxvd2x( VectorSRegister d, Register a, Register b);
2349
inline void mtvrwz( VectorRegister d, Register a);
2350
inline void mfvrwz( Register a, VectorRegister d);
2351
inline void mtvrd( VectorRegister d, Register a);
2352
inline void mfvrd( Register a, VectorRegister d);
2353
inline void xxperm( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2354
inline void xxpermdi( VectorSRegister d, VectorSRegister a, VectorSRegister b, int dm);
2355
inline void xxmrghw( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2356
inline void xxmrglw( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2357
inline void mtvsrd( VectorSRegister d, Register a);
2358
inline void mfvsrd( Register d, VectorSRegister a);
2359
inline void mtvsrdd( VectorSRegister d, Register a, Register b);
2360
inline void mtvsrwz( VectorSRegister d, Register a);
2361
inline void mfvsrwz( Register d, VectorSRegister a);
2362
inline void xxspltw( VectorSRegister d, VectorSRegister b, int ui2);
2363
inline void xxlor( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2364
inline void xxlxor( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2365
inline void xxleqv( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2366
inline void xxbrd( VectorSRegister d, VectorSRegister b);
2367
inline void xxbrw( VectorSRegister d, VectorSRegister b);
2368
inline void xxland( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2369
inline void xxsel( VectorSRegister d, VectorSRegister a, VectorSRegister b, VectorSRegister c);
2370
inline void xxspltib( VectorSRegister d, int ui8);
2371
inline void xvdivsp( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2372
inline void xvdivdp( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2373
inline void xvabssp( VectorSRegister d, VectorSRegister b);
2374
inline void xvabsdp( VectorSRegister d, VectorSRegister b);
2375
inline void xvnegsp( VectorSRegister d, VectorSRegister b);
2376
inline void xvnegdp( VectorSRegister d, VectorSRegister b);
2377
inline void xvsqrtsp( VectorSRegister d, VectorSRegister b);
2378
inline void xvsqrtdp( VectorSRegister d, VectorSRegister b);
2379
inline void xscvdpspn(VectorSRegister d, VectorSRegister b);
2380
inline void xvadddp( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2381
inline void xvsubdp( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2382
inline void xvmulsp( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2383
inline void xvmuldp( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2384
inline void xvmaddasp(VectorSRegister d, VectorSRegister a, VectorSRegister b);
2385
inline void xvmaddadp(VectorSRegister d, VectorSRegister a, VectorSRegister b);
2386
inline void xvmsubasp(VectorSRegister d, VectorSRegister a, VectorSRegister b);
2387
inline void xvmsubadp(VectorSRegister d, VectorSRegister a, VectorSRegister b);
2388
inline void xvnmsubasp(VectorSRegister d, VectorSRegister a, VectorSRegister b);
2389
inline void xvnmsubadp(VectorSRegister d, VectorSRegister a, VectorSRegister b);
2390
inline void xvrdpi( VectorSRegister d, VectorSRegister b);
2391
inline void xvrdpic( VectorSRegister d, VectorSRegister b);
2392
inline void xvrdpim( VectorSRegister d, VectorSRegister b);
2393
inline void xvrdpip( VectorSRegister d, VectorSRegister b);
2394
2395
// VSX Extended Mnemonics
2396
inline void xxspltd( VectorSRegister d, VectorSRegister a, int x);
2397
inline void xxmrghd( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2398
inline void xxmrgld( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2399
inline void xxswapd( VectorSRegister d, VectorSRegister a);
2400
2401
// Vector-Scalar (VSX) instructions.
2402
inline void mtfprd( FloatRegister d, Register a);
2403
inline void mtfprwa( FloatRegister d, Register a);
2404
inline void mffprd( Register a, FloatRegister d);
2405
2406
// Deliver A Random Number (introduced with POWER9)
2407
inline void darn( Register d, int l = 1 /*L=CRN*/);
2408
2409
// AES (introduced with Power 8)
2410
inline void vcipher( VectorRegister d, VectorRegister a, VectorRegister b);
2411
inline void vcipherlast( VectorRegister d, VectorRegister a, VectorRegister b);
2412
inline void vncipher( VectorRegister d, VectorRegister a, VectorRegister b);
2413
inline void vncipherlast(VectorRegister d, VectorRegister a, VectorRegister b);
2414
inline void vsbox( VectorRegister d, VectorRegister a);
2415
2416
// SHA (introduced with Power 8)
2417
inline void vshasigmad(VectorRegister d, VectorRegister a, bool st, int six);
2418
inline void vshasigmaw(VectorRegister d, VectorRegister a, bool st, int six);
2419
2420
// Vector Binary Polynomial Multiplication (introduced with Power 8)
2421
inline void vpmsumb( VectorRegister d, VectorRegister a, VectorRegister b);
2422
inline void vpmsumd( VectorRegister d, VectorRegister a, VectorRegister b);
2423
inline void vpmsumh( VectorRegister d, VectorRegister a, VectorRegister b);
2424
inline void vpmsumw( VectorRegister d, VectorRegister a, VectorRegister b);
2425
2426
// Vector Permute and Xor (introduced with Power 8)
2427
inline void vpermxor( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);
2428
2429
// Transactional Memory instructions (introduced with Power 8)
2430
inline void tbegin_(); // R=0
2431
inline void tbeginrot_(); // R=1 Rollback-Only Transaction
2432
inline void tend_(); // A=0
2433
inline void tendall_(); // A=1
2434
inline void tabort_();
2435
inline void tabort_(Register a);
2436
inline void tabortwc_(int t, Register a, Register b);
2437
inline void tabortwci_(int t, Register a, int si);
2438
inline void tabortdc_(int t, Register a, Register b);
2439
inline void tabortdci_(int t, Register a, int si);
2440
inline void tsuspend_(); // tsr with L=0
2441
inline void tresume_(); // tsr with L=1
2442
inline void tcheck(int f);
2443
2444
static bool is_tbegin(int x) {
2445
return TBEGIN_OPCODE == (x & (0x3f << OPCODE_SHIFT | 0x3ff << 1));
2446
}
2447
2448
// The following encoders use r0 as second operand. These instructions
2449
// read r0 as '0'.
2450
inline void lwzx( Register d, Register s2);
2451
inline void lwz( Register d, int si16);
2452
inline void lwax( Register d, Register s2);
2453
inline void lwa( Register d, int si16);
2454
inline void lwbrx(Register d, Register s2);
2455
inline void lhzx( Register d, Register s2);
2456
inline void lhz( Register d, int si16);
2457
inline void lhax( Register d, Register s2);
2458
inline void lha( Register d, int si16);
2459
inline void lhbrx(Register d, Register s2);
2460
inline void lbzx( Register d, Register s2);
2461
inline void lbz( Register d, int si16);
2462
inline void ldx( Register d, Register s2);
2463
inline void ld( Register d, int si16);
2464
inline void ldbrx(Register d, Register s2);
2465
inline void stwx( Register d, Register s2);
2466
inline void stw( Register d, int si16);
2467
inline void stwbrx( Register d, Register s2);
2468
inline void sthx( Register d, Register s2);
2469
inline void sth( Register d, int si16);
2470
inline void sthbrx( Register d, Register s2);
2471
inline void stbx( Register d, Register s2);
2472
inline void stb( Register d, int si16);
2473
inline void stdx( Register d, Register s2);
2474
inline void std( Register d, int si16);
2475
inline void stdbrx( Register d, Register s2);
2476
2477
// PPC 2, section 3.2.1 Instruction Cache Instructions
2478
inline void icbi( Register s2);
2479
// PPC 2, section 3.2.2 Data Cache Instructions
2480
//inlinevoid dcba( Register s2); // Instruction for embedded processor only.
2481
inline void dcbz( Register s2);
2482
inline void dcbst( Register s2);
2483
inline void dcbf( Register s2);
2484
// dcache read hint
2485
inline void dcbt( Register s2);
2486
inline void dcbtct( Register s2, int ct);
2487
inline void dcbtds( Register s2, int ds);
2488
// dcache write hint
2489
inline void dcbtst( Register s2);
2490
inline void dcbtstct(Register s2, int ct);
2491
2492
// Atomics: use ra0mem to disallow R0 as base.
2493
inline void lbarx_unchecked(Register d, Register b, int eh1);
2494
inline void lharx_unchecked(Register d, Register b, int eh1);
2495
inline void lwarx_unchecked(Register d, Register b, int eh1);
2496
inline void ldarx_unchecked(Register d, Register b, int eh1);
2497
inline void lqarx_unchecked(Register d, Register b, int eh1);
2498
inline void lbarx( Register d, Register b, bool hint_exclusive_access);
2499
inline void lharx( Register d, Register b, bool hint_exclusive_access);
2500
inline void lwarx( Register d, Register b, bool hint_exclusive_access);
2501
inline void ldarx( Register d, Register b, bool hint_exclusive_access);
2502
inline void lqarx( Register d, Register b, bool hint_exclusive_access);
2503
inline void stbcx_(Register s, Register b);
2504
inline void sthcx_(Register s, Register b);
2505
inline void stwcx_(Register s, Register b);
2506
inline void stdcx_(Register s, Register b);
2507
inline void stqcx_(Register s, Register b);
2508
inline void lfs( FloatRegister d, int si16);
2509
inline void lfsx( FloatRegister d, Register b);
2510
inline void lfd( FloatRegister d, int si16);
2511
inline void lfdx( FloatRegister d, Register b);
2512
inline void stfs( FloatRegister s, int si16);
2513
inline void stfsx( FloatRegister s, Register b);
2514
inline void stfd( FloatRegister s, int si16);
2515
inline void stfdx( FloatRegister s, Register b);
2516
inline void lvebx( VectorRegister d, Register s2);
2517
inline void lvehx( VectorRegister d, Register s2);
2518
inline void lvewx( VectorRegister d, Register s2);
2519
inline void lvx( VectorRegister d, Register s2);
2520
inline void lvxl( VectorRegister d, Register s2);
2521
inline void stvebx(VectorRegister d, Register s2);
2522
inline void stvehx(VectorRegister d, Register s2);
2523
inline void stvewx(VectorRegister d, Register s2);
2524
inline void stvx( VectorRegister d, Register s2);
2525
inline void stvxl( VectorRegister d, Register s2);
2526
inline void lvsl( VectorRegister d, Register s2);
2527
inline void lvsr( VectorRegister d, Register s2);
2528
2529
// Endianess specific concatenation of 2 loaded vectors.
2530
inline void load_perm(VectorRegister perm, Register addr);
2531
inline void vec_perm(VectorRegister first_dest, VectorRegister second, VectorRegister perm);
2532
inline void vec_perm(VectorRegister dest, VectorRegister first, VectorRegister second, VectorRegister perm);
2533
2534
// RegisterOrConstant versions.
2535
// These emitters choose between the versions using two registers and
2536
// those with register and immediate, depending on the content of roc.
2537
// If the constant is not encodable as immediate, instructions to
2538
// load the constant are emitted beforehand. Store instructions need a
2539
// tmp reg if the constant is not encodable as immediate.
2540
// Size unpredictable.
2541
void ld( Register d, RegisterOrConstant roc, Register s1 = noreg);
2542
void lwa( Register d, RegisterOrConstant roc, Register s1 = noreg);
2543
void lwz( Register d, RegisterOrConstant roc, Register s1 = noreg);
2544
void lha( Register d, RegisterOrConstant roc, Register s1 = noreg);
2545
void lhz( Register d, RegisterOrConstant roc, Register s1 = noreg);
2546
void lbz( Register d, RegisterOrConstant roc, Register s1 = noreg);
2547
void std( Register d, RegisterOrConstant roc, Register s1 = noreg, Register tmp = noreg);
2548
void stw( Register d, RegisterOrConstant roc, Register s1 = noreg, Register tmp = noreg);
2549
void sth( Register d, RegisterOrConstant roc, Register s1 = noreg, Register tmp = noreg);
2550
void stb( Register d, RegisterOrConstant roc, Register s1 = noreg, Register tmp = noreg);
2551
void add( Register d, RegisterOrConstant roc, Register s1);
2552
void subf(Register d, RegisterOrConstant roc, Register s1);
2553
void cmpd(ConditionRegister d, RegisterOrConstant roc, Register s1);
2554
// Load pointer d from s1+roc.
2555
void ld_ptr(Register d, RegisterOrConstant roc, Register s1 = noreg) { ld(d, roc, s1); }
2556
2557
// Emit several instructions to load a 64 bit constant. This issues a fixed
2558
// instruction pattern so that the constant can be patched later on.
2559
enum {
2560
load_const_size = 5 * BytesPerInstWord
2561
};
2562
void load_const(Register d, long a, Register tmp = noreg);
2563
inline void load_const(Register d, void* a, Register tmp = noreg);
2564
inline void load_const(Register d, Label& L, Register tmp = noreg);
2565
inline void load_const(Register d, AddressLiteral& a, Register tmp = noreg);
2566
inline void load_const32(Register d, int i); // load signed int (patchable)
2567
2568
// Load a 64 bit constant, optimized, not identifyable.
2569
// Tmp can be used to increase ILP. Set return_simm16_rest = true to get a
2570
// 16 bit immediate offset. This is useful if the offset can be encoded in
2571
// a succeeding instruction.
2572
int load_const_optimized(Register d, long a, Register tmp = noreg, bool return_simm16_rest = false);
2573
inline int load_const_optimized(Register d, void* a, Register tmp = noreg, bool return_simm16_rest = false) {
2574
return load_const_optimized(d, (long)(unsigned long)a, tmp, return_simm16_rest);
2575
}
2576
2577
// If return_simm16_rest, the return value needs to get added afterwards.
2578
int add_const_optimized(Register d, Register s, long x, Register tmp = R0, bool return_simm16_rest = false);
2579
inline int add_const_optimized(Register d, Register s, void* a, Register tmp = R0, bool return_simm16_rest = false) {
2580
return add_const_optimized(d, s, (long)(unsigned long)a, tmp, return_simm16_rest);
2581
}
2582
2583
// If return_simm16_rest, the return value needs to get added afterwards.
2584
inline int sub_const_optimized(Register d, Register s, long x, Register tmp = R0, bool return_simm16_rest = false) {
2585
return add_const_optimized(d, s, -x, tmp, return_simm16_rest);
2586
}
2587
inline int sub_const_optimized(Register d, Register s, void* a, Register tmp = R0, bool return_simm16_rest = false) {
2588
return sub_const_optimized(d, s, (long)(unsigned long)a, tmp, return_simm16_rest);
2589
}
2590
2591
// Creation
2592
Assembler(CodeBuffer* code) : AbstractAssembler(code) {
2593
#ifdef CHECK_DELAY
2594
delay_state = no_delay;
2595
#endif
2596
}
2597
2598
// Testing
2599
#ifndef PRODUCT
2600
void test_asm();
2601
#endif
2602
};
2603
2604
2605
#endif // CPU_PPC_ASSEMBLER_PPC_HPP
2606
2607