Path: blob/master/src/hotspot/cpu/ppc/assembler_ppc.hpp
64440 views
/*1* Copyright (c) 2002, 2021, Oracle and/or its affiliates. All rights reserved.2* Copyright (c) 2012, 2021 SAP SE. All rights reserved.3* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.4*5* This code is free software; you can redistribute it and/or modify it6* under the terms of the GNU General Public License version 2 only, as7* published by the Free Software Foundation.8*9* This code is distributed in the hope that it will be useful, but WITHOUT10* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or11* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License12* version 2 for more details (a copy is included in the LICENSE file that13* accompanied this code).14*15* You should have received a copy of the GNU General Public License version16* 2 along with this work; if not, write to the Free Software Foundation,17* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.18*19* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA20* or visit www.oracle.com if you need additional information or have any21* questions.22*23*/2425#ifndef CPU_PPC_ASSEMBLER_PPC_HPP26#define CPU_PPC_ASSEMBLER_PPC_HPP2728#include "asm/assembler.hpp"29#include "asm/register.hpp"3031// Address is an abstraction used to represent a memory location32// as used in assembler instructions.33// PPC instructions grok either baseReg + indexReg or baseReg + disp.34class Address {35private:36Register _base; // Base register.37Register _index; // Index register.38intptr_t _disp; // Displacement.3940public:41Address(Register b, Register i, address d = 0)42: _base(b), _index(i), _disp((intptr_t)d) {43assert(i == noreg || d == 0, "can't have both");44}4546Address(Register b, address d = 0)47: _base(b), _index(noreg), _disp((intptr_t)d) {}4849Address(Register b, ByteSize d)50: _base(b), _index(noreg), _disp((intptr_t)d) {}5152Address(Register b, intptr_t d)53: _base(b), _index(noreg), _disp(d) {}5455Address(Register b, RegisterOrConstant roc)56: _base(b), _index(noreg), _disp(0) {57if (roc.is_constant()) _disp = roc.as_constant(); else _index = roc.as_register();58}5960Address()61: _base(noreg), _index(noreg), _disp(0) {}6263// accessors64Register base() const { return _base; }65Register index() const { return _index; }66int disp() const { return (int)_disp; }67bool is_const() const { return _base == noreg && _index == noreg; }68};6970class AddressLiteral {71private:72address _address;73RelocationHolder _rspec;7475RelocationHolder rspec_from_rtype(relocInfo::relocType rtype, address addr) {76switch (rtype) {77case relocInfo::external_word_type:78return external_word_Relocation::spec(addr);79case relocInfo::internal_word_type:80return internal_word_Relocation::spec(addr);81case relocInfo::opt_virtual_call_type:82return opt_virtual_call_Relocation::spec();83case relocInfo::static_call_type:84return static_call_Relocation::spec();85case relocInfo::runtime_call_type:86return runtime_call_Relocation::spec();87case relocInfo::none:88return RelocationHolder();89default:90ShouldNotReachHere();91return RelocationHolder();92}93}9495protected:96// creation97AddressLiteral() : _address(NULL), _rspec(NULL) {}9899public:100AddressLiteral(address addr, RelocationHolder const& rspec)101: _address(addr),102_rspec(rspec) {}103104AddressLiteral(address addr, relocInfo::relocType rtype = relocInfo::none)105: _address((address) addr),106_rspec(rspec_from_rtype(rtype, (address) addr)) {}107108AddressLiteral(oop* addr, relocInfo::relocType rtype = relocInfo::none)109: _address((address) addr),110_rspec(rspec_from_rtype(rtype, (address) addr)) {}111112intptr_t value() const { return (intptr_t) _address; }113114const RelocationHolder& rspec() const { return _rspec; }115};116117// Argument is an abstraction used to represent an outgoing118// actual argument or an incoming formal parameter, whether119// it resides in memory or in a register, in a manner consistent120// with the PPC Application Binary Interface, or ABI. This is121// often referred to as the native or C calling convention.122123class Argument {124private:125int _number; // The number of the argument.126public:127enum {128// Only 8 registers may contain integer parameters.129n_register_parameters = 8,130// Can have up to 8 floating registers.131n_float_register_parameters = 8,132133// PPC C calling conventions.134// The first eight arguments are passed in int regs if they are int.135n_int_register_parameters_c = 8,136// The first thirteen float arguments are passed in float regs.137n_float_register_parameters_c = 13,138// Only the first 8 parameters are not placed on the stack. Aix disassembly139// shows that xlC places all float args after argument 8 on the stack AND140// in a register. This is not documented, but we follow this convention, too.141n_regs_not_on_stack_c = 8,142};143// creation144Argument(int number) : _number(number) {}145146int number() const { return _number; }147148// Locating register-based arguments:149bool is_register() const { return _number < n_register_parameters; }150151Register as_register() const {152assert(is_register(), "must be a register argument");153return as_Register(number() + R3_ARG1->encoding());154}155};156157#if !defined(ABI_ELFv2)158// A ppc64 function descriptor.159struct FunctionDescriptor {160private:161address _entry;162address _toc;163address _env;164165public:166inline address entry() const { return _entry; }167inline address toc() const { return _toc; }168inline address env() const { return _env; }169170inline void set_entry(address entry) { _entry = entry; }171inline void set_toc( address toc) { _toc = toc; }172inline void set_env( address env) { _env = env; }173174inline static ByteSize entry_offset() { return byte_offset_of(FunctionDescriptor, _entry); }175inline static ByteSize toc_offset() { return byte_offset_of(FunctionDescriptor, _toc); }176inline static ByteSize env_offset() { return byte_offset_of(FunctionDescriptor, _env); }177178// Friend functions can be called without loading toc and env.179enum {180friend_toc = 0xcafe,181friend_env = 0xc0de182};183184inline bool is_friend_function() const {185return (toc() == (address) friend_toc) && (env() == (address) friend_env);186}187188// Constructor for stack-allocated instances.189FunctionDescriptor() {190_entry = (address) 0xbad;191_toc = (address) 0xbad;192_env = (address) 0xbad;193}194};195#endif196197198// The PPC Assembler: Pure assembler doing NO optimizations on the199// instruction level; i.e., what you write is what you get. The200// Assembler is generating code into a CodeBuffer.201202class Assembler : public AbstractAssembler {203protected:204// Displacement routines205static int patched_branch(int dest_pos, int inst, int inst_pos);206static int branch_destination(int inst, int pos);207208friend class AbstractAssembler;209210// Code patchers need various routines like inv_wdisp()211friend class NativeInstruction;212friend class NativeGeneralJump;213friend class Relocation;214215public:216217enum shifts {218XO_21_29_SHIFT = 2,219XO_21_30_SHIFT = 1,220XO_27_29_SHIFT = 2,221XO_30_31_SHIFT = 0,222SPR_5_9_SHIFT = 11u, // SPR_5_9 field in bits 11 -- 15223SPR_0_4_SHIFT = 16u, // SPR_0_4 field in bits 16 -- 20224RS_SHIFT = 21u, // RS field in bits 21 -- 25225OPCODE_SHIFT = 26u, // opcode in bits 26 -- 31226227// Shift counts in prefix word228PRE_TYPE_SHIFT = 24u, // Prefix type in bits 24 -- 25229PRE_ST1_SHIFT = 23u, // ST1 field in bits 23 -- 23230PRE_R_SHIFT = 20u, // R-bit in bits 20 -- 20231PRE_ST4_SHIFT = 20u, // ST4 field in bits 23 -- 20232};233234enum opcdxos_masks {235XL_FORM_OPCODE_MASK = (63u << OPCODE_SHIFT) | (1023u << 1),236ADDI_OPCODE_MASK = (63u << OPCODE_SHIFT),237ADDIS_OPCODE_MASK = (63u << OPCODE_SHIFT),238BXX_OPCODE_MASK = (63u << OPCODE_SHIFT),239BCXX_OPCODE_MASK = (63u << OPCODE_SHIFT),240// trap instructions241TDI_OPCODE_MASK = (63u << OPCODE_SHIFT),242TWI_OPCODE_MASK = (63u << OPCODE_SHIFT),243TD_OPCODE_MASK = (63u << OPCODE_SHIFT) | (1023u << 1),244TW_OPCODE_MASK = (63u << OPCODE_SHIFT) | (1023u << 1),245LD_OPCODE_MASK = (63u << OPCODE_SHIFT) | (3u << XO_30_31_SHIFT), // DS-FORM246STD_OPCODE_MASK = LD_OPCODE_MASK,247STDU_OPCODE_MASK = STD_OPCODE_MASK,248STDX_OPCODE_MASK = (63u << OPCODE_SHIFT) | (1023u << 1),249STDUX_OPCODE_MASK = STDX_OPCODE_MASK,250STW_OPCODE_MASK = (63u << OPCODE_SHIFT),251STWU_OPCODE_MASK = STW_OPCODE_MASK,252STWX_OPCODE_MASK = (63u << OPCODE_SHIFT) | (1023u << 1),253STWUX_OPCODE_MASK = STWX_OPCODE_MASK,254MTCTR_OPCODE_MASK = ~(31u << RS_SHIFT),255ORI_OPCODE_MASK = (63u << OPCODE_SHIFT),256ORIS_OPCODE_MASK = (63u << OPCODE_SHIFT),257RLDICR_OPCODE_MASK = (63u << OPCODE_SHIFT) | (7u << XO_27_29_SHIFT)258};259260enum opcdxos {261ADD_OPCODE = (31u << OPCODE_SHIFT | 266u << 1),262ADDC_OPCODE = (31u << OPCODE_SHIFT | 10u << 1),263ADDI_OPCODE = (14u << OPCODE_SHIFT),264ADDIS_OPCODE = (15u << OPCODE_SHIFT),265ADDIC__OPCODE = (13u << OPCODE_SHIFT),266ADDE_OPCODE = (31u << OPCODE_SHIFT | 138u << 1),267ADDME_OPCODE = (31u << OPCODE_SHIFT | 234u << 1),268ADDZE_OPCODE = (31u << OPCODE_SHIFT | 202u << 1),269SUBF_OPCODE = (31u << OPCODE_SHIFT | 40u << 1),270SUBFC_OPCODE = (31u << OPCODE_SHIFT | 8u << 1),271SUBFE_OPCODE = (31u << OPCODE_SHIFT | 136u << 1),272SUBFIC_OPCODE = (8u << OPCODE_SHIFT),273SUBFME_OPCODE = (31u << OPCODE_SHIFT | 232u << 1),274SUBFZE_OPCODE = (31u << OPCODE_SHIFT | 200u << 1),275DIVW_OPCODE = (31u << OPCODE_SHIFT | 491u << 1),276DIVWU_OPCODE = (31u << OPCODE_SHIFT | 459u << 1),277MULLW_OPCODE = (31u << OPCODE_SHIFT | 235u << 1),278MULHW_OPCODE = (31u << OPCODE_SHIFT | 75u << 1),279MULHWU_OPCODE = (31u << OPCODE_SHIFT | 11u << 1),280MULLI_OPCODE = (7u << OPCODE_SHIFT),281AND_OPCODE = (31u << OPCODE_SHIFT | 28u << 1),282ANDI_OPCODE = (28u << OPCODE_SHIFT),283ANDIS_OPCODE = (29u << OPCODE_SHIFT),284ANDC_OPCODE = (31u << OPCODE_SHIFT | 60u << 1),285ORC_OPCODE = (31u << OPCODE_SHIFT | 412u << 1),286OR_OPCODE = (31u << OPCODE_SHIFT | 444u << 1),287ORI_OPCODE = (24u << OPCODE_SHIFT),288ORIS_OPCODE = (25u << OPCODE_SHIFT),289XOR_OPCODE = (31u << OPCODE_SHIFT | 316u << 1),290XORI_OPCODE = (26u << OPCODE_SHIFT),291XORIS_OPCODE = (27u << OPCODE_SHIFT),292293NEG_OPCODE = (31u << OPCODE_SHIFT | 104u << 1),294295RLWINM_OPCODE = (21u << OPCODE_SHIFT),296CLRRWI_OPCODE = RLWINM_OPCODE,297CLRLWI_OPCODE = RLWINM_OPCODE,298299RLWIMI_OPCODE = (20u << OPCODE_SHIFT),300301SLW_OPCODE = (31u << OPCODE_SHIFT | 24u << 1),302SLWI_OPCODE = RLWINM_OPCODE,303SRW_OPCODE = (31u << OPCODE_SHIFT | 536u << 1),304SRWI_OPCODE = RLWINM_OPCODE,305SRAW_OPCODE = (31u << OPCODE_SHIFT | 792u << 1),306SRAWI_OPCODE = (31u << OPCODE_SHIFT | 824u << 1),307308CMP_OPCODE = (31u << OPCODE_SHIFT | 0u << 1),309CMPI_OPCODE = (11u << OPCODE_SHIFT),310CMPL_OPCODE = (31u << OPCODE_SHIFT | 32u << 1),311CMPLI_OPCODE = (10u << OPCODE_SHIFT),312CMPRB_OPCODE = (31u << OPCODE_SHIFT | 192u << 1),313CMPEQB_OPCODE = (31u << OPCODE_SHIFT | 224u << 1),314315ISEL_OPCODE = (31u << OPCODE_SHIFT | 15u << 1),316317// Special purpose registers318MTSPR_OPCODE = (31u << OPCODE_SHIFT | 467u << 1),319MFSPR_OPCODE = (31u << OPCODE_SHIFT | 339u << 1),320321MTXER_OPCODE = (MTSPR_OPCODE | 1 << SPR_0_4_SHIFT),322MFXER_OPCODE = (MFSPR_OPCODE | 1 << SPR_0_4_SHIFT),323324MTDSCR_OPCODE = (MTSPR_OPCODE | 3 << SPR_0_4_SHIFT),325MFDSCR_OPCODE = (MFSPR_OPCODE | 3 << SPR_0_4_SHIFT),326327MTLR_OPCODE = (MTSPR_OPCODE | 8 << SPR_0_4_SHIFT),328MFLR_OPCODE = (MFSPR_OPCODE | 8 << SPR_0_4_SHIFT),329330MTCTR_OPCODE = (MTSPR_OPCODE | 9 << SPR_0_4_SHIFT),331MFCTR_OPCODE = (MFSPR_OPCODE | 9 << SPR_0_4_SHIFT),332333// Attention: Higher and lower half are inserted in reversed order.334MTTFHAR_OPCODE = (MTSPR_OPCODE | 4 << SPR_5_9_SHIFT | 0 << SPR_0_4_SHIFT),335MFTFHAR_OPCODE = (MFSPR_OPCODE | 4 << SPR_5_9_SHIFT | 0 << SPR_0_4_SHIFT),336MTTFIAR_OPCODE = (MTSPR_OPCODE | 4 << SPR_5_9_SHIFT | 1 << SPR_0_4_SHIFT),337MFTFIAR_OPCODE = (MFSPR_OPCODE | 4 << SPR_5_9_SHIFT | 1 << SPR_0_4_SHIFT),338MTTEXASR_OPCODE = (MTSPR_OPCODE | 4 << SPR_5_9_SHIFT | 2 << SPR_0_4_SHIFT),339MFTEXASR_OPCODE = (MFSPR_OPCODE | 4 << SPR_5_9_SHIFT | 2 << SPR_0_4_SHIFT),340MTTEXASRU_OPCODE = (MTSPR_OPCODE | 4 << SPR_5_9_SHIFT | 3 << SPR_0_4_SHIFT),341MFTEXASRU_OPCODE = (MFSPR_OPCODE | 4 << SPR_5_9_SHIFT | 3 << SPR_0_4_SHIFT),342343MTVRSAVE_OPCODE = (MTSPR_OPCODE | 8 << SPR_5_9_SHIFT | 0 << SPR_0_4_SHIFT),344MFVRSAVE_OPCODE = (MFSPR_OPCODE | 8 << SPR_5_9_SHIFT | 0 << SPR_0_4_SHIFT),345346MFTB_OPCODE = (MFSPR_OPCODE | 8 << SPR_5_9_SHIFT | 12 << SPR_0_4_SHIFT),347348MTCRF_OPCODE = (31u << OPCODE_SHIFT | 144u << 1),349MFCR_OPCODE = (31u << OPCODE_SHIFT | 19u << 1),350MCRF_OPCODE = (19u << OPCODE_SHIFT | 0u << 1),351MCRXRX_OPCODE = (31u << OPCODE_SHIFT | 576u << 1),352SETB_OPCODE = (31u << OPCODE_SHIFT | 128u << 1),353354SETBC_OPCODE = (31u << OPCODE_SHIFT | 384u << 1),355SETNBC_OPCODE = (31u << OPCODE_SHIFT | 448u << 1),356357// condition register logic instructions358CRAND_OPCODE = (19u << OPCODE_SHIFT | 257u << 1),359CRNAND_OPCODE = (19u << OPCODE_SHIFT | 225u << 1),360CROR_OPCODE = (19u << OPCODE_SHIFT | 449u << 1),361CRXOR_OPCODE = (19u << OPCODE_SHIFT | 193u << 1),362CRNOR_OPCODE = (19u << OPCODE_SHIFT | 33u << 1),363CREQV_OPCODE = (19u << OPCODE_SHIFT | 289u << 1),364CRANDC_OPCODE = (19u << OPCODE_SHIFT | 129u << 1),365CRORC_OPCODE = (19u << OPCODE_SHIFT | 417u << 1),366367BCLR_OPCODE = (19u << OPCODE_SHIFT | 16u << 1),368BXX_OPCODE = (18u << OPCODE_SHIFT),369BCXX_OPCODE = (16u << OPCODE_SHIFT),370371// CTR-related opcodes372BCCTR_OPCODE = (19u << OPCODE_SHIFT | 528u << 1),373374LWZ_OPCODE = (32u << OPCODE_SHIFT),375LWZX_OPCODE = (31u << OPCODE_SHIFT | 23u << 1),376LWZU_OPCODE = (33u << OPCODE_SHIFT),377LWBRX_OPCODE = (31u << OPCODE_SHIFT | 534 << 1),378379LHA_OPCODE = (42u << OPCODE_SHIFT),380LHAX_OPCODE = (31u << OPCODE_SHIFT | 343u << 1),381LHAU_OPCODE = (43u << OPCODE_SHIFT),382383LHZ_OPCODE = (40u << OPCODE_SHIFT),384LHZX_OPCODE = (31u << OPCODE_SHIFT | 279u << 1),385LHZU_OPCODE = (41u << OPCODE_SHIFT),386LHBRX_OPCODE = (31u << OPCODE_SHIFT | 790 << 1),387388LBZ_OPCODE = (34u << OPCODE_SHIFT),389LBZX_OPCODE = (31u << OPCODE_SHIFT | 87u << 1),390LBZU_OPCODE = (35u << OPCODE_SHIFT),391392STW_OPCODE = (36u << OPCODE_SHIFT),393STWX_OPCODE = (31u << OPCODE_SHIFT | 151u << 1),394STWU_OPCODE = (37u << OPCODE_SHIFT),395STWUX_OPCODE = (31u << OPCODE_SHIFT | 183u << 1),396STWBRX_OPCODE = (31u << OPCODE_SHIFT | 662u << 1),397398STH_OPCODE = (44u << OPCODE_SHIFT),399STHX_OPCODE = (31u << OPCODE_SHIFT | 407u << 1),400STHU_OPCODE = (45u << OPCODE_SHIFT),401STHBRX_OPCODE = (31u << OPCODE_SHIFT | 918u << 1),402403STB_OPCODE = (38u << OPCODE_SHIFT),404STBX_OPCODE = (31u << OPCODE_SHIFT | 215u << 1),405STBU_OPCODE = (39u << OPCODE_SHIFT),406407EXTSB_OPCODE = (31u << OPCODE_SHIFT | 954u << 1),408EXTSH_OPCODE = (31u << OPCODE_SHIFT | 922u << 1),409EXTSW_OPCODE = (31u << OPCODE_SHIFT | 986u << 1), // X-FORM410411// 32 bit opcode encodings412413LWA_OPCODE = (58u << OPCODE_SHIFT | 2u << XO_30_31_SHIFT), // DS-FORM414LWAX_OPCODE = (31u << OPCODE_SHIFT | 341u << XO_21_30_SHIFT), // X-FORM415416CNTLZW_OPCODE = (31u << OPCODE_SHIFT | 26u << XO_21_30_SHIFT), // X-FORM417CNTTZW_OPCODE = (31u << OPCODE_SHIFT | 538u << XO_21_30_SHIFT), // X-FORM418419// 64 bit opcode encodings420421LD_OPCODE = (58u << OPCODE_SHIFT | 0u << XO_30_31_SHIFT), // DS-FORM422LDU_OPCODE = (58u << OPCODE_SHIFT | 1u << XO_30_31_SHIFT), // DS-FORM423LDX_OPCODE = (31u << OPCODE_SHIFT | 21u << XO_21_30_SHIFT), // X-FORM424LDBRX_OPCODE = (31u << OPCODE_SHIFT | 532u << 1), // X-FORM425426STD_OPCODE = (62u << OPCODE_SHIFT | 0u << XO_30_31_SHIFT), // DS-FORM427STDU_OPCODE = (62u << OPCODE_SHIFT | 1u << XO_30_31_SHIFT), // DS-FORM428STDUX_OPCODE = (31u << OPCODE_SHIFT | 181u << 1), // X-FORM429STDX_OPCODE = (31u << OPCODE_SHIFT | 149u << XO_21_30_SHIFT), // X-FORM430STDBRX_OPCODE = (31u << OPCODE_SHIFT | 660u << 1), // X-FORM431432RLDICR_OPCODE = (30u << OPCODE_SHIFT | 1u << XO_27_29_SHIFT), // MD-FORM433RLDICL_OPCODE = (30u << OPCODE_SHIFT | 0u << XO_27_29_SHIFT), // MD-FORM434RLDIC_OPCODE = (30u << OPCODE_SHIFT | 2u << XO_27_29_SHIFT), // MD-FORM435RLDIMI_OPCODE = (30u << OPCODE_SHIFT | 3u << XO_27_29_SHIFT), // MD-FORM436437SRADI_OPCODE = (31u << OPCODE_SHIFT | 413u << XO_21_29_SHIFT), // XS-FORM438439SLD_OPCODE = (31u << OPCODE_SHIFT | 27u << 1), // X-FORM440SRD_OPCODE = (31u << OPCODE_SHIFT | 539u << 1), // X-FORM441SRAD_OPCODE = (31u << OPCODE_SHIFT | 794u << 1), // X-FORM442443MULLD_OPCODE = (31u << OPCODE_SHIFT | 233u << 1), // XO-FORM444MULHD_OPCODE = (31u << OPCODE_SHIFT | 73u << 1), // XO-FORM445MULHDU_OPCODE = (31u << OPCODE_SHIFT | 9u << 1), // XO-FORM446DIVD_OPCODE = (31u << OPCODE_SHIFT | 489u << 1), // XO-FORM447448CNTLZD_OPCODE = (31u << OPCODE_SHIFT | 58u << XO_21_30_SHIFT), // X-FORM449CNTTZD_OPCODE = (31u << OPCODE_SHIFT | 570u << XO_21_30_SHIFT), // X-FORM450NAND_OPCODE = (31u << OPCODE_SHIFT | 476u << XO_21_30_SHIFT), // X-FORM451NOR_OPCODE = (31u << OPCODE_SHIFT | 124u << XO_21_30_SHIFT), // X-FORM452453// Byte reverse opcodes (introduced with Power10)454BRH_OPCODE = (31u << OPCODE_SHIFT | 219u << 1), // X-FORM455BRW_OPCODE = (31u << OPCODE_SHIFT | 155u << 1), // X-FORM456BRD_OPCODE = (31u << OPCODE_SHIFT | 187u << 1), // X-FORM457458// opcodes only used for floating arithmetic459FADD_OPCODE = (63u << OPCODE_SHIFT | 21u << 1),460FADDS_OPCODE = (59u << OPCODE_SHIFT | 21u << 1),461FCMPU_OPCODE = (63u << OPCODE_SHIFT | 00u << 1),462FDIV_OPCODE = (63u << OPCODE_SHIFT | 18u << 1),463FDIVS_OPCODE = (59u << OPCODE_SHIFT | 18u << 1),464FMR_OPCODE = (63u << OPCODE_SHIFT | 72u << 1),465FRIN_OPCODE = (63u << OPCODE_SHIFT | 392u << 1),466FRIP_OPCODE = (63u << OPCODE_SHIFT | 456u << 1),467FRIM_OPCODE = (63u << OPCODE_SHIFT | 488u << 1),468// These are special Power6 opcodes, reused for "lfdepx" and "stfdepx"469// on Power7. Do not use.470// MFFGPR_OPCODE = (31u << OPCODE_SHIFT | 607u << 1),471// MFTGPR_OPCODE = (31u << OPCODE_SHIFT | 735u << 1),472CMPB_OPCODE = (31u << OPCODE_SHIFT | 508 << 1),473POPCNTB_OPCODE = (31u << OPCODE_SHIFT | 122 << 1),474POPCNTW_OPCODE = (31u << OPCODE_SHIFT | 378 << 1),475POPCNTD_OPCODE = (31u << OPCODE_SHIFT | 506 << 1),476FABS_OPCODE = (63u << OPCODE_SHIFT | 264u << 1),477FNABS_OPCODE = (63u << OPCODE_SHIFT | 136u << 1),478FMUL_OPCODE = (63u << OPCODE_SHIFT | 25u << 1),479FMULS_OPCODE = (59u << OPCODE_SHIFT | 25u << 1),480FNEG_OPCODE = (63u << OPCODE_SHIFT | 40u << 1),481FSUB_OPCODE = (63u << OPCODE_SHIFT | 20u << 1),482FSUBS_OPCODE = (59u << OPCODE_SHIFT | 20u << 1),483484// PPC64-internal FPU conversion opcodes485FCFID_OPCODE = (63u << OPCODE_SHIFT | 846u << 1),486FCFIDS_OPCODE = (59u << OPCODE_SHIFT | 846u << 1),487FCTID_OPCODE = (63u << OPCODE_SHIFT | 814u << 1),488FCTIDZ_OPCODE = (63u << OPCODE_SHIFT | 815u << 1),489FCTIW_OPCODE = (63u << OPCODE_SHIFT | 14u << 1),490FCTIWZ_OPCODE = (63u << OPCODE_SHIFT | 15u << 1),491FRSP_OPCODE = (63u << OPCODE_SHIFT | 12u << 1),492493// Fused multiply-accumulate instructions.494FMADD_OPCODE = (63u << OPCODE_SHIFT | 29u << 1),495FMADDS_OPCODE = (59u << OPCODE_SHIFT | 29u << 1),496FMSUB_OPCODE = (63u << OPCODE_SHIFT | 28u << 1),497FMSUBS_OPCODE = (59u << OPCODE_SHIFT | 28u << 1),498FNMADD_OPCODE = (63u << OPCODE_SHIFT | 31u << 1),499FNMADDS_OPCODE = (59u << OPCODE_SHIFT | 31u << 1),500FNMSUB_OPCODE = (63u << OPCODE_SHIFT | 30u << 1),501FNMSUBS_OPCODE = (59u << OPCODE_SHIFT | 30u << 1),502503LFD_OPCODE = (50u << OPCODE_SHIFT | 00u << 1),504LFDU_OPCODE = (51u << OPCODE_SHIFT | 00u << 1),505LFDX_OPCODE = (31u << OPCODE_SHIFT | 599u << 1),506LFS_OPCODE = (48u << OPCODE_SHIFT | 00u << 1),507LFSU_OPCODE = (49u << OPCODE_SHIFT | 00u << 1),508LFSX_OPCODE = (31u << OPCODE_SHIFT | 535u << 1),509510STFD_OPCODE = (54u << OPCODE_SHIFT | 00u << 1),511STFDU_OPCODE = (55u << OPCODE_SHIFT | 00u << 1),512STFDX_OPCODE = (31u << OPCODE_SHIFT | 727u << 1),513STFS_OPCODE = (52u << OPCODE_SHIFT | 00u << 1),514STFSU_OPCODE = (53u << OPCODE_SHIFT | 00u << 1),515STFSX_OPCODE = (31u << OPCODE_SHIFT | 663u << 1),516517FSQRT_OPCODE = (63u << OPCODE_SHIFT | 22u << 1), // A-FORM518FSQRTS_OPCODE = (59u << OPCODE_SHIFT | 22u << 1), // A-FORM519520// Vector instruction support for >= Power6521// Vector Storage Access522LVEBX_OPCODE = (31u << OPCODE_SHIFT | 7u << 1),523LVEHX_OPCODE = (31u << OPCODE_SHIFT | 39u << 1),524LVEWX_OPCODE = (31u << OPCODE_SHIFT | 71u << 1),525LVX_OPCODE = (31u << OPCODE_SHIFT | 103u << 1),526LVXL_OPCODE = (31u << OPCODE_SHIFT | 359u << 1),527STVEBX_OPCODE = (31u << OPCODE_SHIFT | 135u << 1),528STVEHX_OPCODE = (31u << OPCODE_SHIFT | 167u << 1),529STVEWX_OPCODE = (31u << OPCODE_SHIFT | 199u << 1),530STVX_OPCODE = (31u << OPCODE_SHIFT | 231u << 1),531STVXL_OPCODE = (31u << OPCODE_SHIFT | 487u << 1),532LVSL_OPCODE = (31u << OPCODE_SHIFT | 6u << 1),533LVSR_OPCODE = (31u << OPCODE_SHIFT | 38u << 1),534535// Vector-Scalar (VSX) instruction support.536LXV_OPCODE = (61u << OPCODE_SHIFT | 1u ),537LXVL_OPCODE = (31u << OPCODE_SHIFT | 269u << 1),538STXV_OPCODE = (61u << OPCODE_SHIFT | 5u ),539STXVL_OPCODE = (31u << OPCODE_SHIFT | 397u << 1),540LXVD2X_OPCODE = (31u << OPCODE_SHIFT | 844u << 1),541STXVD2X_OPCODE = (31u << OPCODE_SHIFT | 972u << 1),542MTVSRD_OPCODE = (31u << OPCODE_SHIFT | 179u << 1),543MTVSRDD_OPCODE = (31u << OPCODE_SHIFT | 435u << 1),544MTVSRWZ_OPCODE = (31u << OPCODE_SHIFT | 243u << 1),545MFVSRD_OPCODE = (31u << OPCODE_SHIFT | 51u << 1),546MTVSRWA_OPCODE = (31u << OPCODE_SHIFT | 211u << 1),547MFVSRWZ_OPCODE = (31u << OPCODE_SHIFT | 115u << 1),548XXPERMDI_OPCODE= (60u << OPCODE_SHIFT | 10u << 3),549XXMRGHW_OPCODE = (60u << OPCODE_SHIFT | 18u << 3),550XXMRGLW_OPCODE = (60u << OPCODE_SHIFT | 50u << 3),551XXSPLTW_OPCODE = (60u << OPCODE_SHIFT | 164u << 2),552XXLAND_OPCODE = (60u << OPCODE_SHIFT | 130u << 3),553XXLOR_OPCODE = (60u << OPCODE_SHIFT | 146u << 3),554XXLXOR_OPCODE = (60u << OPCODE_SHIFT | 154u << 3),555XXLEQV_OPCODE = (60u << OPCODE_SHIFT | 186u << 3),556XVDIVSP_OPCODE = (60u << OPCODE_SHIFT | 88u << 3),557XXBRD_OPCODE = (60u << OPCODE_SHIFT | 475u << 2 | 23u << 16), // XX2-FORM558XXBRW_OPCODE = (60u << OPCODE_SHIFT | 475u << 2 | 15u << 16), // XX2-FORM559XXPERM_OPCODE = (60u << OPCODE_SHIFT | 26u << 3),560XXSEL_OPCODE = (60u << OPCODE_SHIFT | 3u << 4),561XXSPLTIB_OPCODE= (60u << OPCODE_SHIFT | 360u << 1),562XVDIVDP_OPCODE = (60u << OPCODE_SHIFT | 120u << 3),563XVABSSP_OPCODE = (60u << OPCODE_SHIFT | 409u << 2),564XVABSDP_OPCODE = (60u << OPCODE_SHIFT | 473u << 2),565XVNEGSP_OPCODE = (60u << OPCODE_SHIFT | 441u << 2),566XVNEGDP_OPCODE = (60u << OPCODE_SHIFT | 505u << 2),567XVSQRTSP_OPCODE= (60u << OPCODE_SHIFT | 139u << 2),568XVSQRTDP_OPCODE= (60u << OPCODE_SHIFT | 203u << 2),569XSCVDPSPN_OPCODE=(60u << OPCODE_SHIFT | 267u << 2),570XVADDDP_OPCODE = (60u << OPCODE_SHIFT | 96u << 3),571XVSUBDP_OPCODE = (60u << OPCODE_SHIFT | 104u << 3),572XVMULSP_OPCODE = (60u << OPCODE_SHIFT | 80u << 3),573XVMULDP_OPCODE = (60u << OPCODE_SHIFT | 112u << 3),574XVMADDASP_OPCODE=(60u << OPCODE_SHIFT | 65u << 3),575XVMADDADP_OPCODE=(60u << OPCODE_SHIFT | 97u << 3),576XVMSUBASP_OPCODE=(60u << OPCODE_SHIFT | 81u << 3),577XVMSUBADP_OPCODE=(60u << OPCODE_SHIFT | 113u << 3),578XVNMSUBASP_OPCODE=(60u<< OPCODE_SHIFT | 209u << 3),579XVNMSUBADP_OPCODE=(60u<< OPCODE_SHIFT | 241u << 3),580XVRDPI_OPCODE = (60u << OPCODE_SHIFT | 201u << 2),581XVRDPIC_OPCODE = (60u << OPCODE_SHIFT | 235u << 2),582XVRDPIM_OPCODE = (60u << OPCODE_SHIFT | 249u << 2),583XVRDPIP_OPCODE = (60u << OPCODE_SHIFT | 233u << 2),584585// Deliver A Random Number (introduced with POWER9)586DARN_OPCODE = (31u << OPCODE_SHIFT | 755u << 1),587588// Vector Permute and Formatting589VPKPX_OPCODE = (4u << OPCODE_SHIFT | 782u ),590VPKSHSS_OPCODE = (4u << OPCODE_SHIFT | 398u ),591VPKSWSS_OPCODE = (4u << OPCODE_SHIFT | 462u ),592VPKSHUS_OPCODE = (4u << OPCODE_SHIFT | 270u ),593VPKSWUS_OPCODE = (4u << OPCODE_SHIFT | 334u ),594VPKUHUM_OPCODE = (4u << OPCODE_SHIFT | 14u ),595VPKUWUM_OPCODE = (4u << OPCODE_SHIFT | 78u ),596VPKUHUS_OPCODE = (4u << OPCODE_SHIFT | 142u ),597VPKUWUS_OPCODE = (4u << OPCODE_SHIFT | 206u ),598VUPKHPX_OPCODE = (4u << OPCODE_SHIFT | 846u ),599VUPKHSB_OPCODE = (4u << OPCODE_SHIFT | 526u ),600VUPKHSH_OPCODE = (4u << OPCODE_SHIFT | 590u ),601VUPKLPX_OPCODE = (4u << OPCODE_SHIFT | 974u ),602VUPKLSB_OPCODE = (4u << OPCODE_SHIFT | 654u ),603VUPKLSH_OPCODE = (4u << OPCODE_SHIFT | 718u ),604605VMRGHB_OPCODE = (4u << OPCODE_SHIFT | 12u ),606VMRGHW_OPCODE = (4u << OPCODE_SHIFT | 140u ),607VMRGHH_OPCODE = (4u << OPCODE_SHIFT | 76u ),608VMRGLB_OPCODE = (4u << OPCODE_SHIFT | 268u ),609VMRGLW_OPCODE = (4u << OPCODE_SHIFT | 396u ),610VMRGLH_OPCODE = (4u << OPCODE_SHIFT | 332u ),611612VSPLT_OPCODE = (4u << OPCODE_SHIFT | 524u ),613VSPLTH_OPCODE = (4u << OPCODE_SHIFT | 588u ),614VSPLTW_OPCODE = (4u << OPCODE_SHIFT | 652u ),615VSPLTISB_OPCODE= (4u << OPCODE_SHIFT | 780u ),616VSPLTISH_OPCODE= (4u << OPCODE_SHIFT | 844u ),617VSPLTISW_OPCODE= (4u << OPCODE_SHIFT | 908u ),618619VPEXTD_OPCODE = (4u << OPCODE_SHIFT | 1421u ),620VPERM_OPCODE = (4u << OPCODE_SHIFT | 43u ),621VSEL_OPCODE = (4u << OPCODE_SHIFT | 42u ),622623VSL_OPCODE = (4u << OPCODE_SHIFT | 452u ),624VSLDOI_OPCODE = (4u << OPCODE_SHIFT | 44u ),625VSLO_OPCODE = (4u << OPCODE_SHIFT | 1036u ),626VSR_OPCODE = (4u << OPCODE_SHIFT | 708u ),627VSRO_OPCODE = (4u << OPCODE_SHIFT | 1100u ),628629// Vector Integer630VADDCUW_OPCODE = (4u << OPCODE_SHIFT | 384u ),631VADDSHS_OPCODE = (4u << OPCODE_SHIFT | 832u ),632VADDSBS_OPCODE = (4u << OPCODE_SHIFT | 768u ),633VADDSWS_OPCODE = (4u << OPCODE_SHIFT | 896u ),634VADDUBM_OPCODE = (4u << OPCODE_SHIFT | 0u ),635VADDUWM_OPCODE = (4u << OPCODE_SHIFT | 128u ),636VADDUHM_OPCODE = (4u << OPCODE_SHIFT | 64u ),637VADDUDM_OPCODE = (4u << OPCODE_SHIFT | 192u ),638VADDUBS_OPCODE = (4u << OPCODE_SHIFT | 512u ),639VADDUWS_OPCODE = (4u << OPCODE_SHIFT | 640u ),640VADDUHS_OPCODE = (4u << OPCODE_SHIFT | 576u ),641VADDFP_OPCODE = (4u << OPCODE_SHIFT | 10u ),642VSUBCUW_OPCODE = (4u << OPCODE_SHIFT | 1408u ),643VSUBSHS_OPCODE = (4u << OPCODE_SHIFT | 1856u ),644VSUBSBS_OPCODE = (4u << OPCODE_SHIFT | 1792u ),645VSUBSWS_OPCODE = (4u << OPCODE_SHIFT | 1920u ),646VSUBUBM_OPCODE = (4u << OPCODE_SHIFT | 1024u ),647VSUBUWM_OPCODE = (4u << OPCODE_SHIFT | 1152u ),648VSUBUHM_OPCODE = (4u << OPCODE_SHIFT | 1088u ),649VSUBUDM_OPCODE = (4u << OPCODE_SHIFT | 1216u ),650VSUBUBS_OPCODE = (4u << OPCODE_SHIFT | 1536u ),651VSUBUWS_OPCODE = (4u << OPCODE_SHIFT | 1664u ),652VSUBUHS_OPCODE = (4u << OPCODE_SHIFT | 1600u ),653VSUBFP_OPCODE = (4u << OPCODE_SHIFT | 74u ),654655VMULESB_OPCODE = (4u << OPCODE_SHIFT | 776u ),656VMULEUB_OPCODE = (4u << OPCODE_SHIFT | 520u ),657VMULESH_OPCODE = (4u << OPCODE_SHIFT | 840u ),658VMULEUH_OPCODE = (4u << OPCODE_SHIFT | 584u ),659VMULOSB_OPCODE = (4u << OPCODE_SHIFT | 264u ),660VMULOUB_OPCODE = (4u << OPCODE_SHIFT | 8u ),661VMULOSH_OPCODE = (4u << OPCODE_SHIFT | 328u ),662VMULOSW_OPCODE = (4u << OPCODE_SHIFT | 392u ),663VMULOUH_OPCODE = (4u << OPCODE_SHIFT | 72u ),664VMULUWM_OPCODE = (4u << OPCODE_SHIFT | 137u ),665VMHADDSHS_OPCODE=(4u << OPCODE_SHIFT | 32u ),666VMHRADDSHS_OPCODE=(4u << OPCODE_SHIFT | 33u ),667VMLADDUHM_OPCODE=(4u << OPCODE_SHIFT | 34u ),668VMSUBUHM_OPCODE= (4u << OPCODE_SHIFT | 36u ),669VMSUMMBM_OPCODE= (4u << OPCODE_SHIFT | 37u ),670VMSUMSHM_OPCODE= (4u << OPCODE_SHIFT | 40u ),671VMSUMSHS_OPCODE= (4u << OPCODE_SHIFT | 41u ),672VMSUMUHM_OPCODE= (4u << OPCODE_SHIFT | 38u ),673VMSUMUHS_OPCODE= (4u << OPCODE_SHIFT | 39u ),674VMADDFP_OPCODE = (4u << OPCODE_SHIFT | 46u ),675676VSUMSWS_OPCODE = (4u << OPCODE_SHIFT | 1928u ),677VSUM2SWS_OPCODE= (4u << OPCODE_SHIFT | 1672u ),678VSUM4SBS_OPCODE= (4u << OPCODE_SHIFT | 1800u ),679VSUM4UBS_OPCODE= (4u << OPCODE_SHIFT | 1544u ),680VSUM4SHS_OPCODE= (4u << OPCODE_SHIFT | 1608u ),681682VAVGSB_OPCODE = (4u << OPCODE_SHIFT | 1282u ),683VAVGSW_OPCODE = (4u << OPCODE_SHIFT | 1410u ),684VAVGSH_OPCODE = (4u << OPCODE_SHIFT | 1346u ),685VAVGUB_OPCODE = (4u << OPCODE_SHIFT | 1026u ),686VAVGUW_OPCODE = (4u << OPCODE_SHIFT | 1154u ),687VAVGUH_OPCODE = (4u << OPCODE_SHIFT | 1090u ),688689VMAXSB_OPCODE = (4u << OPCODE_SHIFT | 258u ),690VMAXSW_OPCODE = (4u << OPCODE_SHIFT | 386u ),691VMAXSH_OPCODE = (4u << OPCODE_SHIFT | 322u ),692VMAXUB_OPCODE = (4u << OPCODE_SHIFT | 2u ),693VMAXUW_OPCODE = (4u << OPCODE_SHIFT | 130u ),694VMAXUH_OPCODE = (4u << OPCODE_SHIFT | 66u ),695VMINSB_OPCODE = (4u << OPCODE_SHIFT | 770u ),696VMINSW_OPCODE = (4u << OPCODE_SHIFT | 898u ),697VMINSH_OPCODE = (4u << OPCODE_SHIFT | 834u ),698VMINUB_OPCODE = (4u << OPCODE_SHIFT | 514u ),699VMINUW_OPCODE = (4u << OPCODE_SHIFT | 642u ),700VMINUH_OPCODE = (4u << OPCODE_SHIFT | 578u ),701702VCMPEQUB_OPCODE= (4u << OPCODE_SHIFT | 6u ),703VCMPEQUH_OPCODE= (4u << OPCODE_SHIFT | 70u ),704VCMPEQUW_OPCODE= (4u << OPCODE_SHIFT | 134u ),705VCMPGTSH_OPCODE= (4u << OPCODE_SHIFT | 838u ),706VCMPGTSB_OPCODE= (4u << OPCODE_SHIFT | 774u ),707VCMPGTSW_OPCODE= (4u << OPCODE_SHIFT | 902u ),708VCMPGTUB_OPCODE= (4u << OPCODE_SHIFT | 518u ),709VCMPGTUH_OPCODE= (4u << OPCODE_SHIFT | 582u ),710VCMPGTUW_OPCODE= (4u << OPCODE_SHIFT | 646u ),711712VAND_OPCODE = (4u << OPCODE_SHIFT | 1028u ),713VANDC_OPCODE = (4u << OPCODE_SHIFT | 1092u ),714VNOR_OPCODE = (4u << OPCODE_SHIFT | 1284u ),715VOR_OPCODE = (4u << OPCODE_SHIFT | 1156u ),716VXOR_OPCODE = (4u << OPCODE_SHIFT | 1220u ),717VRLD_OPCODE = (4u << OPCODE_SHIFT | 196u ),718VRLB_OPCODE = (4u << OPCODE_SHIFT | 4u ),719VRLW_OPCODE = (4u << OPCODE_SHIFT | 132u ),720VRLH_OPCODE = (4u << OPCODE_SHIFT | 68u ),721VSLB_OPCODE = (4u << OPCODE_SHIFT | 260u ),722VSKW_OPCODE = (4u << OPCODE_SHIFT | 388u ),723VSLH_OPCODE = (4u << OPCODE_SHIFT | 324u ),724VSRB_OPCODE = (4u << OPCODE_SHIFT | 516u ),725VSRW_OPCODE = (4u << OPCODE_SHIFT | 644u ),726VSRH_OPCODE = (4u << OPCODE_SHIFT | 580u ),727VSRAB_OPCODE = (4u << OPCODE_SHIFT | 772u ),728VSRAW_OPCODE = (4u << OPCODE_SHIFT | 900u ),729VSRAH_OPCODE = (4u << OPCODE_SHIFT | 836u ),730VPOPCNTW_OPCODE= (4u << OPCODE_SHIFT | 1923u ),731732// Vector Floating-Point733// not implemented yet734735// Vector Status and Control736MTVSCR_OPCODE = (4u << OPCODE_SHIFT | 1604u ),737MFVSCR_OPCODE = (4u << OPCODE_SHIFT | 1540u ),738739// AES (introduced with Power 8)740VCIPHER_OPCODE = (4u << OPCODE_SHIFT | 1288u),741VCIPHERLAST_OPCODE = (4u << OPCODE_SHIFT | 1289u),742VNCIPHER_OPCODE = (4u << OPCODE_SHIFT | 1352u),743VNCIPHERLAST_OPCODE = (4u << OPCODE_SHIFT | 1353u),744VSBOX_OPCODE = (4u << OPCODE_SHIFT | 1480u),745746// SHA (introduced with Power 8)747VSHASIGMAD_OPCODE = (4u << OPCODE_SHIFT | 1730u),748VSHASIGMAW_OPCODE = (4u << OPCODE_SHIFT | 1666u),749750// Vector Binary Polynomial Multiplication (introduced with Power 8)751VPMSUMB_OPCODE = (4u << OPCODE_SHIFT | 1032u),752VPMSUMD_OPCODE = (4u << OPCODE_SHIFT | 1224u),753VPMSUMH_OPCODE = (4u << OPCODE_SHIFT | 1096u),754VPMSUMW_OPCODE = (4u << OPCODE_SHIFT | 1160u),755756// Vector Permute and Xor (introduced with Power 8)757VPERMXOR_OPCODE = (4u << OPCODE_SHIFT | 45u),758759// Transactional Memory instructions (introduced with Power 8)760TBEGIN_OPCODE = (31u << OPCODE_SHIFT | 654u << 1),761TEND_OPCODE = (31u << OPCODE_SHIFT | 686u << 1),762TABORT_OPCODE = (31u << OPCODE_SHIFT | 910u << 1),763TABORTWC_OPCODE = (31u << OPCODE_SHIFT | 782u << 1),764TABORTWCI_OPCODE = (31u << OPCODE_SHIFT | 846u << 1),765TABORTDC_OPCODE = (31u << OPCODE_SHIFT | 814u << 1),766TABORTDCI_OPCODE = (31u << OPCODE_SHIFT | 878u << 1),767TSR_OPCODE = (31u << OPCODE_SHIFT | 750u << 1),768TCHECK_OPCODE = (31u << OPCODE_SHIFT | 718u << 1),769770// Icache and dcache related instructions771DCBA_OPCODE = (31u << OPCODE_SHIFT | 758u << 1),772DCBZ_OPCODE = (31u << OPCODE_SHIFT | 1014u << 1),773DCBST_OPCODE = (31u << OPCODE_SHIFT | 54u << 1),774DCBF_OPCODE = (31u << OPCODE_SHIFT | 86u << 1),775776DCBT_OPCODE = (31u << OPCODE_SHIFT | 278u << 1),777DCBTST_OPCODE = (31u << OPCODE_SHIFT | 246u << 1),778ICBI_OPCODE = (31u << OPCODE_SHIFT | 982u << 1),779780// Instruction synchronization781ISYNC_OPCODE = (19u << OPCODE_SHIFT | 150u << 1),782// Memory barriers783SYNC_OPCODE = (31u << OPCODE_SHIFT | 598u << 1),784EIEIO_OPCODE = (31u << OPCODE_SHIFT | 854u << 1),785786// Wait instructions for polling.787WAIT_OPCODE = (31u << OPCODE_SHIFT | 62u << 1),788789// Trap instructions790TDI_OPCODE = (2u << OPCODE_SHIFT),791TWI_OPCODE = (3u << OPCODE_SHIFT),792TD_OPCODE = (31u << OPCODE_SHIFT | 68u << 1),793TW_OPCODE = (31u << OPCODE_SHIFT | 4u << 1),794795// Atomics.796LBARX_OPCODE = (31u << OPCODE_SHIFT | 52u << 1),797LHARX_OPCODE = (31u << OPCODE_SHIFT | 116u << 1),798LWARX_OPCODE = (31u << OPCODE_SHIFT | 20u << 1),799LDARX_OPCODE = (31u << OPCODE_SHIFT | 84u << 1),800LQARX_OPCODE = (31u << OPCODE_SHIFT | 276u << 1),801STBCX_OPCODE = (31u << OPCODE_SHIFT | 694u << 1),802STHCX_OPCODE = (31u << OPCODE_SHIFT | 726u << 1),803STWCX_OPCODE = (31u << OPCODE_SHIFT | 150u << 1),804STDCX_OPCODE = (31u << OPCODE_SHIFT | 214u << 1),805STQCX_OPCODE = (31u << OPCODE_SHIFT | 182u << 1)806807};808809enum opcdeos_mask {810// Mask for prefix primary opcode field811PREFIX_OPCODE_MASK = (63u << OPCODE_SHIFT),812// Mask for prefix opcode and type fields813PREFIX_OPCODE_TYPE_MASK = (63u << OPCODE_SHIFT) | (3u << PRE_TYPE_SHIFT),814// Masks for type 00/10 and type 01/11, including opcode, type, and st fieds815PREFIX_OPCODE_TYPEx0_MASK = PREFIX_OPCODE_TYPE_MASK | ( 1u << PRE_ST1_SHIFT),816PREFIX_OPCODE_TYPEx1_MASK = PREFIX_OPCODE_TYPE_MASK | (15u << PRE_ST4_SHIFT),817818// Masks for each instructions819PADDI_PREFIX_OPCODE_MASK = PREFIX_OPCODE_TYPEx0_MASK,820PADDI_SUFFIX_OPCODE_MASK = ADDI_OPCODE_MASK,821};822823enum opcdeos {824PREFIX_PRIMARY_OPCODE = (1u << OPCODE_SHIFT),825826// Prefixed addi/li827PADDI_PREFIX_OPCODE = PREFIX_PRIMARY_OPCODE | (2u << PRE_TYPE_SHIFT),828PADDI_SUFFIX_OPCODE = ADDI_OPCODE,829};830831// Trap instructions TO bits832enum trap_to_bits {833// single bits834traptoLessThanSigned = 1 << 4, // 0, left end835traptoGreaterThanSigned = 1 << 3,836traptoEqual = 1 << 2,837traptoLessThanUnsigned = 1 << 1,838traptoGreaterThanUnsigned = 1 << 0, // 4, right end839840// compound ones841traptoUnconditional = (traptoLessThanSigned |842traptoGreaterThanSigned |843traptoEqual |844traptoLessThanUnsigned |845traptoGreaterThanUnsigned)846};847848// Branch hints BH field849enum branch_hint_bh {850// bclr cases:851bhintbhBCLRisReturn = 0,852bhintbhBCLRisNotReturnButSame = 1,853bhintbhBCLRisNotPredictable = 3,854855// bcctr cases:856bhintbhBCCTRisNotReturnButSame = 0,857bhintbhBCCTRisNotPredictable = 3858};859860// Branch prediction hints AT field861enum branch_hint_at {862bhintatNoHint = 0, // at=00863bhintatIsNotTaken = 2, // at=10864bhintatIsTaken = 3 // at=11865};866867// Branch prediction hints868enum branch_hint_concept {869// Use the same encoding as branch_hint_at to simply code.870bhintNoHint = bhintatNoHint,871bhintIsNotTaken = bhintatIsNotTaken,872bhintIsTaken = bhintatIsTaken873};874875// Used in BO field of branch instruction.876enum branch_condition {877bcondCRbiIs0 = 4, // bo=001at878bcondCRbiIs1 = 12, // bo=011at879bcondAlways = 20 // bo=10100880};881882// Branch condition with combined prediction hints.883enum branch_condition_with_hint {884bcondCRbiIs0_bhintNoHint = bcondCRbiIs0 | bhintatNoHint,885bcondCRbiIs0_bhintIsNotTaken = bcondCRbiIs0 | bhintatIsNotTaken,886bcondCRbiIs0_bhintIsTaken = bcondCRbiIs0 | bhintatIsTaken,887bcondCRbiIs1_bhintNoHint = bcondCRbiIs1 | bhintatNoHint,888bcondCRbiIs1_bhintIsNotTaken = bcondCRbiIs1 | bhintatIsNotTaken,889bcondCRbiIs1_bhintIsTaken = bcondCRbiIs1 | bhintatIsTaken,890};891892// Elemental Memory Barriers (>=Power 8)893enum Elemental_Membar_mask_bits {894StoreStore = 1 << 0,895StoreLoad = 1 << 1,896LoadStore = 1 << 2,897LoadLoad = 1 << 3898};899900// Branch prediction hints.901inline static int add_bhint_to_boint(const int bhint, const int boint) {902switch (boint) {903case bcondCRbiIs0:904case bcondCRbiIs1:905// branch_hint and branch_hint_at have same encodings906assert( (int)bhintNoHint == (int)bhintatNoHint907&& (int)bhintIsNotTaken == (int)bhintatIsNotTaken908&& (int)bhintIsTaken == (int)bhintatIsTaken,909"wrong encodings");910assert((bhint & 0x03) == bhint, "wrong encodings");911return (boint & ~0x03) | bhint;912case bcondAlways:913// no branch_hint914return boint;915default:916ShouldNotReachHere();917return 0;918}919}920921// Extract bcond from boint.922inline static int inv_boint_bcond(const int boint) {923int r_bcond = boint & ~0x03;924assert(r_bcond == bcondCRbiIs0 ||925r_bcond == bcondCRbiIs1 ||926r_bcond == bcondAlways,927"bad branch condition");928return r_bcond;929}930931// Extract bhint from boint.932inline static int inv_boint_bhint(const int boint) {933int r_bhint = boint & 0x03;934assert(r_bhint == bhintatNoHint ||935r_bhint == bhintatIsNotTaken ||936r_bhint == bhintatIsTaken,937"bad branch hint");938return r_bhint;939}940941// Calculate opposite of given bcond.942inline static int opposite_bcond(const int bcond) {943switch (bcond) {944case bcondCRbiIs0:945return bcondCRbiIs1;946case bcondCRbiIs1:947return bcondCRbiIs0;948default:949ShouldNotReachHere();950return 0;951}952}953954// Calculate opposite of given bhint.955inline static int opposite_bhint(const int bhint) {956switch (bhint) {957case bhintatNoHint:958return bhintatNoHint;959case bhintatIsNotTaken:960return bhintatIsTaken;961case bhintatIsTaken:962return bhintatIsNotTaken;963default:964ShouldNotReachHere();965return 0;966}967}968969// PPC branch instructions970enum ppcops {971b_op = 18,972bc_op = 16,973bcr_op = 19974};975976enum Condition {977negative = 0,978less = 0,979positive = 1,980greater = 1,981zero = 2,982equal = 2,983summary_overflow = 3,984};985986public:987// Helper functions for groups of instructions988989enum Predict { pt = 1, pn = 0 }; // pt = predict taken990991//---< calculate length of instruction >---992// With PPC64 being a RISC architecture, this always is BytesPerInstWord993// instruction must start at passed address994static unsigned int instr_len(unsigned char *instr) { return BytesPerInstWord; }995996//---< longest instructions >---997static unsigned int instr_maxlen() { return BytesPerInstWord; }998999// Test if x is within signed immediate range for nbits.1000static bool is_simm(int x, unsigned int nbits) {1001assert(0 < nbits && nbits < 32, "out of bounds");1002const int min = -(((int)1) << nbits-1);1003const int maxplus1 = (((int)1) << nbits-1);1004return min <= x && x < maxplus1;1005}10061007static bool is_simm(jlong x, unsigned int nbits) {1008assert(0 < nbits && nbits < 64, "out of bounds");1009const jlong min = -(((jlong)1) << nbits-1);1010const jlong maxplus1 = (((jlong)1) << nbits-1);1011return min <= x && x < maxplus1;1012}10131014// Test if x is within unsigned immediate range for nbits.1015static bool is_uimm(int x, unsigned int nbits) {1016assert(0 < nbits && nbits < 32, "out of bounds");1017const unsigned int maxplus1 = (((unsigned int)1) << nbits);1018return (unsigned int)x < maxplus1;1019}10201021static bool is_uimm(jlong x, unsigned int nbits) {1022assert(0 < nbits && nbits < 64, "out of bounds");1023const julong maxplus1 = (((julong)1) << nbits);1024return (julong)x < maxplus1;1025}10261027protected:1028// helpers10291030// X is supposed to fit in a field "nbits" wide1031// and be sign-extended. Check the range.1032static void assert_signed_range(intptr_t x, int nbits) {1033assert(nbits == 32 || (-(1 << nbits-1) <= x && x < (1 << nbits-1)),1034"value out of range");1035}10361037static void assert_signed_word_disp_range(intptr_t x, int nbits) {1038assert((x & 3) == 0, "not word aligned");1039assert_signed_range(x, nbits + 2);1040}10411042static void assert_unsigned_const(int x, int nbits) {1043assert(juint(x) < juint(1 << nbits), "unsigned constant out of range");1044}10451046static int fmask(juint hi_bit, juint lo_bit) {1047assert(hi_bit >= lo_bit && hi_bit < 32, "bad bits");1048return (1 << ( hi_bit-lo_bit + 1 )) - 1;1049}10501051// inverse of u_field1052static int inv_u_field(int x, int hi_bit, int lo_bit) {1053juint r = juint(x) >> lo_bit;1054r &= fmask(hi_bit, lo_bit);1055return int(r);1056}10571058// signed version: extract from field and sign-extend1059static int inv_s_field_ppc(int x, int hi_bit, int lo_bit) {1060x = x << (31-hi_bit);1061x = x >> (31-hi_bit+lo_bit);1062return x;1063}10641065static int u_field(int x, int hi_bit, int lo_bit) {1066assert((x & ~fmask(hi_bit, lo_bit)) == 0, "value out of range");1067int r = x << lo_bit;1068assert(inv_u_field(r, hi_bit, lo_bit) == x, "just checking");1069return r;1070}10711072// Same as u_field for signed values1073static int s_field(int x, int hi_bit, int lo_bit) {1074int nbits = hi_bit - lo_bit + 1;1075assert(nbits == 32 || (-(1 << nbits-1) <= x && x < (1 << nbits-1)),1076"value out of range");1077x &= fmask(hi_bit, lo_bit);1078int r = x << lo_bit;1079return r;1080}10811082// inv_op for ppc instructions1083static int inv_op_ppc(int x) { return inv_u_field(x, 31, 26); }10841085// Determine target address from li, bd field of branch instruction.1086static intptr_t inv_li_field(int x) {1087intptr_t r = inv_s_field_ppc(x, 25, 2);1088r = (r << 2);1089return r;1090}1091static intptr_t inv_bd_field(int x, intptr_t pos) {1092intptr_t r = inv_s_field_ppc(x, 15, 2);1093r = (r << 2) + pos;1094return r;1095}10961097#define inv_opp_u_field(x, hi_bit, lo_bit) inv_u_field(x, 31-(lo_bit), 31-(hi_bit))1098#define inv_opp_s_field(x, hi_bit, lo_bit) inv_s_field_ppc(x, 31-(lo_bit), 31-(hi_bit))1099// Extract instruction fields from instruction words.1100public:1101static int inv_ra_field(int x) { return inv_opp_u_field(x, 15, 11); }1102static int inv_rb_field(int x) { return inv_opp_u_field(x, 20, 16); }1103static int inv_rt_field(int x) { return inv_opp_u_field(x, 10, 6); }1104static int inv_rta_field(int x) { return inv_opp_u_field(x, 15, 11); }1105static int inv_rs_field(int x) { return inv_opp_u_field(x, 10, 6); }1106// Ds uses opp_s_field(x, 31, 16), but lowest 2 bits must be 0.1107// Inv_ds_field uses range (x, 29, 16) but shifts by 2 to ensure that lowest bits are 0.1108static int inv_ds_field(int x) { return inv_opp_s_field(x, 29, 16) << 2; }1109static int inv_d1_field(int x) { return inv_opp_s_field(x, 31, 16); }1110static int inv_si_field(int x) { return inv_opp_s_field(x, 31, 16); }1111static int inv_to_field(int x) { return inv_opp_u_field(x, 10, 6); }1112static int inv_lk_field(int x) { return inv_opp_u_field(x, 31, 31); }1113static int inv_bo_field(int x) { return inv_opp_u_field(x, 10, 6); }1114static int inv_bi_field(int x) { return inv_opp_u_field(x, 15, 11); }11151116// For extended opcodes (prefixed instructions) introduced with Power 101117static long inv_r_eo( int x) { return inv_opp_u_field(x, 11, 11); }1118static long inv_type( int x) { return inv_opp_u_field(x, 7, 6); }1119static long inv_st_x0( int x) { return inv_opp_u_field(x, 8, 8); }1120static long inv_st_x1( int x) { return inv_opp_u_field(x, 11, 8); }11211122// - 8LS:D/MLS:D Formats1123static long inv_d0_eo( long x) { return inv_opp_u_field(x, 31, 14); }11241125// - 8RR:XX4/8RR:D Formats1126static long inv_imm0_eo(int x) { return inv_opp_u_field(x, 31, 16); }1127static long inv_uimm_eo(int x) { return inv_opp_u_field(x, 31, 29); }1128static long inv_imm_eo( int x) { return inv_opp_u_field(x, 31, 24); }11291130#define opp_u_field(x, hi_bit, lo_bit) u_field(x, 31-(lo_bit), 31-(hi_bit))1131#define opp_s_field(x, hi_bit, lo_bit) s_field(x, 31-(lo_bit), 31-(hi_bit))11321133// instruction fields1134static int aa( int x) { return opp_u_field(x, 30, 30); }1135static int ba( int x) { return opp_u_field(x, 15, 11); }1136static int bb( int x) { return opp_u_field(x, 20, 16); }1137static int bc( int x) { return opp_u_field(x, 25, 21); }1138static int bd( int x) { return opp_s_field(x, 29, 16); }1139static int bf( ConditionRegister cr) { return bf(cr->encoding()); }1140static int bf( int x) { return opp_u_field(x, 8, 6); }1141static int bfa(ConditionRegister cr) { return bfa(cr->encoding()); }1142static int bfa( int x) { return opp_u_field(x, 13, 11); }1143static int bh( int x) { return opp_u_field(x, 20, 19); }1144static int bi( int x) { return opp_u_field(x, 15, 11); }1145static int bi0(ConditionRegister cr, Condition c) { return (cr->encoding() << 2) | c; }1146static int bo( int x) { return opp_u_field(x, 10, 6); }1147static int bt( int x) { return opp_u_field(x, 10, 6); }1148static int d1( int x) { return opp_s_field(x, 31, 16); }1149static int ds( int x) { assert((x & 0x3) == 0, "unaligned offset"); return opp_s_field(x, 31, 16); }1150static int eh( int x) { return opp_u_field(x, 31, 31); }1151static int flm( int x) { return opp_u_field(x, 14, 7); }1152static int fra( FloatRegister r) { return fra(r->encoding());}1153static int frb( FloatRegister r) { return frb(r->encoding());}1154static int frc( FloatRegister r) { return frc(r->encoding());}1155static int frs( FloatRegister r) { return frs(r->encoding());}1156static int frt( FloatRegister r) { return frt(r->encoding());}1157static int fra( int x) { return opp_u_field(x, 15, 11); }1158static int frb( int x) { return opp_u_field(x, 20, 16); }1159static int frc( int x) { return opp_u_field(x, 25, 21); }1160static int frs( int x) { return opp_u_field(x, 10, 6); }1161static int frt( int x) { return opp_u_field(x, 10, 6); }1162static int fxm( int x) { return opp_u_field(x, 19, 12); }1163static int imm8( int x) { return opp_u_field(uimm(x, 8), 20, 13); }1164static int l10( int x) { assert(x == 0 || x == 1, "must be 0 or 1"); return opp_u_field(x, 10, 10); }1165static int l14( int x) { return opp_u_field(x, 15, 14); }1166static int l15( int x) { return opp_u_field(x, 15, 15); }1167static int l910( int x) { return opp_u_field(x, 10, 9); }1168static int e1215( int x) { return opp_u_field(x, 15, 12); }1169static int lev( int x) { return opp_u_field(x, 26, 20); }1170static int li( int x) { return opp_s_field(x, 29, 6); }1171static int lk( int x) { return opp_u_field(x, 31, 31); }1172static int mb2125( int x) { return opp_u_field(x, 25, 21); }1173static int me2630( int x) { return opp_u_field(x, 30, 26); }1174static int mb2126( int x) { return opp_u_field(((x & 0x1f) << 1) | ((x & 0x20) >> 5), 26, 21); }1175static int me2126( int x) { return mb2126(x); }1176static int nb( int x) { return opp_u_field(x, 20, 16); }1177//static int opcd( int x) { return opp_u_field(x, 5, 0); } // is contained in our opcodes1178static int oe( int x) { return opp_u_field(x, 21, 21); }1179static int ra( Register r) { return ra(r->encoding()); }1180static int ra( int x) { return opp_u_field(x, 15, 11); }1181static int rb( Register r) { return rb(r->encoding()); }1182static int rb( int x) { return opp_u_field(x, 20, 16); }1183static int rc( int x) { return opp_u_field(x, 31, 31); }1184static int rs( Register r) { return rs(r->encoding()); }1185static int rs( int x) { return opp_u_field(x, 10, 6); }1186// we don't want to use R0 in memory accesses, because it has value `0' then1187static int ra0mem( Register r) { assert(r != R0, "cannot use register R0 in memory access"); return ra(r); }1188static int ra0mem( int x) { assert(x != 0, "cannot use register 0 in memory access"); return ra(x); }11891190// register r is target1191static int rt( Register r) { return rs(r); }1192static int rt( int x) { return rs(x); }1193static int rta( Register r) { return ra(r); }1194static int rta0mem( Register r) { rta(r); return ra0mem(r); }11951196static int sh1620( int x) { return opp_u_field(x, 20, 16); }1197static int sh30( int x) { return opp_u_field(x, 30, 30); }1198static int sh162030( int x) { return sh1620(x & 0x1f) | sh30((x & 0x20) >> 5); }1199static int si( int x) { return opp_s_field(x, 31, 16); }1200static int spr( int x) { return opp_u_field(x, 20, 11); }1201static int sr( int x) { return opp_u_field(x, 15, 12); }1202static int tbr( int x) { return opp_u_field(x, 20, 11); }1203static int th( int x) { return opp_u_field(x, 10, 7); }1204static int thct( int x) { assert((x&8) == 0, "must be valid cache specification"); return th(x); }1205static int thds( int x) { assert((x&8) == 8, "must be valid stream specification"); return th(x); }1206static int to( int x) { return opp_u_field(x, 10, 6); }1207static int u( int x) { return opp_u_field(x, 19, 16); }1208static int ui( int x) { return opp_u_field(x, 31, 16); }12091210// Support vector instructions for >= Power6.1211static int vra( int x) { return opp_u_field(x, 15, 11); }1212static int vrb( int x) { return opp_u_field(x, 20, 16); }1213static int vrc( int x) { return opp_u_field(x, 25, 21); }1214static int vrs( int x) { return opp_u_field(x, 10, 6); }1215static int vrt( int x) { return opp_u_field(x, 10, 6); }12161217static int vra( VectorRegister r) { return vra(r->encoding());}1218static int vrb( VectorRegister r) { return vrb(r->encoding());}1219static int vrc( VectorRegister r) { return vrc(r->encoding());}1220static int vrs( VectorRegister r) { return vrs(r->encoding());}1221static int vrt( VectorRegister r) { return vrt(r->encoding());}12221223// Only used on SHA sigma instructions (VX-form)1224static int vst( int x) { return opp_u_field(x, 16, 16); }1225static int vsix( int x) { return opp_u_field(x, 20, 17); }12261227// Support Vector-Scalar (VSX) instructions.1228static int vsra( int x) { return opp_u_field(x & 0x1F, 15, 11) | opp_u_field((x & 0x20) >> 5, 29, 29); }1229static int vsrb( int x) { return opp_u_field(x & 0x1F, 20, 16) | opp_u_field((x & 0x20) >> 5, 30, 30); }1230static int vsrc( int x) { return opp_u_field(x & 0x1F, 25, 21) | opp_u_field((x & 0x20) >> 5, 28, 28); }1231static int vsrs( int x) { return opp_u_field(x & 0x1F, 10, 6) | opp_u_field((x & 0x20) >> 5, 31, 31); }1232static int vsrt( int x) { return vsrs(x); }1233static int vsdm( int x) { return opp_u_field(x, 23, 22); }1234static int vsrs_dq( int x) { return opp_u_field(x & 0x1F, 10, 6) | opp_u_field((x & 0x20) >> 5, 28, 28); }1235static int vsrt_dq( int x) { return vsrs_dq(x); }12361237static int vsra( VectorSRegister r) { return vsra(r->encoding());}1238static int vsrb( VectorSRegister r) { return vsrb(r->encoding());}1239static int vsrc( VectorSRegister r) { return vsrc(r->encoding());}1240static int vsrs( VectorSRegister r) { return vsrs(r->encoding());}1241static int vsrt( VectorSRegister r) { return vsrt(r->encoding());}1242static int vsrs_dq(VectorSRegister r) { return vsrs_dq(r->encoding());}1243static int vsrt_dq(VectorSRegister r) { return vsrt_dq(r->encoding());}12441245static int vsplt_uim( int x) { return opp_u_field(x, 15, 12); } // for vsplt* instructions1246static int vsplti_sim(int x) { return opp_u_field(x, 15, 11); } // for vsplti* instructions1247static int vsldoi_shb(int x) { return opp_u_field(x, 25, 22); } // for vsldoi instruction1248static int vcmp_rc( int x) { return opp_u_field(x, 21, 21); } // for vcmp* instructions1249static int xxsplt_uim(int x) { return opp_u_field(x, 15, 14); } // for xxsplt* instructions12501251// For extended opcodes (prefixed instructions) introduced with Power 101252static long r_eo( int x) { return opp_u_field(x, 11, 11); }1253static long type( int x) { return opp_u_field(x, 7, 6); }1254static long st_x0( int x) { return opp_u_field(x, 8, 8); }1255static long st_x1( int x) { return opp_u_field(x, 11, 8); }12561257// - 8LS:D/MLS:D Formats1258static long d0_eo( long x) { return opp_u_field((x >> 16) & 0x3FFFF, 31, 14); }1259static long d1_eo( long x) { return opp_u_field(x & 0xFFFF, 31, 16); }1260static long s0_eo( long x) { return d0_eo(x); }1261static long s1_eo( long x) { return d1_eo(x); }12621263// - 8RR:XX4/8RR:D Formats1264static long imm0_eo( int x) { return opp_u_field(x >> 16, 31, 16); }1265static long imm1_eo( int x) { return opp_u_field(x & 0xFFFF, 31, 16); }1266static long uimm_eo( int x) { return opp_u_field(x, 31, 29); }1267static long imm_eo( int x) { return opp_u_field(x, 31, 24); }12681269//static int xo1( int x) { return opp_u_field(x, 29, 21); }// is contained in our opcodes1270//static int xo2( int x) { return opp_u_field(x, 30, 21); }// is contained in our opcodes1271//static int xo3( int x) { return opp_u_field(x, 30, 22); }// is contained in our opcodes1272//static int xo4( int x) { return opp_u_field(x, 30, 26); }// is contained in our opcodes1273//static int xo5( int x) { return opp_u_field(x, 29, 27); }// is contained in our opcodes1274//static int xo6( int x) { return opp_u_field(x, 30, 27); }// is contained in our opcodes1275//static int xo7( int x) { return opp_u_field(x, 31, 30); }// is contained in our opcodes12761277protected:1278// Compute relative address for branch.1279static intptr_t disp(intptr_t x, intptr_t off) {1280int xx = x - off;1281xx = xx >> 2;1282return xx;1283}12841285public:1286// signed immediate, in low bits, nbits long1287static int simm(int x, int nbits) {1288assert_signed_range(x, nbits);1289return x & ((1 << nbits) - 1);1290}12911292// unsigned immediate, in low bits, nbits long1293static int uimm(int x, int nbits) {1294assert_unsigned_const(x, nbits);1295return x & ((1 << nbits) - 1);1296}12971298static void set_imm(int* instr, short s) {1299// imm is always in the lower 16 bits of the instruction,1300// so this is endian-neutral. Same for the get_imm below.1301uint32_t w = *(uint32_t *)instr;1302*instr = (int)((w & ~0x0000FFFF) | (s & 0x0000FFFF));1303}13041305static int get_imm(address a, int instruction_number) {1306return (short)((int *)a)[instruction_number];1307}13081309static inline int hi16_signed( int x) { return (int)(int16_t)(x >> 16); }1310static inline int lo16_unsigned(int x) { return x & 0xffff; }13111312protected:13131314// Extract the top 32 bits in a 64 bit word.1315static int32_t hi32(int64_t x) {1316int32_t r = int32_t((uint64_t)x >> 32);1317return r;1318}13191320public:13211322static inline unsigned int align_addr(unsigned int addr, unsigned int a) {1323return ((addr + (a - 1)) & ~(a - 1));1324}13251326static inline bool is_aligned(unsigned int addr, unsigned int a) {1327return (0 == addr % a);1328}13291330void flush() {1331AbstractAssembler::flush();1332}13331334inline void emit_int32(int); // shadows AbstractAssembler::emit_int321335inline void emit_data(int);1336inline void emit_data(int, RelocationHolder const&);1337inline void emit_data(int, relocInfo::relocType rtype);13381339// Emit an address.1340inline address emit_addr(const address addr = NULL);13411342#if !defined(ABI_ELFv2)1343// Emit a function descriptor with the specified entry point, TOC,1344// and ENV. If the entry point is NULL, the descriptor will point1345// just past the descriptor.1346// Use values from friend functions as defaults.1347inline address emit_fd(address entry = NULL,1348address toc = (address) FunctionDescriptor::friend_toc,1349address env = (address) FunctionDescriptor::friend_env);1350#endif13511352/////////////////////////////////////////////////////////////////////////////////////1353// PPC instructions1354/////////////////////////////////////////////////////////////////////////////////////13551356// Memory instructions use r0 as hard coded 0, e.g. to simulate loading1357// immediates. The normal instruction encoders enforce that r0 is not1358// passed to them. Use either extended mnemonics encoders or the special ra01359// versions.13601361// Issue an illegal instruction.1362inline void illtrap();1363static inline bool is_illtrap(int x);13641365// PPC 1, section 3.3.8, Fixed-Point Arithmetic Instructions1366inline void addi( Register d, Register a, int si16);1367inline void addis(Register d, Register a, int si16);13681369// Prefixed add immediate, introduced by POWER101370inline void paddi(Register d, Register a, long si34, bool r);1371inline void pli( Register d, long si34);13721373private:1374inline void addi_r0ok( Register d, Register a, int si16);1375inline void addis_r0ok(Register d, Register a, int si16);1376inline void paddi_r0ok(Register d, Register a, long si34, bool r);1377public:1378inline void addic_( Register d, Register a, int si16);1379inline void subfic( Register d, Register a, int si16);1380inline void add( Register d, Register a, Register b);1381inline void add_( Register d, Register a, Register b);1382inline void subf( Register d, Register a, Register b); // d = b - a "Sub_from", as in ppc spec.1383inline void sub( Register d, Register a, Register b); // d = a - b Swap operands of subf for readability.1384inline void subf_( Register d, Register a, Register b);1385inline void addc( Register d, Register a, Register b);1386inline void addc_( Register d, Register a, Register b);1387inline void subfc( Register d, Register a, Register b);1388inline void subfc_( Register d, Register a, Register b);1389inline void adde( Register d, Register a, Register b);1390inline void adde_( Register d, Register a, Register b);1391inline void subfe( Register d, Register a, Register b);1392inline void subfe_( Register d, Register a, Register b);1393inline void addme( Register d, Register a);1394inline void addme_( Register d, Register a);1395inline void subfme( Register d, Register a);1396inline void subfme_(Register d, Register a);1397inline void addze( Register d, Register a);1398inline void addze_( Register d, Register a);1399inline void subfze( Register d, Register a);1400inline void subfze_(Register d, Register a);1401inline void neg( Register d, Register a);1402inline void neg_( Register d, Register a);1403inline void mulli( Register d, Register a, int si16);1404inline void mulld( Register d, Register a, Register b);1405inline void mulld_( Register d, Register a, Register b);1406inline void mullw( Register d, Register a, Register b);1407inline void mullw_( Register d, Register a, Register b);1408inline void mulhw( Register d, Register a, Register b);1409inline void mulhw_( Register d, Register a, Register b);1410inline void mulhwu( Register d, Register a, Register b);1411inline void mulhwu_(Register d, Register a, Register b);1412inline void mulhd( Register d, Register a, Register b);1413inline void mulhd_( Register d, Register a, Register b);1414inline void mulhdu( Register d, Register a, Register b);1415inline void mulhdu_(Register d, Register a, Register b);1416inline void divd( Register d, Register a, Register b);1417inline void divd_( Register d, Register a, Register b);1418inline void divw( Register d, Register a, Register b);1419inline void divw_( Register d, Register a, Register b);1420inline void divwu( Register d, Register a, Register b);1421inline void divwu_( Register d, Register a, Register b);14221423// Fixed-Point Arithmetic Instructions with Overflow detection1424inline void addo( Register d, Register a, Register b);1425inline void addo_( Register d, Register a, Register b);1426inline void subfo( Register d, Register a, Register b);1427inline void subfo_( Register d, Register a, Register b);1428inline void addco( Register d, Register a, Register b);1429inline void addco_( Register d, Register a, Register b);1430inline void subfco( Register d, Register a, Register b);1431inline void subfco_( Register d, Register a, Register b);1432inline void addeo( Register d, Register a, Register b);1433inline void addeo_( Register d, Register a, Register b);1434inline void subfeo( Register d, Register a, Register b);1435inline void subfeo_( Register d, Register a, Register b);1436inline void addmeo( Register d, Register a);1437inline void addmeo_( Register d, Register a);1438inline void subfmeo( Register d, Register a);1439inline void subfmeo_(Register d, Register a);1440inline void addzeo( Register d, Register a);1441inline void addzeo_( Register d, Register a);1442inline void subfzeo( Register d, Register a);1443inline void subfzeo_(Register d, Register a);1444inline void nego( Register d, Register a);1445inline void nego_( Register d, Register a);1446inline void mulldo( Register d, Register a, Register b);1447inline void mulldo_( Register d, Register a, Register b);1448inline void mullwo( Register d, Register a, Register b);1449inline void mullwo_( Register d, Register a, Register b);1450inline void divdo( Register d, Register a, Register b);1451inline void divdo_( Register d, Register a, Register b);1452inline void divwo( Register d, Register a, Register b);1453inline void divwo_( Register d, Register a, Register b);14541455// extended mnemonics1456inline void li( Register d, int si16);1457inline void lis( Register d, int si16);1458inline void addir(Register d, int si16, Register a);1459inline void subi( Register d, Register a, int si16);14601461static bool is_addi(int x) {1462return ADDI_OPCODE == (x & ADDI_OPCODE_MASK);1463}1464static bool is_addis(int x) {1465return ADDIS_OPCODE == (x & ADDIS_OPCODE_MASK);1466}1467static bool is_bxx(int x) {1468return BXX_OPCODE == (x & BXX_OPCODE_MASK);1469}1470static bool is_b(int x) {1471return BXX_OPCODE == (x & BXX_OPCODE_MASK) && inv_lk_field(x) == 0;1472}1473static bool is_bl(int x) {1474return BXX_OPCODE == (x & BXX_OPCODE_MASK) && inv_lk_field(x) == 1;1475}1476static bool is_bcxx(int x) {1477return BCXX_OPCODE == (x & BCXX_OPCODE_MASK);1478}1479static bool is_bxx_or_bcxx(int x) {1480return is_bxx(x) || is_bcxx(x);1481}1482static bool is_bctrl(int x) {1483return x == 0x4e800421;1484}1485static bool is_bctr(int x) {1486return x == 0x4e800420;1487}1488static bool is_bclr(int x) {1489return BCLR_OPCODE == (x & XL_FORM_OPCODE_MASK);1490}1491static bool is_li(int x) {1492return is_addi(x) && inv_ra_field(x)==0;1493}1494static bool is_lis(int x) {1495return is_addis(x) && inv_ra_field(x)==0;1496}1497static bool is_mtctr(int x) {1498return MTCTR_OPCODE == (x & MTCTR_OPCODE_MASK);1499}1500static bool is_ld(int x) {1501return LD_OPCODE == (x & LD_OPCODE_MASK);1502}1503static bool is_std(int x) {1504return STD_OPCODE == (x & STD_OPCODE_MASK);1505}1506static bool is_stdu(int x) {1507return STDU_OPCODE == (x & STDU_OPCODE_MASK);1508}1509static bool is_stdx(int x) {1510return STDX_OPCODE == (x & STDX_OPCODE_MASK);1511}1512static bool is_stdux(int x) {1513return STDUX_OPCODE == (x & STDUX_OPCODE_MASK);1514}1515static bool is_stwx(int x) {1516return STWX_OPCODE == (x & STWX_OPCODE_MASK);1517}1518static bool is_stwux(int x) {1519return STWUX_OPCODE == (x & STWUX_OPCODE_MASK);1520}1521static bool is_stw(int x) {1522return STW_OPCODE == (x & STW_OPCODE_MASK);1523}1524static bool is_stwu(int x) {1525return STWU_OPCODE == (x & STWU_OPCODE_MASK);1526}1527static bool is_ori(int x) {1528return ORI_OPCODE == (x & ORI_OPCODE_MASK);1529};1530static bool is_oris(int x) {1531return ORIS_OPCODE == (x & ORIS_OPCODE_MASK);1532};1533static bool is_rldicr(int x) {1534return (RLDICR_OPCODE == (x & RLDICR_OPCODE_MASK));1535};1536static bool is_nop(int x) {1537return x == 0x60000000;1538}1539// endgroup opcode for Power61540static bool is_endgroup(int x) {1541return is_ori(x) && inv_ra_field(x) == 1 && inv_rs_field(x) == 1 && inv_d1_field(x) == 0;1542}154315441545private:1546// PPC 1, section 3.3.9, Fixed-Point Compare Instructions1547inline void cmpi( ConditionRegister bf, int l, Register a, int si16);1548inline void cmp( ConditionRegister bf, int l, Register a, Register b);1549inline void cmpli(ConditionRegister bf, int l, Register a, int ui16);1550inline void cmpl( ConditionRegister bf, int l, Register a, Register b);15511552public:1553// extended mnemonics of Compare Instructions1554inline void cmpwi( ConditionRegister crx, Register a, int si16);1555inline void cmpdi( ConditionRegister crx, Register a, int si16);1556inline void cmpw( ConditionRegister crx, Register a, Register b);1557inline void cmpd( ConditionRegister crx, Register a, Register b);1558inline void cmplwi(ConditionRegister crx, Register a, int ui16);1559inline void cmpldi(ConditionRegister crx, Register a, int ui16);1560inline void cmplw( ConditionRegister crx, Register a, Register b);1561inline void cmpld( ConditionRegister crx, Register a, Register b);15621563// >= Power91564inline void cmprb( ConditionRegister bf, int l, Register a, Register b);1565inline void cmpeqb(ConditionRegister bf, Register a, Register b);15661567inline void isel( Register d, Register a, Register b, int bc);1568// Convenient version which takes: Condition register, Condition code and invert flag. Omit b to keep old value.1569inline void isel( Register d, ConditionRegister cr, Condition cc, bool inv, Register a, Register b = noreg);1570// Set d = 0 if (cr.cc) equals 1, otherwise b.1571inline void isel_0( Register d, ConditionRegister cr, Condition cc, Register b = noreg);15721573// PPC 1, section 3.3.11, Fixed-Point Logical Instructions1574void andi( Register a, Register s, long ui16); // optimized version1575inline void andi_( Register a, Register s, int ui16);1576inline void andis_( Register a, Register s, int ui16);1577inline void ori( Register a, Register s, int ui16);1578inline void oris( Register a, Register s, int ui16);1579inline void xori( Register a, Register s, int ui16);1580inline void xoris( Register a, Register s, int ui16);1581inline void andr( Register a, Register s, Register b); // suffixed by 'r' as 'and' is C++ keyword1582inline void and_( Register a, Register s, Register b);1583// Turn or0(rx,rx,rx) into a nop and avoid that we accidently emit a1584// SMT-priority change instruction (see SMT instructions below).1585inline void or_unchecked(Register a, Register s, Register b);1586inline void orr( Register a, Register s, Register b); // suffixed by 'r' as 'or' is C++ keyword1587inline void or_( Register a, Register s, Register b);1588inline void xorr( Register a, Register s, Register b); // suffixed by 'r' as 'xor' is C++ keyword1589inline void xor_( Register a, Register s, Register b);1590inline void nand( Register a, Register s, Register b);1591inline void nand_( Register a, Register s, Register b);1592inline void nor( Register a, Register s, Register b);1593inline void nor_( Register a, Register s, Register b);1594inline void andc( Register a, Register s, Register b);1595inline void andc_( Register a, Register s, Register b);1596inline void orc( Register a, Register s, Register b);1597inline void orc_( Register a, Register s, Register b);1598inline void extsb( Register a, Register s);1599inline void extsb_( Register a, Register s);1600inline void extsh( Register a, Register s);1601inline void extsh_( Register a, Register s);1602inline void extsw( Register a, Register s);1603inline void extsw_( Register a, Register s);16041605// extended mnemonics1606inline void nop();1607// NOP for FP and BR units (different versions to allow them to be in one group)1608inline void fpnop0();1609inline void fpnop1();1610inline void brnop0();1611inline void brnop1();1612inline void brnop2();16131614inline void mr( Register d, Register s);1615inline void ori_opt( Register d, int ui16);1616inline void oris_opt(Register d, int ui16);16171618// endgroup opcode for Power61619inline void endgroup();16201621// count instructions1622inline void cntlzw( Register a, Register s);1623inline void cntlzw_( Register a, Register s);1624inline void cntlzd( Register a, Register s);1625inline void cntlzd_( Register a, Register s);1626inline void cnttzw( Register a, Register s);1627inline void cnttzw_( Register a, Register s);1628inline void cnttzd( Register a, Register s);1629inline void cnttzd_( Register a, Register s);16301631// PPC 1, section 3.3.12, Fixed-Point Rotate and Shift Instructions1632inline void sld( Register a, Register s, Register b);1633inline void sld_( Register a, Register s, Register b);1634inline void slw( Register a, Register s, Register b);1635inline void slw_( Register a, Register s, Register b);1636inline void srd( Register a, Register s, Register b);1637inline void srd_( Register a, Register s, Register b);1638inline void srw( Register a, Register s, Register b);1639inline void srw_( Register a, Register s, Register b);1640inline void srad( Register a, Register s, Register b);1641inline void srad_( Register a, Register s, Register b);1642inline void sraw( Register a, Register s, Register b);1643inline void sraw_( Register a, Register s, Register b);1644inline void sradi( Register a, Register s, int sh6);1645inline void sradi_( Register a, Register s, int sh6);1646inline void srawi( Register a, Register s, int sh5);1647inline void srawi_( Register a, Register s, int sh5);16481649// extended mnemonics for Shift Instructions1650inline void sldi( Register a, Register s, int sh6);1651inline void sldi_( Register a, Register s, int sh6);1652inline void slwi( Register a, Register s, int sh5);1653inline void slwi_( Register a, Register s, int sh5);1654inline void srdi( Register a, Register s, int sh6);1655inline void srdi_( Register a, Register s, int sh6);1656inline void srwi( Register a, Register s, int sh5);1657inline void srwi_( Register a, Register s, int sh5);16581659inline void clrrdi( Register a, Register s, int ui6);1660inline void clrrdi_( Register a, Register s, int ui6);1661inline void clrldi( Register a, Register s, int ui6);1662inline void clrldi_( Register a, Register s, int ui6);1663inline void clrlsldi(Register a, Register s, int clrl6, int shl6);1664inline void clrlsldi_(Register a, Register s, int clrl6, int shl6);1665inline void extrdi( Register a, Register s, int n, int b);1666// testbit with condition register1667inline void testbitdi(ConditionRegister cr, Register a, Register s, int ui6);16681669// Byte reverse instructions (introduced with Power10)1670inline void brh( Register a, Register s);1671inline void brw( Register a, Register s);1672inline void brd( Register a, Register s);16731674// rotate instructions1675inline void rotldi( Register a, Register s, int n);1676inline void rotrdi( Register a, Register s, int n);1677inline void rotlwi( Register a, Register s, int n);1678inline void rotrwi( Register a, Register s, int n);16791680// Rotate Instructions1681inline void rldic( Register a, Register s, int sh6, int mb6);1682inline void rldic_( Register a, Register s, int sh6, int mb6);1683inline void rldicr( Register a, Register s, int sh6, int mb6);1684inline void rldicr_( Register a, Register s, int sh6, int mb6);1685inline void rldicl( Register a, Register s, int sh6, int mb6);1686inline void rldicl_( Register a, Register s, int sh6, int mb6);1687inline void rlwinm( Register a, Register s, int sh5, int mb5, int me5);1688inline void rlwinm_( Register a, Register s, int sh5, int mb5, int me5);1689inline void rldimi( Register a, Register s, int sh6, int mb6);1690inline void rldimi_( Register a, Register s, int sh6, int mb6);1691inline void rlwimi( Register a, Register s, int sh5, int mb5, int me5);1692inline void insrdi( Register a, Register s, int n, int b);1693inline void insrwi( Register a, Register s, int n, int b);16941695// PPC 1, section 3.3.2 Fixed-Point Load Instructions1696// 4 bytes1697inline void lwzx( Register d, Register s1, Register s2);1698inline void lwz( Register d, int si16, Register s1);1699inline void lwzu( Register d, int si16, Register s1);17001701// 4 bytes1702inline void lwax( Register d, Register s1, Register s2);1703inline void lwa( Register d, int si16, Register s1);17041705// 4 bytes reversed1706inline void lwbrx( Register d, Register s1, Register s2);17071708// 2 bytes1709inline void lhzx( Register d, Register s1, Register s2);1710inline void lhz( Register d, int si16, Register s1);1711inline void lhzu( Register d, int si16, Register s1);17121713// 2 bytes reversed1714inline void lhbrx( Register d, Register s1, Register s2);17151716// 2 bytes1717inline void lhax( Register d, Register s1, Register s2);1718inline void lha( Register d, int si16, Register s1);1719inline void lhau( Register d, int si16, Register s1);17201721// 1 byte1722inline void lbzx( Register d, Register s1, Register s2);1723inline void lbz( Register d, int si16, Register s1);1724inline void lbzu( Register d, int si16, Register s1);17251726// 8 bytes1727inline void ldx( Register d, Register s1, Register s2);1728inline void ld( Register d, int si16, Register s1);1729inline void ldu( Register d, int si16, Register s1);17301731// 8 bytes reversed1732inline void ldbrx( Register d, Register s1, Register s2);17331734// For convenience. Load pointer into d from b+s1.1735inline void ld_ptr(Register d, int b, Register s1);1736inline void ld_ptr(Register d, ByteSize b, Register s1);17371738// PPC 1, section 3.3.3 Fixed-Point Store Instructions1739inline void stwx( Register d, Register s1, Register s2);1740inline void stw( Register d, int si16, Register s1);1741inline void stwu( Register d, int si16, Register s1);1742inline void stwbrx( Register d, Register s1, Register s2);17431744inline void sthx( Register d, Register s1, Register s2);1745inline void sth( Register d, int si16, Register s1);1746inline void sthu( Register d, int si16, Register s1);1747inline void sthbrx( Register d, Register s1, Register s2);17481749inline void stbx( Register d, Register s1, Register s2);1750inline void stb( Register d, int si16, Register s1);1751inline void stbu( Register d, int si16, Register s1);17521753inline void stdx( Register d, Register s1, Register s2);1754inline void std( Register d, int si16, Register s1);1755inline void stdu( Register d, int si16, Register s1);1756inline void stdux(Register s, Register a, Register b);1757inline void stdbrx( Register d, Register s1, Register s2);17581759inline void st_ptr(Register d, int si16, Register s1);1760inline void st_ptr(Register d, ByteSize b, Register s1);17611762// PPC 1, section 3.3.13 Move To/From System Register Instructions1763inline void mtlr( Register s1);1764inline void mflr( Register d);1765inline void mtctr(Register s1);1766inline void mfctr(Register d);1767inline void mtcrf(int fxm, Register s);1768inline void mfcr( Register d);1769inline void mcrf( ConditionRegister crd, ConditionRegister cra);1770inline void mtcr( Register s);1771// >= Power91772inline void mcrxrx(ConditionRegister cra);1773inline void setb( Register d, ConditionRegister cra);17741775// >= Power101776inline void setbc( Register d, int biint);1777inline void setbc( Register d, ConditionRegister cr, Condition cc);1778inline void setnbc(Register d, int biint);1779inline void setnbc(Register d, ConditionRegister cr, Condition cc);17801781// Special purpose registers1782// Exception Register1783inline void mtxer(Register s1);1784inline void mfxer(Register d);1785// Vector Register Save Register1786inline void mtvrsave(Register s1);1787inline void mfvrsave(Register d);1788// Timebase1789inline void mftb(Register d);1790// Introduced with Power 8:1791// Data Stream Control Register1792inline void mtdscr(Register s1);1793inline void mfdscr(Register d );1794// Transactional Memory Registers1795inline void mftfhar(Register d);1796inline void mftfiar(Register d);1797inline void mftexasr(Register d);1798inline void mftexasru(Register d);17991800// TEXASR bit description1801enum transaction_failure_reason {1802// Upper half (TEXASRU):1803tm_failure_code = 0, // The Failure Code is copied from tabort or treclaim operand.1804tm_failure_persistent = 7, // The failure is likely to recur on each execution.1805tm_disallowed = 8, // The instruction is not permitted.1806tm_nesting_of = 9, // The maximum transaction level was exceeded.1807tm_footprint_of = 10, // The tracking limit for transactional storage accesses was exceeded.1808tm_self_induced_cf = 11, // A self-induced conflict occurred in Suspended state.1809tm_non_trans_cf = 12, // A conflict occurred with a non-transactional access by another processor.1810tm_trans_cf = 13, // A conflict occurred with another transaction.1811tm_translation_cf = 14, // A conflict occurred with a TLB invalidation.1812tm_inst_fetch_cf = 16, // An instruction fetch was performed from a block that was previously written transactionally.1813tm_tabort = 31, // Termination was caused by the execution of an abort instruction.1814// Lower half:1815tm_suspended = 32, // Failure was recorded in Suspended state.1816tm_failure_summary = 36, // Failure has been detected and recorded.1817tm_tfiar_exact = 37, // Value in the TFIAR is exact.1818tm_rot = 38, // Rollback-only transaction.1819tm_transaction_level = 52, // Transaction level (nesting depth + 1).1820};18211822// PPC 1, section 2.4.1 Branch Instructions1823inline void b( address a, relocInfo::relocType rt = relocInfo::none);1824inline void b( Label& L);1825inline void bl( address a, relocInfo::relocType rt = relocInfo::none);1826inline void bl( Label& L);1827inline void bc( int boint, int biint, address a, relocInfo::relocType rt = relocInfo::none);1828inline void bc( int boint, int biint, Label& L);1829inline void bcl(int boint, int biint, address a, relocInfo::relocType rt = relocInfo::none);1830inline void bcl(int boint, int biint, Label& L);18311832inline void bclr( int boint, int biint, int bhint, relocInfo::relocType rt = relocInfo::none);1833inline void bclrl( int boint, int biint, int bhint, relocInfo::relocType rt = relocInfo::none);1834inline void bcctr( int boint, int biint, int bhint = bhintbhBCCTRisNotReturnButSame,1835relocInfo::relocType rt = relocInfo::none);1836inline void bcctrl(int boint, int biint, int bhint = bhintbhBCLRisReturn,1837relocInfo::relocType rt = relocInfo::none);18381839// helper function for b, bcxx1840inline bool is_within_range_of_b(address a, address pc);1841inline bool is_within_range_of_bcxx(address a, address pc);18421843// get the destination of a bxx branch (b, bl, ba, bla)1844static inline address bxx_destination(address baddr);1845static inline address bxx_destination(int instr, address pc);1846static inline intptr_t bxx_destination_offset(int instr, intptr_t bxx_pos);18471848// extended mnemonics for branch instructions1849inline void blt(ConditionRegister crx, Label& L);1850inline void bgt(ConditionRegister crx, Label& L);1851inline void beq(ConditionRegister crx, Label& L);1852inline void bso(ConditionRegister crx, Label& L);1853inline void bge(ConditionRegister crx, Label& L);1854inline void ble(ConditionRegister crx, Label& L);1855inline void bne(ConditionRegister crx, Label& L);1856inline void bns(ConditionRegister crx, Label& L);18571858// Branch instructions with static prediction hints.1859inline void blt_predict_taken( ConditionRegister crx, Label& L);1860inline void bgt_predict_taken( ConditionRegister crx, Label& L);1861inline void beq_predict_taken( ConditionRegister crx, Label& L);1862inline void bso_predict_taken( ConditionRegister crx, Label& L);1863inline void bge_predict_taken( ConditionRegister crx, Label& L);1864inline void ble_predict_taken( ConditionRegister crx, Label& L);1865inline void bne_predict_taken( ConditionRegister crx, Label& L);1866inline void bns_predict_taken( ConditionRegister crx, Label& L);1867inline void blt_predict_not_taken(ConditionRegister crx, Label& L);1868inline void bgt_predict_not_taken(ConditionRegister crx, Label& L);1869inline void beq_predict_not_taken(ConditionRegister crx, Label& L);1870inline void bso_predict_not_taken(ConditionRegister crx, Label& L);1871inline void bge_predict_not_taken(ConditionRegister crx, Label& L);1872inline void ble_predict_not_taken(ConditionRegister crx, Label& L);1873inline void bne_predict_not_taken(ConditionRegister crx, Label& L);1874inline void bns_predict_not_taken(ConditionRegister crx, Label& L);18751876// for use in conjunction with testbitdi:1877inline void btrue( ConditionRegister crx, Label& L);1878inline void bfalse(ConditionRegister crx, Label& L);18791880inline void bltl(ConditionRegister crx, Label& L);1881inline void bgtl(ConditionRegister crx, Label& L);1882inline void beql(ConditionRegister crx, Label& L);1883inline void bsol(ConditionRegister crx, Label& L);1884inline void bgel(ConditionRegister crx, Label& L);1885inline void blel(ConditionRegister crx, Label& L);1886inline void bnel(ConditionRegister crx, Label& L);1887inline void bnsl(ConditionRegister crx, Label& L);18881889// extended mnemonics for Branch Instructions via LR1890// We use `blr' for returns.1891inline void blr(relocInfo::relocType rt = relocInfo::none);18921893// extended mnemonics for Branch Instructions with CTR1894// bdnz means `decrement CTR and jump to L if CTR is not zero'1895inline void bdnz(Label& L);1896// Decrement and branch if result is zero.1897inline void bdz(Label& L);1898// we use `bctr[l]' for jumps/calls in function descriptor glue1899// code, e.g. calls to runtime functions1900inline void bctr( relocInfo::relocType rt = relocInfo::none);1901inline void bctrl(relocInfo::relocType rt = relocInfo::none);1902// conditional jumps/branches via CTR1903inline void beqctr( ConditionRegister crx, relocInfo::relocType rt = relocInfo::none);1904inline void beqctrl(ConditionRegister crx, relocInfo::relocType rt = relocInfo::none);1905inline void bnectr( ConditionRegister crx, relocInfo::relocType rt = relocInfo::none);1906inline void bnectrl(ConditionRegister crx, relocInfo::relocType rt = relocInfo::none);19071908// condition register logic instructions1909// NOTE: There's a preferred form: d and s2 should point into the same condition register.1910inline void crand( int d, int s1, int s2);1911inline void crnand(int d, int s1, int s2);1912inline void cror( int d, int s1, int s2);1913inline void crxor( int d, int s1, int s2);1914inline void crnor( int d, int s1, int s2);1915inline void creqv( int d, int s1, int s2);1916inline void crandc(int d, int s1, int s2);1917inline void crorc( int d, int s1, int s2);19181919// More convenient version.1920int condition_register_bit(ConditionRegister cr, Condition c) {1921return 4 * (int)(intptr_t)cr + c;1922}1923void crand( ConditionRegister crdst, Condition cdst, ConditionRegister crsrc, Condition csrc);1924void crnand(ConditionRegister crdst, Condition cdst, ConditionRegister crsrc, Condition csrc);1925void cror( ConditionRegister crdst, Condition cdst, ConditionRegister crsrc, Condition csrc);1926void crxor( ConditionRegister crdst, Condition cdst, ConditionRegister crsrc, Condition csrc);1927void crnor( ConditionRegister crdst, Condition cdst, ConditionRegister crsrc, Condition csrc);1928void creqv( ConditionRegister crdst, Condition cdst, ConditionRegister crsrc, Condition csrc);1929void crandc(ConditionRegister crdst, Condition cdst, ConditionRegister crsrc, Condition csrc);1930void crorc( ConditionRegister crdst, Condition cdst, ConditionRegister crsrc, Condition csrc);19311932// icache and dcache related instructions1933inline void icbi( Register s1, Register s2);1934//inline void dcba(Register s1, Register s2); // Instruction for embedded processor only.1935inline void dcbz( Register s1, Register s2);1936inline void dcbst( Register s1, Register s2);1937inline void dcbf( Register s1, Register s2);19381939enum ct_cache_specification {1940ct_primary_cache = 0,1941ct_secondary_cache = 21942};1943// dcache read hint1944inline void dcbt( Register s1, Register s2);1945inline void dcbtct( Register s1, Register s2, int ct);1946inline void dcbtds( Register s1, Register s2, int ds);1947// dcache write hint1948inline void dcbtst( Register s1, Register s2);1949inline void dcbtstct(Register s1, Register s2, int ct);19501951// machine barrier instructions:1952//1953// - sync two-way memory barrier, aka fence1954// - lwsync orders Store|Store,1955// Load|Store,1956// Load|Load,1957// but not Store|Load1958// - eieio orders memory accesses for device memory (only)1959// - isync invalidates speculatively executed instructions1960// From the Power ISA 2.06 documentation:1961// "[...] an isync instruction prevents the execution of1962// instructions following the isync until instructions1963// preceding the isync have completed, [...]"1964// From IBM's AIX assembler reference:1965// "The isync [...] instructions causes the processor to1966// refetch any instructions that might have been fetched1967// prior to the isync instruction. The instruction isync1968// causes the processor to wait for all previous instructions1969// to complete. Then any instructions already fetched are1970// discarded and instruction processing continues in the1971// environment established by the previous instructions."1972//1973// semantic barrier instructions:1974// (as defined in orderAccess.hpp)1975//1976// - release orders Store|Store, (maps to lwsync)1977// Load|Store1978// - acquire orders Load|Store, (maps to lwsync)1979// Load|Load1980// - fence orders Store|Store, (maps to sync)1981// Load|Store,1982// Load|Load,1983// Store|Load1984//1985private:1986inline void sync(int l);1987public:1988inline void sync();1989inline void lwsync();1990inline void ptesync();1991inline void eieio();1992inline void isync();1993inline void elemental_membar(int e); // Elemental Memory Barriers (>=Power 8)19941995// Wait instructions for polling. Attention: May result in SIGILL.1996inline void wait();1997inline void waitrsv(); // >=Power719981999// atomics2000inline void lbarx_unchecked(Register d, Register a, Register b, int eh1 = 0); // >=Power 82001inline void lharx_unchecked(Register d, Register a, Register b, int eh1 = 0); // >=Power 82002inline void lwarx_unchecked(Register d, Register a, Register b, int eh1 = 0);2003inline void ldarx_unchecked(Register d, Register a, Register b, int eh1 = 0);2004inline void lqarx_unchecked(Register d, Register a, Register b, int eh1 = 0); // >=Power 82005inline bool lxarx_hint_exclusive_access();2006inline void lbarx( Register d, Register a, Register b, bool hint_exclusive_access = false);2007inline void lharx( Register d, Register a, Register b, bool hint_exclusive_access = false);2008inline void lwarx( Register d, Register a, Register b, bool hint_exclusive_access = false);2009inline void ldarx( Register d, Register a, Register b, bool hint_exclusive_access = false);2010inline void lqarx( Register d, Register a, Register b, bool hint_exclusive_access = false);2011inline void stbcx_( Register s, Register a, Register b);2012inline void sthcx_( Register s, Register a, Register b);2013inline void stwcx_( Register s, Register a, Register b);2014inline void stdcx_( Register s, Register a, Register b);2015inline void stqcx_( Register s, Register a, Register b);20162017// Instructions for adjusting thread priority for simultaneous2018// multithreading (SMT) on Power5.2019private:2020inline void smt_prio_very_low();2021inline void smt_prio_medium_high();2022inline void smt_prio_high();20232024public:2025inline void smt_prio_low();2026inline void smt_prio_medium_low();2027inline void smt_prio_medium();2028// >= Power72029inline void smt_yield();2030inline void smt_mdoio();2031inline void smt_mdoom();2032// >= Power82033inline void smt_miso();20342035// trap instructions2036inline void twi_0(Register a); // for load with acquire semantics use load+twi_0+isync (trap can't occur)2037// NOT FOR DIRECT USE!!2038protected:2039inline void tdi_unchecked(int tobits, Register a, int si16);2040inline void twi_unchecked(int tobits, Register a, int si16);2041inline void tdi( int tobits, Register a, int si16); // asserts UseSIGTRAP2042inline void twi( int tobits, Register a, int si16); // asserts UseSIGTRAP2043inline void td( int tobits, Register a, Register b); // asserts UseSIGTRAP2044inline void tw( int tobits, Register a, Register b); // asserts UseSIGTRAP20452046public:2047static bool is_tdi(int x, int tobits, int ra, int si16) {2048return (TDI_OPCODE == (x & TDI_OPCODE_MASK))2049&& (tobits == inv_to_field(x))2050&& (ra == -1/*any reg*/ || ra == inv_ra_field(x))2051&& (si16 == inv_si_field(x));2052}20532054static int tdi_get_si16(int x, int tobits, int ra) {2055if (TDI_OPCODE == (x & TDI_OPCODE_MASK)2056&& (tobits == inv_to_field(x))2057&& (ra == -1/*any reg*/ || ra == inv_ra_field(x))) {2058return inv_si_field(x);2059}2060return -1; // No valid tdi instruction.2061}20622063static bool is_twi(int x, int tobits, int ra, int si16) {2064return (TWI_OPCODE == (x & TWI_OPCODE_MASK))2065&& (tobits == inv_to_field(x))2066&& (ra == -1/*any reg*/ || ra == inv_ra_field(x))2067&& (si16 == inv_si_field(x));2068}20692070static bool is_twi(int x, int tobits, int ra) {2071return (TWI_OPCODE == (x & TWI_OPCODE_MASK))2072&& (tobits == inv_to_field(x))2073&& (ra == -1/*any reg*/ || ra == inv_ra_field(x));2074}20752076static bool is_td(int x, int tobits, int ra, int rb) {2077return (TD_OPCODE == (x & TD_OPCODE_MASK))2078&& (tobits == inv_to_field(x))2079&& (ra == -1/*any reg*/ || ra == inv_ra_field(x))2080&& (rb == -1/*any reg*/ || rb == inv_rb_field(x));2081}20822083static bool is_tw(int x, int tobits, int ra, int rb) {2084return (TW_OPCODE == (x & TW_OPCODE_MASK))2085&& (tobits == inv_to_field(x))2086&& (ra == -1/*any reg*/ || ra == inv_ra_field(x))2087&& (rb == -1/*any reg*/ || rb == inv_rb_field(x));2088}20892090// PPC floating point instructions2091// PPC 1, section 4.6.2 Floating-Point Load Instructions2092inline void lfs( FloatRegister d, int si16, Register a);2093inline void lfsu( FloatRegister d, int si16, Register a);2094inline void lfsx( FloatRegister d, Register a, Register b);2095inline void lfd( FloatRegister d, int si16, Register a);2096inline void lfdu( FloatRegister d, int si16, Register a);2097inline void lfdx( FloatRegister d, Register a, Register b);20982099// PPC 1, section 4.6.3 Floating-Point Store Instructions2100inline void stfs( FloatRegister s, int si16, Register a);2101inline void stfsu( FloatRegister s, int si16, Register a);2102inline void stfsx( FloatRegister s, Register a, Register b);2103inline void stfd( FloatRegister s, int si16, Register a);2104inline void stfdu( FloatRegister s, int si16, Register a);2105inline void stfdx( FloatRegister s, Register a, Register b);21062107// PPC 1, section 4.6.4 Floating-Point Move Instructions2108inline void fmr( FloatRegister d, FloatRegister b);2109inline void fmr_( FloatRegister d, FloatRegister b);21102111inline void frin( FloatRegister d, FloatRegister b);2112inline void frip( FloatRegister d, FloatRegister b);2113inline void frim( FloatRegister d, FloatRegister b);21142115// inline void mffgpr( FloatRegister d, Register b);2116// inline void mftgpr( Register d, FloatRegister b);2117inline void cmpb( Register a, Register s, Register b);2118inline void popcntb(Register a, Register s);2119inline void popcntw(Register a, Register s);2120inline void popcntd(Register a, Register s);21212122inline void fneg( FloatRegister d, FloatRegister b);2123inline void fneg_( FloatRegister d, FloatRegister b);2124inline void fabs( FloatRegister d, FloatRegister b);2125inline void fabs_( FloatRegister d, FloatRegister b);2126inline void fnabs( FloatRegister d, FloatRegister b);2127inline void fnabs_(FloatRegister d, FloatRegister b);21282129// PPC 1, section 4.6.5.1 Floating-Point Elementary Arithmetic Instructions2130inline void fadd( FloatRegister d, FloatRegister a, FloatRegister b);2131inline void fadd_( FloatRegister d, FloatRegister a, FloatRegister b);2132inline void fadds( FloatRegister d, FloatRegister a, FloatRegister b);2133inline void fadds_(FloatRegister d, FloatRegister a, FloatRegister b);2134inline void fsub( FloatRegister d, FloatRegister a, FloatRegister b);2135inline void fsub_( FloatRegister d, FloatRegister a, FloatRegister b);2136inline void fsubs( FloatRegister d, FloatRegister a, FloatRegister b);2137inline void fsubs_(FloatRegister d, FloatRegister a, FloatRegister b);2138inline void fmul( FloatRegister d, FloatRegister a, FloatRegister c);2139inline void fmul_( FloatRegister d, FloatRegister a, FloatRegister c);2140inline void fmuls( FloatRegister d, FloatRegister a, FloatRegister c);2141inline void fmuls_(FloatRegister d, FloatRegister a, FloatRegister c);2142inline void fdiv( FloatRegister d, FloatRegister a, FloatRegister b);2143inline void fdiv_( FloatRegister d, FloatRegister a, FloatRegister b);2144inline void fdivs( FloatRegister d, FloatRegister a, FloatRegister b);2145inline void fdivs_(FloatRegister d, FloatRegister a, FloatRegister b);21462147// Fused multiply-accumulate instructions.2148// WARNING: Use only when rounding between the 2 parts is not desired.2149// Some floating point tck tests will fail if used incorrectly.2150inline void fmadd( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);2151inline void fmadd_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);2152inline void fmadds( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);2153inline void fmadds_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);2154inline void fmsub( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);2155inline void fmsub_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);2156inline void fmsubs( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);2157inline void fmsubs_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);2158inline void fnmadd( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);2159inline void fnmadd_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);2160inline void fnmadds( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);2161inline void fnmadds_(FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);2162inline void fnmsub( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);2163inline void fnmsub_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);2164inline void fnmsubs( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);2165inline void fnmsubs_(FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);21662167// PPC 1, section 4.6.6 Floating-Point Rounding and Conversion Instructions2168inline void frsp( FloatRegister d, FloatRegister b);2169inline void fctid( FloatRegister d, FloatRegister b);2170inline void fctidz(FloatRegister d, FloatRegister b);2171inline void fctiw( FloatRegister d, FloatRegister b);2172inline void fctiwz(FloatRegister d, FloatRegister b);2173inline void fcfid( FloatRegister d, FloatRegister b);2174inline void fcfids(FloatRegister d, FloatRegister b);21752176// PPC 1, section 4.6.7 Floating-Point Compare Instructions2177inline void fcmpu( ConditionRegister crx, FloatRegister a, FloatRegister b);21782179inline void fsqrt( FloatRegister d, FloatRegister b);2180inline void fsqrts(FloatRegister d, FloatRegister b);21812182// Vector instructions for >= Power6.2183inline void lvebx( VectorRegister d, Register s1, Register s2);2184inline void lvehx( VectorRegister d, Register s1, Register s2);2185inline void lvewx( VectorRegister d, Register s1, Register s2);2186inline void lvx( VectorRegister d, Register s1, Register s2);2187inline void lvxl( VectorRegister d, Register s1, Register s2);2188inline void stvebx( VectorRegister d, Register s1, Register s2);2189inline void stvehx( VectorRegister d, Register s1, Register s2);2190inline void stvewx( VectorRegister d, Register s1, Register s2);2191inline void stvx( VectorRegister d, Register s1, Register s2);2192inline void stvxl( VectorRegister d, Register s1, Register s2);2193inline void lvsl( VectorRegister d, Register s1, Register s2);2194inline void lvsr( VectorRegister d, Register s1, Register s2);2195inline void vpkpx( VectorRegister d, VectorRegister a, VectorRegister b);2196inline void vpkshss( VectorRegister d, VectorRegister a, VectorRegister b);2197inline void vpkswss( VectorRegister d, VectorRegister a, VectorRegister b);2198inline void vpkshus( VectorRegister d, VectorRegister a, VectorRegister b);2199inline void vpkswus( VectorRegister d, VectorRegister a, VectorRegister b);2200inline void vpkuhum( VectorRegister d, VectorRegister a, VectorRegister b);2201inline void vpkuwum( VectorRegister d, VectorRegister a, VectorRegister b);2202inline void vpkuhus( VectorRegister d, VectorRegister a, VectorRegister b);2203inline void vpkuwus( VectorRegister d, VectorRegister a, VectorRegister b);2204inline void vupkhpx( VectorRegister d, VectorRegister b);2205inline void vupkhsb( VectorRegister d, VectorRegister b);2206inline void vupkhsh( VectorRegister d, VectorRegister b);2207inline void vupklpx( VectorRegister d, VectorRegister b);2208inline void vupklsb( VectorRegister d, VectorRegister b);2209inline void vupklsh( VectorRegister d, VectorRegister b);2210inline void vmrghb( VectorRegister d, VectorRegister a, VectorRegister b);2211inline void vmrghw( VectorRegister d, VectorRegister a, VectorRegister b);2212inline void vmrghh( VectorRegister d, VectorRegister a, VectorRegister b);2213inline void vmrglb( VectorRegister d, VectorRegister a, VectorRegister b);2214inline void vmrglw( VectorRegister d, VectorRegister a, VectorRegister b);2215inline void vmrglh( VectorRegister d, VectorRegister a, VectorRegister b);2216inline void vsplt( VectorRegister d, int ui4, VectorRegister b);2217inline void vsplth( VectorRegister d, int ui3, VectorRegister b);2218inline void vspltw( VectorRegister d, int ui2, VectorRegister b);2219inline void vspltisb( VectorRegister d, int si5);2220inline void vspltish( VectorRegister d, int si5);2221inline void vspltisw( VectorRegister d, int si5);2222inline void vperm( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);2223inline void vpextd( VectorRegister d, VectorRegister a, VectorRegister b);2224inline void vsel( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);2225inline void vsl( VectorRegister d, VectorRegister a, VectorRegister b);2226inline void vsldoi( VectorRegister d, VectorRegister a, VectorRegister b, int ui4);2227inline void vslo( VectorRegister d, VectorRegister a, VectorRegister b);2228inline void vsr( VectorRegister d, VectorRegister a, VectorRegister b);2229inline void vsro( VectorRegister d, VectorRegister a, VectorRegister b);2230inline void vaddcuw( VectorRegister d, VectorRegister a, VectorRegister b);2231inline void vaddshs( VectorRegister d, VectorRegister a, VectorRegister b);2232inline void vaddsbs( VectorRegister d, VectorRegister a, VectorRegister b);2233inline void vaddsws( VectorRegister d, VectorRegister a, VectorRegister b);2234inline void vaddubm( VectorRegister d, VectorRegister a, VectorRegister b);2235inline void vadduwm( VectorRegister d, VectorRegister a, VectorRegister b);2236inline void vadduhm( VectorRegister d, VectorRegister a, VectorRegister b);2237inline void vaddudm( VectorRegister d, VectorRegister a, VectorRegister b);2238inline void vaddubs( VectorRegister d, VectorRegister a, VectorRegister b);2239inline void vadduws( VectorRegister d, VectorRegister a, VectorRegister b);2240inline void vadduhs( VectorRegister d, VectorRegister a, VectorRegister b);2241inline void vaddfp( VectorRegister d, VectorRegister a, VectorRegister b);2242inline void vsubcuw( VectorRegister d, VectorRegister a, VectorRegister b);2243inline void vsubshs( VectorRegister d, VectorRegister a, VectorRegister b);2244inline void vsubsbs( VectorRegister d, VectorRegister a, VectorRegister b);2245inline void vsubsws( VectorRegister d, VectorRegister a, VectorRegister b);2246inline void vsububm( VectorRegister d, VectorRegister a, VectorRegister b);2247inline void vsubuwm( VectorRegister d, VectorRegister a, VectorRegister b);2248inline void vsubuhm( VectorRegister d, VectorRegister a, VectorRegister b);2249inline void vsubudm( VectorRegister d, VectorRegister a, VectorRegister b);2250inline void vsububs( VectorRegister d, VectorRegister a, VectorRegister b);2251inline void vsubuws( VectorRegister d, VectorRegister a, VectorRegister b);2252inline void vsubuhs( VectorRegister d, VectorRegister a, VectorRegister b);2253inline void vsubfp( VectorRegister d, VectorRegister a, VectorRegister b);2254inline void vmulesb( VectorRegister d, VectorRegister a, VectorRegister b);2255inline void vmuleub( VectorRegister d, VectorRegister a, VectorRegister b);2256inline void vmulesh( VectorRegister d, VectorRegister a, VectorRegister b);2257inline void vmuleuh( VectorRegister d, VectorRegister a, VectorRegister b);2258inline void vmulosb( VectorRegister d, VectorRegister a, VectorRegister b);2259inline void vmuloub( VectorRegister d, VectorRegister a, VectorRegister b);2260inline void vmulosh( VectorRegister d, VectorRegister a, VectorRegister b);2261inline void vmulosw( VectorRegister d, VectorRegister a, VectorRegister b);2262inline void vmulouh( VectorRegister d, VectorRegister a, VectorRegister b);2263inline void vmuluwm( VectorRegister d, VectorRegister a, VectorRegister b);2264inline void vmhaddshs(VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);2265inline void vmhraddshs(VectorRegister d,VectorRegister a, VectorRegister b, VectorRegister c);2266inline void vmladduhm(VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);2267inline void vmsubuhm( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);2268inline void vmsummbm( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);2269inline void vmsumshm( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);2270inline void vmsumshs( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);2271inline void vmsumuhm( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);2272inline void vmsumuhs( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);2273inline void vmaddfp( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);2274inline void vsumsws( VectorRegister d, VectorRegister a, VectorRegister b);2275inline void vsum2sws( VectorRegister d, VectorRegister a, VectorRegister b);2276inline void vsum4sbs( VectorRegister d, VectorRegister a, VectorRegister b);2277inline void vsum4ubs( VectorRegister d, VectorRegister a, VectorRegister b);2278inline void vsum4shs( VectorRegister d, VectorRegister a, VectorRegister b);2279inline void vavgsb( VectorRegister d, VectorRegister a, VectorRegister b);2280inline void vavgsw( VectorRegister d, VectorRegister a, VectorRegister b);2281inline void vavgsh( VectorRegister d, VectorRegister a, VectorRegister b);2282inline void vavgub( VectorRegister d, VectorRegister a, VectorRegister b);2283inline void vavguw( VectorRegister d, VectorRegister a, VectorRegister b);2284inline void vavguh( VectorRegister d, VectorRegister a, VectorRegister b);2285inline void vmaxsb( VectorRegister d, VectorRegister a, VectorRegister b);2286inline void vmaxsw( VectorRegister d, VectorRegister a, VectorRegister b);2287inline void vmaxsh( VectorRegister d, VectorRegister a, VectorRegister b);2288inline void vmaxub( VectorRegister d, VectorRegister a, VectorRegister b);2289inline void vmaxuw( VectorRegister d, VectorRegister a, VectorRegister b);2290inline void vmaxuh( VectorRegister d, VectorRegister a, VectorRegister b);2291inline void vminsb( VectorRegister d, VectorRegister a, VectorRegister b);2292inline void vminsw( VectorRegister d, VectorRegister a, VectorRegister b);2293inline void vminsh( VectorRegister d, VectorRegister a, VectorRegister b);2294inline void vminub( VectorRegister d, VectorRegister a, VectorRegister b);2295inline void vminuw( VectorRegister d, VectorRegister a, VectorRegister b);2296inline void vminuh( VectorRegister d, VectorRegister a, VectorRegister b);2297inline void vcmpequb( VectorRegister d, VectorRegister a, VectorRegister b);2298inline void vcmpequh( VectorRegister d, VectorRegister a, VectorRegister b);2299inline void vcmpequw( VectorRegister d, VectorRegister a, VectorRegister b);2300inline void vcmpgtsh( VectorRegister d, VectorRegister a, VectorRegister b);2301inline void vcmpgtsb( VectorRegister d, VectorRegister a, VectorRegister b);2302inline void vcmpgtsw( VectorRegister d, VectorRegister a, VectorRegister b);2303inline void vcmpgtub( VectorRegister d, VectorRegister a, VectorRegister b);2304inline void vcmpgtuh( VectorRegister d, VectorRegister a, VectorRegister b);2305inline void vcmpgtuw( VectorRegister d, VectorRegister a, VectorRegister b);2306inline void vcmpequb_(VectorRegister d, VectorRegister a, VectorRegister b);2307inline void vcmpequh_(VectorRegister d, VectorRegister a, VectorRegister b);2308inline void vcmpequw_(VectorRegister d, VectorRegister a, VectorRegister b);2309inline void vcmpgtsh_(VectorRegister d, VectorRegister a, VectorRegister b);2310inline void vcmpgtsb_(VectorRegister d, VectorRegister a, VectorRegister b);2311inline void vcmpgtsw_(VectorRegister d, VectorRegister a, VectorRegister b);2312inline void vcmpgtub_(VectorRegister d, VectorRegister a, VectorRegister b);2313inline void vcmpgtuh_(VectorRegister d, VectorRegister a, VectorRegister b);2314inline void vcmpgtuw_(VectorRegister d, VectorRegister a, VectorRegister b);2315inline void vand( VectorRegister d, VectorRegister a, VectorRegister b);2316inline void vandc( VectorRegister d, VectorRegister a, VectorRegister b);2317inline void vnor( VectorRegister d, VectorRegister a, VectorRegister b);2318inline void vor( VectorRegister d, VectorRegister a, VectorRegister b);2319inline void vmr( VectorRegister d, VectorRegister a);2320inline void vxor( VectorRegister d, VectorRegister a, VectorRegister b);2321inline void vrld( VectorRegister d, VectorRegister a, VectorRegister b);2322inline void vrlb( VectorRegister d, VectorRegister a, VectorRegister b);2323inline void vrlw( VectorRegister d, VectorRegister a, VectorRegister b);2324inline void vrlh( VectorRegister d, VectorRegister a, VectorRegister b);2325inline void vslb( VectorRegister d, VectorRegister a, VectorRegister b);2326inline void vskw( VectorRegister d, VectorRegister a, VectorRegister b);2327inline void vslh( VectorRegister d, VectorRegister a, VectorRegister b);2328inline void vsrb( VectorRegister d, VectorRegister a, VectorRegister b);2329inline void vsrw( VectorRegister d, VectorRegister a, VectorRegister b);2330inline void vsrh( VectorRegister d, VectorRegister a, VectorRegister b);2331inline void vsrab( VectorRegister d, VectorRegister a, VectorRegister b);2332inline void vsraw( VectorRegister d, VectorRegister a, VectorRegister b);2333inline void vsrah( VectorRegister d, VectorRegister a, VectorRegister b);2334inline void vpopcntw( VectorRegister d, VectorRegister b);2335// Vector Floating-Point not implemented yet2336inline void mtvscr( VectorRegister b);2337inline void mfvscr( VectorRegister d);23382339// Vector-Scalar (VSX) instructions.2340inline void lxv( VectorSRegister d, int si16, Register a);2341inline void stxv( VectorSRegister d, int si16, Register a);2342inline void lxvl( VectorSRegister d, Register a, Register b);2343inline void stxvl( VectorSRegister d, Register a, Register b);2344inline void lxvd2x( VectorSRegister d, Register a);2345inline void lxvd2x( VectorSRegister d, Register a, Register b);2346inline void stxvd2x( VectorSRegister d, Register a);2347inline void stxvd2x( VectorSRegister d, Register a, Register b);2348inline void mtvrwz( VectorRegister d, Register a);2349inline void mfvrwz( Register a, VectorRegister d);2350inline void mtvrd( VectorRegister d, Register a);2351inline void mfvrd( Register a, VectorRegister d);2352inline void xxperm( VectorSRegister d, VectorSRegister a, VectorSRegister b);2353inline void xxpermdi( VectorSRegister d, VectorSRegister a, VectorSRegister b, int dm);2354inline void xxmrghw( VectorSRegister d, VectorSRegister a, VectorSRegister b);2355inline void xxmrglw( VectorSRegister d, VectorSRegister a, VectorSRegister b);2356inline void mtvsrd( VectorSRegister d, Register a);2357inline void mfvsrd( Register d, VectorSRegister a);2358inline void mtvsrdd( VectorSRegister d, Register a, Register b);2359inline void mtvsrwz( VectorSRegister d, Register a);2360inline void mfvsrwz( Register d, VectorSRegister a);2361inline void xxspltw( VectorSRegister d, VectorSRegister b, int ui2);2362inline void xxlor( VectorSRegister d, VectorSRegister a, VectorSRegister b);2363inline void xxlxor( VectorSRegister d, VectorSRegister a, VectorSRegister b);2364inline void xxleqv( VectorSRegister d, VectorSRegister a, VectorSRegister b);2365inline void xxbrd( VectorSRegister d, VectorSRegister b);2366inline void xxbrw( VectorSRegister d, VectorSRegister b);2367inline void xxland( VectorSRegister d, VectorSRegister a, VectorSRegister b);2368inline void xxsel( VectorSRegister d, VectorSRegister a, VectorSRegister b, VectorSRegister c);2369inline void xxspltib( VectorSRegister d, int ui8);2370inline void xvdivsp( VectorSRegister d, VectorSRegister a, VectorSRegister b);2371inline void xvdivdp( VectorSRegister d, VectorSRegister a, VectorSRegister b);2372inline void xvabssp( VectorSRegister d, VectorSRegister b);2373inline void xvabsdp( VectorSRegister d, VectorSRegister b);2374inline void xvnegsp( VectorSRegister d, VectorSRegister b);2375inline void xvnegdp( VectorSRegister d, VectorSRegister b);2376inline void xvsqrtsp( VectorSRegister d, VectorSRegister b);2377inline void xvsqrtdp( VectorSRegister d, VectorSRegister b);2378inline void xscvdpspn(VectorSRegister d, VectorSRegister b);2379inline void xvadddp( VectorSRegister d, VectorSRegister a, VectorSRegister b);2380inline void xvsubdp( VectorSRegister d, VectorSRegister a, VectorSRegister b);2381inline void xvmulsp( VectorSRegister d, VectorSRegister a, VectorSRegister b);2382inline void xvmuldp( VectorSRegister d, VectorSRegister a, VectorSRegister b);2383inline void xvmaddasp(VectorSRegister d, VectorSRegister a, VectorSRegister b);2384inline void xvmaddadp(VectorSRegister d, VectorSRegister a, VectorSRegister b);2385inline void xvmsubasp(VectorSRegister d, VectorSRegister a, VectorSRegister b);2386inline void xvmsubadp(VectorSRegister d, VectorSRegister a, VectorSRegister b);2387inline void xvnmsubasp(VectorSRegister d, VectorSRegister a, VectorSRegister b);2388inline void xvnmsubadp(VectorSRegister d, VectorSRegister a, VectorSRegister b);2389inline void xvrdpi( VectorSRegister d, VectorSRegister b);2390inline void xvrdpic( VectorSRegister d, VectorSRegister b);2391inline void xvrdpim( VectorSRegister d, VectorSRegister b);2392inline void xvrdpip( VectorSRegister d, VectorSRegister b);23932394// VSX Extended Mnemonics2395inline void xxspltd( VectorSRegister d, VectorSRegister a, int x);2396inline void xxmrghd( VectorSRegister d, VectorSRegister a, VectorSRegister b);2397inline void xxmrgld( VectorSRegister d, VectorSRegister a, VectorSRegister b);2398inline void xxswapd( VectorSRegister d, VectorSRegister a);23992400// Vector-Scalar (VSX) instructions.2401inline void mtfprd( FloatRegister d, Register a);2402inline void mtfprwa( FloatRegister d, Register a);2403inline void mffprd( Register a, FloatRegister d);24042405// Deliver A Random Number (introduced with POWER9)2406inline void darn( Register d, int l = 1 /*L=CRN*/);24072408// AES (introduced with Power 8)2409inline void vcipher( VectorRegister d, VectorRegister a, VectorRegister b);2410inline void vcipherlast( VectorRegister d, VectorRegister a, VectorRegister b);2411inline void vncipher( VectorRegister d, VectorRegister a, VectorRegister b);2412inline void vncipherlast(VectorRegister d, VectorRegister a, VectorRegister b);2413inline void vsbox( VectorRegister d, VectorRegister a);24142415// SHA (introduced with Power 8)2416inline void vshasigmad(VectorRegister d, VectorRegister a, bool st, int six);2417inline void vshasigmaw(VectorRegister d, VectorRegister a, bool st, int six);24182419// Vector Binary Polynomial Multiplication (introduced with Power 8)2420inline void vpmsumb( VectorRegister d, VectorRegister a, VectorRegister b);2421inline void vpmsumd( VectorRegister d, VectorRegister a, VectorRegister b);2422inline void vpmsumh( VectorRegister d, VectorRegister a, VectorRegister b);2423inline void vpmsumw( VectorRegister d, VectorRegister a, VectorRegister b);24242425// Vector Permute and Xor (introduced with Power 8)2426inline void vpermxor( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);24272428// Transactional Memory instructions (introduced with Power 8)2429inline void tbegin_(); // R=02430inline void tbeginrot_(); // R=1 Rollback-Only Transaction2431inline void tend_(); // A=02432inline void tendall_(); // A=12433inline void tabort_();2434inline void tabort_(Register a);2435inline void tabortwc_(int t, Register a, Register b);2436inline void tabortwci_(int t, Register a, int si);2437inline void tabortdc_(int t, Register a, Register b);2438inline void tabortdci_(int t, Register a, int si);2439inline void tsuspend_(); // tsr with L=02440inline void tresume_(); // tsr with L=12441inline void tcheck(int f);24422443static bool is_tbegin(int x) {2444return TBEGIN_OPCODE == (x & (0x3f << OPCODE_SHIFT | 0x3ff << 1));2445}24462447// The following encoders use r0 as second operand. These instructions2448// read r0 as '0'.2449inline void lwzx( Register d, Register s2);2450inline void lwz( Register d, int si16);2451inline void lwax( Register d, Register s2);2452inline void lwa( Register d, int si16);2453inline void lwbrx(Register d, Register s2);2454inline void lhzx( Register d, Register s2);2455inline void lhz( Register d, int si16);2456inline void lhax( Register d, Register s2);2457inline void lha( Register d, int si16);2458inline void lhbrx(Register d, Register s2);2459inline void lbzx( Register d, Register s2);2460inline void lbz( Register d, int si16);2461inline void ldx( Register d, Register s2);2462inline void ld( Register d, int si16);2463inline void ldbrx(Register d, Register s2);2464inline void stwx( Register d, Register s2);2465inline void stw( Register d, int si16);2466inline void stwbrx( Register d, Register s2);2467inline void sthx( Register d, Register s2);2468inline void sth( Register d, int si16);2469inline void sthbrx( Register d, Register s2);2470inline void stbx( Register d, Register s2);2471inline void stb( Register d, int si16);2472inline void stdx( Register d, Register s2);2473inline void std( Register d, int si16);2474inline void stdbrx( Register d, Register s2);24752476// PPC 2, section 3.2.1 Instruction Cache Instructions2477inline void icbi( Register s2);2478// PPC 2, section 3.2.2 Data Cache Instructions2479//inlinevoid dcba( Register s2); // Instruction for embedded processor only.2480inline void dcbz( Register s2);2481inline void dcbst( Register s2);2482inline void dcbf( Register s2);2483// dcache read hint2484inline void dcbt( Register s2);2485inline void dcbtct( Register s2, int ct);2486inline void dcbtds( Register s2, int ds);2487// dcache write hint2488inline void dcbtst( Register s2);2489inline void dcbtstct(Register s2, int ct);24902491// Atomics: use ra0mem to disallow R0 as base.2492inline void lbarx_unchecked(Register d, Register b, int eh1);2493inline void lharx_unchecked(Register d, Register b, int eh1);2494inline void lwarx_unchecked(Register d, Register b, int eh1);2495inline void ldarx_unchecked(Register d, Register b, int eh1);2496inline void lqarx_unchecked(Register d, Register b, int eh1);2497inline void lbarx( Register d, Register b, bool hint_exclusive_access);2498inline void lharx( Register d, Register b, bool hint_exclusive_access);2499inline void lwarx( Register d, Register b, bool hint_exclusive_access);2500inline void ldarx( Register d, Register b, bool hint_exclusive_access);2501inline void lqarx( Register d, Register b, bool hint_exclusive_access);2502inline void stbcx_(Register s, Register b);2503inline void sthcx_(Register s, Register b);2504inline void stwcx_(Register s, Register b);2505inline void stdcx_(Register s, Register b);2506inline void stqcx_(Register s, Register b);2507inline void lfs( FloatRegister d, int si16);2508inline void lfsx( FloatRegister d, Register b);2509inline void lfd( FloatRegister d, int si16);2510inline void lfdx( FloatRegister d, Register b);2511inline void stfs( FloatRegister s, int si16);2512inline void stfsx( FloatRegister s, Register b);2513inline void stfd( FloatRegister s, int si16);2514inline void stfdx( FloatRegister s, Register b);2515inline void lvebx( VectorRegister d, Register s2);2516inline void lvehx( VectorRegister d, Register s2);2517inline void lvewx( VectorRegister d, Register s2);2518inline void lvx( VectorRegister d, Register s2);2519inline void lvxl( VectorRegister d, Register s2);2520inline void stvebx(VectorRegister d, Register s2);2521inline void stvehx(VectorRegister d, Register s2);2522inline void stvewx(VectorRegister d, Register s2);2523inline void stvx( VectorRegister d, Register s2);2524inline void stvxl( VectorRegister d, Register s2);2525inline void lvsl( VectorRegister d, Register s2);2526inline void lvsr( VectorRegister d, Register s2);25272528// Endianess specific concatenation of 2 loaded vectors.2529inline void load_perm(VectorRegister perm, Register addr);2530inline void vec_perm(VectorRegister first_dest, VectorRegister second, VectorRegister perm);2531inline void vec_perm(VectorRegister dest, VectorRegister first, VectorRegister second, VectorRegister perm);25322533// RegisterOrConstant versions.2534// These emitters choose between the versions using two registers and2535// those with register and immediate, depending on the content of roc.2536// If the constant is not encodable as immediate, instructions to2537// load the constant are emitted beforehand. Store instructions need a2538// tmp reg if the constant is not encodable as immediate.2539// Size unpredictable.2540void ld( Register d, RegisterOrConstant roc, Register s1 = noreg);2541void lwa( Register d, RegisterOrConstant roc, Register s1 = noreg);2542void lwz( Register d, RegisterOrConstant roc, Register s1 = noreg);2543void lha( Register d, RegisterOrConstant roc, Register s1 = noreg);2544void lhz( Register d, RegisterOrConstant roc, Register s1 = noreg);2545void lbz( Register d, RegisterOrConstant roc, Register s1 = noreg);2546void std( Register d, RegisterOrConstant roc, Register s1 = noreg, Register tmp = noreg);2547void stw( Register d, RegisterOrConstant roc, Register s1 = noreg, Register tmp = noreg);2548void sth( Register d, RegisterOrConstant roc, Register s1 = noreg, Register tmp = noreg);2549void stb( Register d, RegisterOrConstant roc, Register s1 = noreg, Register tmp = noreg);2550void add( Register d, RegisterOrConstant roc, Register s1);2551void subf(Register d, RegisterOrConstant roc, Register s1);2552void cmpd(ConditionRegister d, RegisterOrConstant roc, Register s1);2553// Load pointer d from s1+roc.2554void ld_ptr(Register d, RegisterOrConstant roc, Register s1 = noreg) { ld(d, roc, s1); }25552556// Emit several instructions to load a 64 bit constant. This issues a fixed2557// instruction pattern so that the constant can be patched later on.2558enum {2559load_const_size = 5 * BytesPerInstWord2560};2561void load_const(Register d, long a, Register tmp = noreg);2562inline void load_const(Register d, void* a, Register tmp = noreg);2563inline void load_const(Register d, Label& L, Register tmp = noreg);2564inline void load_const(Register d, AddressLiteral& a, Register tmp = noreg);2565inline void load_const32(Register d, int i); // load signed int (patchable)25662567// Load a 64 bit constant, optimized, not identifyable.2568// Tmp can be used to increase ILP. Set return_simm16_rest = true to get a2569// 16 bit immediate offset. This is useful if the offset can be encoded in2570// a succeeding instruction.2571int load_const_optimized(Register d, long a, Register tmp = noreg, bool return_simm16_rest = false);2572inline int load_const_optimized(Register d, void* a, Register tmp = noreg, bool return_simm16_rest = false) {2573return load_const_optimized(d, (long)(unsigned long)a, tmp, return_simm16_rest);2574}25752576// If return_simm16_rest, the return value needs to get added afterwards.2577int add_const_optimized(Register d, Register s, long x, Register tmp = R0, bool return_simm16_rest = false);2578inline int add_const_optimized(Register d, Register s, void* a, Register tmp = R0, bool return_simm16_rest = false) {2579return add_const_optimized(d, s, (long)(unsigned long)a, tmp, return_simm16_rest);2580}25812582// If return_simm16_rest, the return value needs to get added afterwards.2583inline int sub_const_optimized(Register d, Register s, long x, Register tmp = R0, bool return_simm16_rest = false) {2584return add_const_optimized(d, s, -x, tmp, return_simm16_rest);2585}2586inline int sub_const_optimized(Register d, Register s, void* a, Register tmp = R0, bool return_simm16_rest = false) {2587return sub_const_optimized(d, s, (long)(unsigned long)a, tmp, return_simm16_rest);2588}25892590// Creation2591Assembler(CodeBuffer* code) : AbstractAssembler(code) {2592#ifdef CHECK_DELAY2593delay_state = no_delay;2594#endif2595}25962597// Testing2598#ifndef PRODUCT2599void test_asm();2600#endif2601};260226032604#endif // CPU_PPC_ASSEMBLER_PPC_HPP260526062607