Path: blob/master/src/hotspot/cpu/x86/assembler_x86.cpp
64440 views
/*1* Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#include "precompiled.hpp"25#include "asm/assembler.hpp"26#include "asm/assembler.inline.hpp"27#include "gc/shared/cardTableBarrierSet.hpp"28#include "gc/shared/collectedHeap.inline.hpp"29#include "interpreter/interpreter.hpp"30#include "memory/resourceArea.hpp"31#include "prims/methodHandles.hpp"32#include "runtime/biasedLocking.hpp"33#include "runtime/objectMonitor.hpp"34#include "runtime/os.hpp"35#include "runtime/sharedRuntime.hpp"36#include "runtime/stubRoutines.hpp"37#include "runtime/vm_version.hpp"38#include "utilities/macros.hpp"3940#ifdef PRODUCT41#define BLOCK_COMMENT(str) /* nothing */42#define STOP(error) stop(error)43#else44#define BLOCK_COMMENT(str) block_comment(str)45#define STOP(error) block_comment(error); stop(error)46#endif4748#define BIND(label) bind(label); BLOCK_COMMENT(#label ":")49// Implementation of AddressLiteral5051// A 2-D table for managing compressed displacement(disp8) on EVEX enabled platforms.52unsigned char tuple_table[Assembler::EVEX_ETUP + 1][Assembler::AVX_512bit + 1] = {53// -----------------Table 4.5 -------------------- //5416, 32, 64, // EVEX_FV(0)554, 4, 4, // EVEX_FV(1) - with Evex.b5616, 32, 64, // EVEX_FV(2) - with Evex.w578, 8, 8, // EVEX_FV(3) - with Evex.w and Evex.b588, 16, 32, // EVEX_HV(0)594, 4, 4, // EVEX_HV(1) - with Evex.b60// -----------------Table 4.6 -------------------- //6116, 32, 64, // EVEX_FVM(0)621, 1, 1, // EVEX_T1S(0)632, 2, 2, // EVEX_T1S(1)644, 4, 4, // EVEX_T1S(2)658, 8, 8, // EVEX_T1S(3)664, 4, 4, // EVEX_T1F(0)678, 8, 8, // EVEX_T1F(1)688, 8, 8, // EVEX_T2(0)690, 16, 16, // EVEX_T2(1)700, 16, 16, // EVEX_T4(0)710, 0, 32, // EVEX_T4(1)720, 0, 32, // EVEX_T8(0)738, 16, 32, // EVEX_HVM(0)744, 8, 16, // EVEX_QVM(0)752, 4, 8, // EVEX_OVM(0)7616, 16, 16, // EVEX_M128(0)778, 32, 64, // EVEX_DUP(0)780, 0, 0 // EVEX_NTUP79};8081AddressLiteral::AddressLiteral(address target, relocInfo::relocType rtype) {82_is_lval = false;83_target = target;84switch (rtype) {85case relocInfo::oop_type:86case relocInfo::metadata_type:87// Oops are a special case. Normally they would be their own section88// but in cases like icBuffer they are literals in the code stream that89// we don't have a section for. We use none so that we get a literal address90// which is always patchable.91break;92case relocInfo::external_word_type:93_rspec = external_word_Relocation::spec(target);94break;95case relocInfo::internal_word_type:96_rspec = internal_word_Relocation::spec(target);97break;98case relocInfo::opt_virtual_call_type:99_rspec = opt_virtual_call_Relocation::spec();100break;101case relocInfo::static_call_type:102_rspec = static_call_Relocation::spec();103break;104case relocInfo::runtime_call_type:105_rspec = runtime_call_Relocation::spec();106break;107case relocInfo::poll_type:108case relocInfo::poll_return_type:109_rspec = Relocation::spec_simple(rtype);110break;111case relocInfo::none:112break;113default:114ShouldNotReachHere();115break;116}117}118119// Implementation of Address120121#ifdef _LP64122123Address Address::make_array(ArrayAddress adr) {124// Not implementable on 64bit machines125// Should have been handled higher up the call chain.126ShouldNotReachHere();127return Address();128}129130// exceedingly dangerous constructor131Address::Address(int disp, address loc, relocInfo::relocType rtype) {132_base = noreg;133_index = noreg;134_scale = no_scale;135_disp = disp;136_xmmindex = xnoreg;137_isxmmindex = false;138switch (rtype) {139case relocInfo::external_word_type:140_rspec = external_word_Relocation::spec(loc);141break;142case relocInfo::internal_word_type:143_rspec = internal_word_Relocation::spec(loc);144break;145case relocInfo::runtime_call_type:146// HMM147_rspec = runtime_call_Relocation::spec();148break;149case relocInfo::poll_type:150case relocInfo::poll_return_type:151_rspec = Relocation::spec_simple(rtype);152break;153case relocInfo::none:154break;155default:156ShouldNotReachHere();157}158}159#else // LP64160161Address Address::make_array(ArrayAddress adr) {162AddressLiteral base = adr.base();163Address index = adr.index();164assert(index._disp == 0, "must not have disp"); // maybe it can?165Address array(index._base, index._index, index._scale, (intptr_t) base.target());166array._rspec = base._rspec;167return array;168}169170// exceedingly dangerous constructor171Address::Address(address loc, RelocationHolder spec) {172_base = noreg;173_index = noreg;174_scale = no_scale;175_disp = (intptr_t) loc;176_rspec = spec;177_xmmindex = xnoreg;178_isxmmindex = false;179}180181#endif // _LP64182183184185// Convert the raw encoding form into the form expected by the constructor for186// Address. An index of 4 (rsp) corresponds to having no index, so convert187// that to noreg for the Address constructor.188Address Address::make_raw(int base, int index, int scale, int disp, relocInfo::relocType disp_reloc) {189RelocationHolder rspec = RelocationHolder::none;190if (disp_reloc != relocInfo::none) {191rspec = Relocation::spec_simple(disp_reloc);192}193bool valid_index = index != rsp->encoding();194if (valid_index) {195Address madr(as_Register(base), as_Register(index), (Address::ScaleFactor)scale, in_ByteSize(disp));196madr._rspec = rspec;197return madr;198} else {199Address madr(as_Register(base), noreg, Address::no_scale, in_ByteSize(disp));200madr._rspec = rspec;201return madr;202}203}204205// Implementation of Assembler206207int AbstractAssembler::code_fill_byte() {208return (u_char)'\xF4'; // hlt209}210211void Assembler::init_attributes(void) {212_legacy_mode_bw = (VM_Version::supports_avx512bw() == false);213_legacy_mode_dq = (VM_Version::supports_avx512dq() == false);214_legacy_mode_vl = (VM_Version::supports_avx512vl() == false);215_legacy_mode_vlbw = (VM_Version::supports_avx512vlbw() == false);216NOT_LP64(_is_managed = false;)217_attributes = NULL;218}219220221void Assembler::membar(Membar_mask_bits order_constraint) {222// We only have to handle StoreLoad223if (order_constraint & StoreLoad) {224// All usable chips support "locked" instructions which suffice225// as barriers, and are much faster than the alternative of226// using cpuid instruction. We use here a locked add [esp-C],0.227// This is conveniently otherwise a no-op except for blowing228// flags, and introducing a false dependency on target memory229// location. We can't do anything with flags, but we can avoid230// memory dependencies in the current method by locked-adding231// somewhere else on the stack. Doing [esp+C] will collide with232// something on stack in current method, hence we go for [esp-C].233// It is convenient since it is almost always in data cache, for234// any small C. We need to step back from SP to avoid data235// dependencies with other things on below SP (callee-saves, for236// example). Without a clear way to figure out the minimal safe237// distance from SP, it makes sense to step back the complete238// cache line, as this will also avoid possible second-order effects239// with locked ops against the cache line. Our choice of offset240// is bounded by x86 operand encoding, which should stay within241// [-128; +127] to have the 8-byte displacement encoding.242//243// Any change to this code may need to revisit other places in244// the code where this idiom is used, in particular the245// orderAccess code.246247int offset = -VM_Version::L1_line_size();248if (offset < -128) {249offset = -128;250}251252lock();253addl(Address(rsp, offset), 0);// Assert the lock# signal here254}255}256257// make this go away someday258void Assembler::emit_data(jint data, relocInfo::relocType rtype, int format) {259if (rtype == relocInfo::none)260emit_int32(data);261else262emit_data(data, Relocation::spec_simple(rtype), format);263}264265void Assembler::emit_data(jint data, RelocationHolder const& rspec, int format) {266assert(imm_operand == 0, "default format must be immediate in this file");267assert(inst_mark() != NULL, "must be inside InstructionMark");268if (rspec.type() != relocInfo::none) {269#ifdef ASSERT270check_relocation(rspec, format);271#endif272// Do not use AbstractAssembler::relocate, which is not intended for273// embedded words. Instead, relocate to the enclosing instruction.274275// hack. call32 is too wide for mask so use disp32276if (format == call32_operand)277code_section()->relocate(inst_mark(), rspec, disp32_operand);278else279code_section()->relocate(inst_mark(), rspec, format);280}281emit_int32(data);282}283284static int encode(Register r) {285int enc = r->encoding();286if (enc >= 8) {287enc -= 8;288}289return enc;290}291292void Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) {293assert(dst->has_byte_register(), "must have byte register");294assert(isByte(op1) && isByte(op2), "wrong opcode");295assert(isByte(imm8), "not a byte");296assert((op1 & 0x01) == 0, "should be 8bit operation");297emit_int24(op1, (op2 | encode(dst)), imm8);298}299300301void Assembler::emit_arith(int op1, int op2, Register dst, int32_t imm32) {302assert(isByte(op1) && isByte(op2), "wrong opcode");303assert((op1 & 0x01) == 1, "should be 32bit operation");304assert((op1 & 0x02) == 0, "sign-extension bit should not be set");305if (is8bit(imm32)) {306emit_int24(op1 | 0x02, // set sign bit307op2 | encode(dst),308imm32 & 0xFF);309} else {310emit_int16(op1, (op2 | encode(dst)));311emit_int32(imm32);312}313}314315// Force generation of a 4 byte immediate value even if it fits into 8bit316void Assembler::emit_arith_imm32(int op1, int op2, Register dst, int32_t imm32) {317assert(isByte(op1) && isByte(op2), "wrong opcode");318assert((op1 & 0x01) == 1, "should be 32bit operation");319assert((op1 & 0x02) == 0, "sign-extension bit should not be set");320emit_int16(op1, (op2 | encode(dst)));321emit_int32(imm32);322}323324// immediate-to-memory forms325void Assembler::emit_arith_operand(int op1, Register rm, Address adr, int32_t imm32) {326assert((op1 & 0x01) == 1, "should be 32bit operation");327assert((op1 & 0x02) == 0, "sign-extension bit should not be set");328if (is8bit(imm32)) {329emit_int8(op1 | 0x02); // set sign bit330emit_operand(rm, adr, 1);331emit_int8(imm32 & 0xFF);332} else {333emit_int8(op1);334emit_operand(rm, adr, 4);335emit_int32(imm32);336}337}338339340void Assembler::emit_arith(int op1, int op2, Register dst, Register src) {341assert(isByte(op1) && isByte(op2), "wrong opcode");342emit_int16(op1, (op2 | encode(dst) << 3 | encode(src)));343}344345346bool Assembler::query_compressed_disp_byte(int disp, bool is_evex_inst, int vector_len,347int cur_tuple_type, int in_size_in_bits, int cur_encoding) {348int mod_idx = 0;349// We will test if the displacement fits the compressed format and if so350// apply the compression to the displacment iff the result is8bit.351if (VM_Version::supports_evex() && is_evex_inst) {352switch (cur_tuple_type) {353case EVEX_FV:354if ((cur_encoding & VEX_W) == VEX_W) {355mod_idx = ((cur_encoding & EVEX_Rb) == EVEX_Rb) ? 3 : 2;356} else {357mod_idx = ((cur_encoding & EVEX_Rb) == EVEX_Rb) ? 1 : 0;358}359break;360361case EVEX_HV:362mod_idx = ((cur_encoding & EVEX_Rb) == EVEX_Rb) ? 1 : 0;363break;364365case EVEX_FVM:366break;367368case EVEX_T1S:369switch (in_size_in_bits) {370case EVEX_8bit:371break;372373case EVEX_16bit:374mod_idx = 1;375break;376377case EVEX_32bit:378mod_idx = 2;379break;380381case EVEX_64bit:382mod_idx = 3;383break;384}385break;386387case EVEX_T1F:388case EVEX_T2:389case EVEX_T4:390mod_idx = (in_size_in_bits == EVEX_64bit) ? 1 : 0;391break;392393case EVEX_T8:394break;395396case EVEX_HVM:397break;398399case EVEX_QVM:400break;401402case EVEX_OVM:403break;404405case EVEX_M128:406break;407408case EVEX_DUP:409break;410411default:412assert(0, "no valid evex tuple_table entry");413break;414}415416if (vector_len >= AVX_128bit && vector_len <= AVX_512bit) {417int disp_factor = tuple_table[cur_tuple_type + mod_idx][vector_len];418if ((disp % disp_factor) == 0) {419int new_disp = disp / disp_factor;420if ((-0x80 <= new_disp && new_disp < 0x80)) {421disp = new_disp;422}423} else {424return false;425}426}427}428return (-0x80 <= disp && disp < 0x80);429}430431432bool Assembler::emit_compressed_disp_byte(int &disp) {433int mod_idx = 0;434// We will test if the displacement fits the compressed format and if so435// apply the compression to the displacment iff the result is8bit.436if (VM_Version::supports_evex() && _attributes && _attributes->is_evex_instruction()) {437int evex_encoding = _attributes->get_evex_encoding();438int tuple_type = _attributes->get_tuple_type();439switch (tuple_type) {440case EVEX_FV:441if ((evex_encoding & VEX_W) == VEX_W) {442mod_idx = ((evex_encoding & EVEX_Rb) == EVEX_Rb) ? 3 : 2;443} else {444mod_idx = ((evex_encoding & EVEX_Rb) == EVEX_Rb) ? 1 : 0;445}446break;447448case EVEX_HV:449mod_idx = ((evex_encoding & EVEX_Rb) == EVEX_Rb) ? 1 : 0;450break;451452case EVEX_FVM:453break;454455case EVEX_T1S:456switch (_attributes->get_input_size()) {457case EVEX_8bit:458break;459460case EVEX_16bit:461mod_idx = 1;462break;463464case EVEX_32bit:465mod_idx = 2;466break;467468case EVEX_64bit:469mod_idx = 3;470break;471}472break;473474case EVEX_T1F:475case EVEX_T2:476case EVEX_T4:477mod_idx = (_attributes->get_input_size() == EVEX_64bit) ? 1 : 0;478break;479480case EVEX_T8:481break;482483case EVEX_HVM:484break;485486case EVEX_QVM:487break;488489case EVEX_OVM:490break;491492case EVEX_M128:493break;494495case EVEX_DUP:496break;497498default:499assert(0, "no valid evex tuple_table entry");500break;501}502503int vector_len = _attributes->get_vector_len();504if (vector_len >= AVX_128bit && vector_len <= AVX_512bit) {505int disp_factor = tuple_table[tuple_type + mod_idx][vector_len];506if ((disp % disp_factor) == 0) {507int new_disp = disp / disp_factor;508if (is8bit(new_disp)) {509disp = new_disp;510}511} else {512return false;513}514}515}516return is8bit(disp);517}518519static bool is_valid_encoding(int reg_enc) {520return reg_enc >= 0;521}522523static int raw_encode(Register reg) {524assert(reg == noreg || reg->is_valid(), "sanity");525int reg_enc = (intptr_t)reg;526assert(reg_enc == -1 || is_valid_encoding(reg_enc), "sanity");527return reg_enc;528}529530static int raw_encode(XMMRegister xmmreg) {531assert(xmmreg == xnoreg || xmmreg->is_valid(), "sanity");532int xmmreg_enc = (intptr_t)xmmreg;533assert(xmmreg_enc == -1 || is_valid_encoding(xmmreg_enc), "sanity");534return xmmreg_enc;535}536537static int modrm_encoding(int mod, int dst_enc, int src_enc) {538return (mod & 3) << 6 | (dst_enc & 7) << 3 | (src_enc & 7);539}540541static int sib_encoding(Address::ScaleFactor scale, int index_enc, int base_enc) {542return (scale & 3) << 6 | (index_enc & 7) << 3 | (base_enc & 7);543}544545inline void Assembler::emit_modrm(int mod, int dst_enc, int src_enc) {546assert((mod & 3) != 0b11, "forbidden");547int modrm = modrm_encoding(mod, dst_enc, src_enc);548emit_int8(modrm);549}550551inline void Assembler::emit_modrm_disp8(int mod, int dst_enc, int src_enc,552int disp) {553int modrm = modrm_encoding(mod, dst_enc, src_enc);554emit_int16(modrm, disp & 0xFF);555}556557inline void Assembler::emit_modrm_sib(int mod, int dst_enc, int src_enc,558Address::ScaleFactor scale, int index_enc, int base_enc) {559int modrm = modrm_encoding(mod, dst_enc, src_enc);560int sib = sib_encoding(scale, index_enc, base_enc);561emit_int16(modrm, sib);562}563564inline void Assembler::emit_modrm_sib_disp8(int mod, int dst_enc, int src_enc,565Address::ScaleFactor scale, int index_enc, int base_enc,566int disp) {567int modrm = modrm_encoding(mod, dst_enc, src_enc);568int sib = sib_encoding(scale, index_enc, base_enc);569emit_int24(modrm, sib, disp & 0xFF);570}571572void Assembler::emit_operand_helper(int reg_enc, int base_enc, int index_enc,573Address::ScaleFactor scale, int disp,574RelocationHolder const& rspec,575int rip_relative_correction) {576bool no_relocation = (rspec.type() == relocInfo::none);577578if (is_valid_encoding(base_enc)) {579if (is_valid_encoding(index_enc)) {580assert(scale != Address::no_scale, "inconsistent address");581// [base + index*scale + disp]582if (disp == 0 && no_relocation &&583base_enc != rbp->encoding() LP64_ONLY(&& base_enc != r13->encoding())) {584// [base + index*scale]585// [00 reg 100][ss index base]586emit_modrm_sib(0b00, reg_enc, 0b100,587scale, index_enc, base_enc);588} else if (emit_compressed_disp_byte(disp) && no_relocation) {589// [base + index*scale + imm8]590// [01 reg 100][ss index base] imm8591emit_modrm_sib_disp8(0b01, reg_enc, 0b100,592scale, index_enc, base_enc,593disp);594} else {595// [base + index*scale + disp32]596// [10 reg 100][ss index base] disp32597emit_modrm_sib(0b10, reg_enc, 0b100,598scale, index_enc, base_enc);599emit_data(disp, rspec, disp32_operand);600}601} else if (base_enc == rsp->encoding() LP64_ONLY(|| base_enc == r12->encoding())) {602// [rsp + disp]603if (disp == 0 && no_relocation) {604// [rsp]605// [00 reg 100][00 100 100]606emit_modrm_sib(0b00, reg_enc, 0b100,607Address::times_1, 0b100, 0b100);608} else if (emit_compressed_disp_byte(disp) && no_relocation) {609// [rsp + imm8]610// [01 reg 100][00 100 100] disp8611emit_modrm_sib_disp8(0b01, reg_enc, 0b100,612Address::times_1, 0b100, 0b100,613disp);614} else {615// [rsp + imm32]616// [10 reg 100][00 100 100] disp32617emit_modrm_sib(0b10, reg_enc, 0b100,618Address::times_1, 0b100, 0b100);619emit_data(disp, rspec, disp32_operand);620}621} else {622// [base + disp]623assert(base_enc != rsp->encoding() LP64_ONLY(&& base_enc != r12->encoding()), "illegal addressing mode");624if (disp == 0 && no_relocation &&625base_enc != rbp->encoding() LP64_ONLY(&& base_enc != r13->encoding())) {626// [base]627// [00 reg base]628emit_modrm(0, reg_enc, base_enc);629} else if (emit_compressed_disp_byte(disp) && no_relocation) {630// [base + disp8]631// [01 reg base] disp8632emit_modrm_disp8(0b01, reg_enc, base_enc,633disp);634} else {635// [base + disp32]636// [10 reg base] disp32637emit_modrm(0b10, reg_enc, base_enc);638emit_data(disp, rspec, disp32_operand);639}640}641} else {642if (is_valid_encoding(index_enc)) {643assert(scale != Address::no_scale, "inconsistent address");644// base == noreg645// [index*scale + disp]646// [00 reg 100][ss index 101] disp32647emit_modrm_sib(0b00, reg_enc, 0b100,648scale, index_enc, 0b101 /* no base */);649emit_data(disp, rspec, disp32_operand);650} else if (!no_relocation) {651// base == noreg, index == noreg652// [disp] (64bit) RIP-RELATIVE (32bit) abs653// [00 reg 101] disp32654655emit_modrm(0b00, reg_enc, 0b101 /* no base */);656// Note that the RIP-rel. correction applies to the generated657// disp field, but _not_ to the target address in the rspec.658659// disp was created by converting the target address minus the pc660// at the start of the instruction. That needs more correction here.661// intptr_t disp = target - next_ip;662assert(inst_mark() != NULL, "must be inside InstructionMark");663address next_ip = pc() + sizeof(int32_t) + rip_relative_correction;664int64_t adjusted = disp;665// Do rip-rel adjustment for 64bit666LP64_ONLY(adjusted -= (next_ip - inst_mark()));667assert(is_simm32(adjusted),668"must be 32bit offset (RIP relative address)");669emit_data((int32_t) adjusted, rspec, disp32_operand);670671} else {672// base == noreg, index == noreg, no_relocation == true673// 32bit never did this, did everything as the rip-rel/disp code above674// [disp] ABSOLUTE675// [00 reg 100][00 100 101] disp32676emit_modrm_sib(0b00, reg_enc, 0b100 /* no base */,677Address::times_1, 0b100, 0b101);678emit_data(disp, rspec, disp32_operand);679}680}681}682683void Assembler::emit_operand(Register reg, Register base, Register index,684Address::ScaleFactor scale, int disp,685RelocationHolder const& rspec,686int rip_relative_correction) {687assert(!index->is_valid() || index != rsp, "illegal addressing mode");688emit_operand_helper(raw_encode(reg), raw_encode(base), raw_encode(index),689scale, disp, rspec, rip_relative_correction);690691}692void Assembler::emit_operand(XMMRegister xmmreg, Register base, Register index,693Address::ScaleFactor scale, int disp,694RelocationHolder const& rspec) {695assert(!index->is_valid() || index != rsp, "illegal addressing mode");696assert(xmmreg->encoding() < 16 || UseAVX > 2, "not supported");697emit_operand_helper(raw_encode(xmmreg), raw_encode(base), raw_encode(index),698scale, disp, rspec);699}700701void Assembler::emit_operand(XMMRegister xmmreg, Register base, XMMRegister xmmindex,702Address::ScaleFactor scale, int disp,703RelocationHolder const& rspec) {704assert(xmmreg->encoding() < 16 || UseAVX > 2, "not supported");705assert(xmmindex->encoding() < 16 || UseAVX > 2, "not supported");706emit_operand_helper(raw_encode(xmmreg), raw_encode(base), raw_encode(xmmindex),707scale, disp, rspec, /* rip_relative_correction */ 0);708}709710// Secret local extension to Assembler::WhichOperand:711#define end_pc_operand (_WhichOperand_limit)712713address Assembler::locate_operand(address inst, WhichOperand which) {714// Decode the given instruction, and return the address of715// an embedded 32-bit operand word.716717// If "which" is disp32_operand, selects the displacement portion718// of an effective address specifier.719// If "which" is imm64_operand, selects the trailing immediate constant.720// If "which" is call32_operand, selects the displacement of a call or jump.721// Caller is responsible for ensuring that there is such an operand,722// and that it is 32/64 bits wide.723724// If "which" is end_pc_operand, find the end of the instruction.725726address ip = inst;727bool is_64bit = false;728729debug_only(bool has_disp32 = false);730int tail_size = 0; // other random bytes (#32, #16, etc.) at end of insn731732again_after_prefix:733switch (0xFF & *ip++) {734735// These convenience macros generate groups of "case" labels for the switch.736#define REP4(x) (x)+0: case (x)+1: case (x)+2: case (x)+3737#define REP8(x) (x)+0: case (x)+1: case (x)+2: case (x)+3: \738case (x)+4: case (x)+5: case (x)+6: case (x)+7739#define REP16(x) REP8((x)+0): \740case REP8((x)+8)741742case CS_segment:743case SS_segment:744case DS_segment:745case ES_segment:746case FS_segment:747case GS_segment:748// Seems dubious749LP64_ONLY(assert(false, "shouldn't have that prefix"));750assert(ip == inst+1, "only one prefix allowed");751goto again_after_prefix;752753case 0x67:754case REX:755case REX_B:756case REX_X:757case REX_XB:758case REX_R:759case REX_RB:760case REX_RX:761case REX_RXB:762NOT_LP64(assert(false, "64bit prefixes"));763goto again_after_prefix;764765case REX_W:766case REX_WB:767case REX_WX:768case REX_WXB:769case REX_WR:770case REX_WRB:771case REX_WRX:772case REX_WRXB:773NOT_LP64(assert(false, "64bit prefixes"));774is_64bit = true;775goto again_after_prefix;776777case 0xFF: // pushq a; decl a; incl a; call a; jmp a778case 0x88: // movb a, r779case 0x89: // movl a, r780case 0x8A: // movb r, a781case 0x8B: // movl r, a782case 0x8F: // popl a783debug_only(has_disp32 = true);784break;785786case 0x68: // pushq #32787if (which == end_pc_operand) {788return ip + 4;789}790assert(which == imm_operand && !is_64bit, "pushl has no disp32 or 64bit immediate");791return ip; // not produced by emit_operand792793case 0x66: // movw ... (size prefix)794again_after_size_prefix2:795switch (0xFF & *ip++) {796case REX:797case REX_B:798case REX_X:799case REX_XB:800case REX_R:801case REX_RB:802case REX_RX:803case REX_RXB:804case REX_W:805case REX_WB:806case REX_WX:807case REX_WXB:808case REX_WR:809case REX_WRB:810case REX_WRX:811case REX_WRXB:812NOT_LP64(assert(false, "64bit prefix found"));813goto again_after_size_prefix2;814case 0x8B: // movw r, a815case 0x89: // movw a, r816debug_only(has_disp32 = true);817break;818case 0xC7: // movw a, #16819debug_only(has_disp32 = true);820tail_size = 2; // the imm16821break;822case 0x0F: // several SSE/SSE2 variants823ip--; // reparse the 0x0F824goto again_after_prefix;825default:826ShouldNotReachHere();827}828break;829830case REP8(0xB8): // movl/q r, #32/#64(oop?)831if (which == end_pc_operand) return ip + (is_64bit ? 8 : 4);832// these asserts are somewhat nonsensical833#ifndef _LP64834assert(which == imm_operand || which == disp32_operand,835"which %d is_64_bit %d ip " INTPTR_FORMAT, which, is_64bit, p2i(ip));836#else837assert((which == call32_operand || which == imm_operand) && is_64bit ||838which == narrow_oop_operand && !is_64bit,839"which %d is_64_bit %d ip " INTPTR_FORMAT, which, is_64bit, p2i(ip));840#endif // _LP64841return ip;842843case 0x69: // imul r, a, #32844case 0xC7: // movl a, #32(oop?)845tail_size = 4;846debug_only(has_disp32 = true); // has both kinds of operands!847break;848849case 0x0F: // movx..., etc.850switch (0xFF & *ip++) {851case 0x3A: // pcmpestri852tail_size = 1;853case 0x38: // ptest, pmovzxbw854ip++; // skip opcode855debug_only(has_disp32 = true); // has both kinds of operands!856break;857858case 0x70: // pshufd r, r/a, #8859debug_only(has_disp32 = true); // has both kinds of operands!860case 0x73: // psrldq r, #8861tail_size = 1;862break;863864case 0x12: // movlps865case 0x28: // movaps866case 0x2E: // ucomiss867case 0x2F: // comiss868case 0x54: // andps869case 0x55: // andnps870case 0x56: // orps871case 0x57: // xorps872case 0x58: // addpd873case 0x59: // mulpd874case 0x6E: // movd875case 0x7E: // movd876case 0x6F: // movdq877case 0x7F: // movdq878case 0xAE: // ldmxcsr, stmxcsr, fxrstor, fxsave, clflush879case 0xFE: // paddd880debug_only(has_disp32 = true);881break;882883case 0xAD: // shrd r, a, %cl884case 0xAF: // imul r, a885case 0xBE: // movsbl r, a (movsxb)886case 0xBF: // movswl r, a (movsxw)887case 0xB6: // movzbl r, a (movzxb)888case 0xB7: // movzwl r, a (movzxw)889case REP16(0x40): // cmovl cc, r, a890case 0xB0: // cmpxchgb891case 0xB1: // cmpxchg892case 0xC1: // xaddl893case 0xC7: // cmpxchg8894case REP16(0x90): // setcc a895debug_only(has_disp32 = true);896// fall out of the switch to decode the address897break;898899case 0xC4: // pinsrw r, a, #8900debug_only(has_disp32 = true);901case 0xC5: // pextrw r, r, #8902tail_size = 1; // the imm8903break;904905case 0xAC: // shrd r, a, #8906debug_only(has_disp32 = true);907tail_size = 1; // the imm8908break;909910case REP16(0x80): // jcc rdisp32911if (which == end_pc_operand) return ip + 4;912assert(which == call32_operand, "jcc has no disp32 or imm");913return ip;914default:915ShouldNotReachHere();916}917break;918919case 0x81: // addl a, #32; addl r, #32920// also: orl, adcl, sbbl, andl, subl, xorl, cmpl921// on 32bit in the case of cmpl, the imm might be an oop922tail_size = 4;923debug_only(has_disp32 = true); // has both kinds of operands!924break;925926case 0x83: // addl a, #8; addl r, #8927// also: orl, adcl, sbbl, andl, subl, xorl, cmpl928debug_only(has_disp32 = true); // has both kinds of operands!929tail_size = 1;930break;931932case 0x9B:933switch (0xFF & *ip++) {934case 0xD9: // fnstcw a935debug_only(has_disp32 = true);936break;937default:938ShouldNotReachHere();939}940break;941942case REP4(0x00): // addb a, r; addl a, r; addb r, a; addl r, a943case REP4(0x10): // adc...944case REP4(0x20): // and...945case REP4(0x30): // xor...946case REP4(0x08): // or...947case REP4(0x18): // sbb...948case REP4(0x28): // sub...949case 0xF7: // mull a950case 0x8D: // lea r, a951case 0x87: // xchg r, a952case REP4(0x38): // cmp...953case 0x85: // test r, a954debug_only(has_disp32 = true); // has both kinds of operands!955break;956957case 0xC1: // sal a, #8; sar a, #8; shl a, #8; shr a, #8958case 0xC6: // movb a, #8959case 0x80: // cmpb a, #8960case 0x6B: // imul r, a, #8961debug_only(has_disp32 = true); // has both kinds of operands!962tail_size = 1; // the imm8963break;964965case 0xC4: // VEX_3bytes966case 0xC5: // VEX_2bytes967assert((UseAVX > 0), "shouldn't have VEX prefix");968assert(ip == inst+1, "no prefixes allowed");969// C4 and C5 are also used as opcodes for PINSRW and PEXTRW instructions970// but they have prefix 0x0F and processed when 0x0F processed above.971//972// In 32-bit mode the VEX first byte C4 and C5 alias onto LDS and LES973// instructions (these instructions are not supported in 64-bit mode).974// To distinguish them bits [7:6] are set in the VEX second byte since975// ModRM byte can not be of the form 11xxxxxx in 32-bit mode. To set976// those VEX bits REX and vvvv bits are inverted.977//978// Fortunately C2 doesn't generate these instructions so we don't need979// to check for them in product version.980981// Check second byte982NOT_LP64(assert((0xC0 & *ip) == 0xC0, "shouldn't have LDS and LES instructions"));983984int vex_opcode;985// First byte986if ((0xFF & *inst) == VEX_3bytes) {987vex_opcode = VEX_OPCODE_MASK & *ip;988ip++; // third byte989is_64bit = ((VEX_W & *ip) == VEX_W);990} else {991vex_opcode = VEX_OPCODE_0F;992}993ip++; // opcode994// To find the end of instruction (which == end_pc_operand).995switch (vex_opcode) {996case VEX_OPCODE_0F:997switch (0xFF & *ip) {998case 0x70: // pshufd r, r/a, #8999case 0x71: // ps[rl|ra|ll]w r, #81000case 0x72: // ps[rl|ra|ll]d r, #81001case 0x73: // ps[rl|ra|ll]q r, #81002case 0xC2: // cmp[ps|pd|ss|sd] r, r, r/a, #81003case 0xC4: // pinsrw r, r, r/a, #81004case 0xC5: // pextrw r/a, r, #81005case 0xC6: // shufp[s|d] r, r, r/a, #81006tail_size = 1; // the imm81007break;1008}1009break;1010case VEX_OPCODE_0F_3A:1011tail_size = 1;1012break;1013}1014ip++; // skip opcode1015debug_only(has_disp32 = true); // has both kinds of operands!1016break;10171018case 0x62: // EVEX_4bytes1019assert(VM_Version::supports_evex(), "shouldn't have EVEX prefix");1020assert(ip == inst+1, "no prefixes allowed");1021// no EVEX collisions, all instructions that have 0x62 opcodes1022// have EVEX versions and are subopcodes of 0x661023ip++; // skip P0 and exmaine W in P11024is_64bit = ((VEX_W & *ip) == VEX_W);1025ip++; // move to P21026ip++; // skip P2, move to opcode1027// To find the end of instruction (which == end_pc_operand).1028switch (0xFF & *ip) {1029case 0x22: // pinsrd r, r/a, #81030case 0x61: // pcmpestri r, r/a, #81031case 0x70: // pshufd r, r/a, #81032case 0x73: // psrldq r, #81033case 0x1f: // evpcmpd/evpcmpq1034case 0x3f: // evpcmpb/evpcmpw1035tail_size = 1; // the imm81036break;1037default:1038break;1039}1040ip++; // skip opcode1041debug_only(has_disp32 = true); // has both kinds of operands!1042break;10431044case 0xD1: // sal a, 1; sar a, 1; shl a, 1; shr a, 11045case 0xD3: // sal a, %cl; sar a, %cl; shl a, %cl; shr a, %cl1046case 0xD9: // fld_s a; fst_s a; fstp_s a; fldcw a1047case 0xDD: // fld_d a; fst_d a; fstp_d a1048case 0xDB: // fild_s a; fistp_s a; fld_x a; fstp_x a1049case 0xDF: // fild_d a; fistp_d a1050case 0xD8: // fadd_s a; fsubr_s a; fmul_s a; fdivr_s a; fcomp_s a1051case 0xDC: // fadd_d a; fsubr_d a; fmul_d a; fdivr_d a; fcomp_d a1052case 0xDE: // faddp_d a; fsubrp_d a; fmulp_d a; fdivrp_d a; fcompp_d a1053debug_only(has_disp32 = true);1054break;10551056case 0xE8: // call rdisp321057case 0xE9: // jmp rdisp321058if (which == end_pc_operand) return ip + 4;1059assert(which == call32_operand, "call has no disp32 or imm");1060return ip;10611062case 0xF0: // Lock1063goto again_after_prefix;10641065case 0xF3: // For SSE1066case 0xF2: // For SSE21067switch (0xFF & *ip++) {1068case REX:1069case REX_B:1070case REX_X:1071case REX_XB:1072case REX_R:1073case REX_RB:1074case REX_RX:1075case REX_RXB:1076case REX_W:1077case REX_WB:1078case REX_WX:1079case REX_WXB:1080case REX_WR:1081case REX_WRB:1082case REX_WRX:1083case REX_WRXB:1084NOT_LP64(assert(false, "found 64bit prefix"));1085ip++;1086default:1087ip++;1088}1089debug_only(has_disp32 = true); // has both kinds of operands!1090break;10911092default:1093ShouldNotReachHere();10941095#undef REP81096#undef REP161097}10981099assert(which != call32_operand, "instruction is not a call, jmp, or jcc");1100#ifdef _LP641101assert(which != imm_operand, "instruction is not a movq reg, imm64");1102#else1103// assert(which != imm_operand || has_imm32, "instruction has no imm32 field");1104assert(which != imm_operand || has_disp32, "instruction has no imm32 field");1105#endif // LP641106assert(which != disp32_operand || has_disp32, "instruction has no disp32 field");11071108// parse the output of emit_operand1109int op2 = 0xFF & *ip++;1110int base = op2 & 0x07;1111int op3 = -1;1112const int b100 = 4;1113const int b101 = 5;1114if (base == b100 && (op2 >> 6) != 3) {1115op3 = 0xFF & *ip++;1116base = op3 & 0x07; // refetch the base1117}1118// now ip points at the disp (if any)11191120switch (op2 >> 6) {1121case 0:1122// [00 reg 100][ss index base]1123// [00 reg 100][00 100 esp]1124// [00 reg base]1125// [00 reg 100][ss index 101][disp32]1126// [00 reg 101] [disp32]11271128if (base == b101) {1129if (which == disp32_operand)1130return ip; // caller wants the disp321131ip += 4; // skip the disp321132}1133break;11341135case 1:1136// [01 reg 100][ss index base][disp8]1137// [01 reg 100][00 100 esp][disp8]1138// [01 reg base] [disp8]1139ip += 1; // skip the disp81140break;11411142case 2:1143// [10 reg 100][ss index base][disp32]1144// [10 reg 100][00 100 esp][disp32]1145// [10 reg base] [disp32]1146if (which == disp32_operand)1147return ip; // caller wants the disp321148ip += 4; // skip the disp321149break;11501151case 3:1152// [11 reg base] (not a memory addressing mode)1153break;1154}11551156if (which == end_pc_operand) {1157return ip + tail_size;1158}11591160#ifdef _LP641161assert(which == narrow_oop_operand && !is_64bit, "instruction is not a movl adr, imm32");1162#else1163assert(which == imm_operand, "instruction has only an imm field");1164#endif // LP641165return ip;1166}11671168address Assembler::locate_next_instruction(address inst) {1169// Secretly share code with locate_operand:1170return locate_operand(inst, end_pc_operand);1171}117211731174#ifdef ASSERT1175void Assembler::check_relocation(RelocationHolder const& rspec, int format) {1176address inst = inst_mark();1177assert(inst != NULL && inst < pc(), "must point to beginning of instruction");1178address opnd;11791180Relocation* r = rspec.reloc();1181if (r->type() == relocInfo::none) {1182return;1183} else if (r->is_call() || format == call32_operand) {1184// assert(format == imm32_operand, "cannot specify a nonzero format");1185opnd = locate_operand(inst, call32_operand);1186} else if (r->is_data()) {1187assert(format == imm_operand || format == disp32_operand1188LP64_ONLY(|| format == narrow_oop_operand), "format ok");1189opnd = locate_operand(inst, (WhichOperand)format);1190} else {1191assert(format == imm_operand, "cannot specify a format");1192return;1193}1194assert(opnd == pc(), "must put operand where relocs can find it");1195}1196#endif // ASSERT11971198void Assembler::emit_operand(Register reg, Address adr,1199int rip_relative_correction) {1200emit_operand(reg, adr._base, adr._index, adr._scale, adr._disp,1201adr._rspec,1202rip_relative_correction);1203}12041205void Assembler::emit_operand(XMMRegister reg, Address adr) {1206if (adr.isxmmindex()) {1207emit_operand(reg, adr._base, adr._xmmindex, adr._scale, adr._disp, adr._rspec);1208} else {1209emit_operand(reg, adr._base, adr._index, adr._scale, adr._disp,1210adr._rspec);1211}1212}12131214// Now the Assembler instructions (identical for 32/64 bits)12151216void Assembler::adcl(Address dst, int32_t imm32) {1217InstructionMark im(this);1218prefix(dst);1219emit_arith_operand(0x81, rdx, dst, imm32);1220}12211222void Assembler::adcl(Address dst, Register src) {1223InstructionMark im(this);1224prefix(dst, src);1225emit_int8(0x11);1226emit_operand(src, dst);1227}12281229void Assembler::adcl(Register dst, int32_t imm32) {1230prefix(dst);1231emit_arith(0x81, 0xD0, dst, imm32);1232}12331234void Assembler::adcl(Register dst, Address src) {1235InstructionMark im(this);1236prefix(src, dst);1237emit_int8(0x13);1238emit_operand(dst, src);1239}12401241void Assembler::adcl(Register dst, Register src) {1242(void) prefix_and_encode(dst->encoding(), src->encoding());1243emit_arith(0x13, 0xC0, dst, src);1244}12451246void Assembler::addl(Address dst, int32_t imm32) {1247InstructionMark im(this);1248prefix(dst);1249emit_arith_operand(0x81, rax, dst, imm32);1250}12511252void Assembler::addb(Address dst, int imm8) {1253InstructionMark im(this);1254prefix(dst);1255emit_int8((unsigned char)0x80);1256emit_operand(rax, dst, 1);1257emit_int8(imm8);1258}12591260void Assembler::addw(Register dst, Register src) {1261(void)prefix_and_encode(dst->encoding(), src->encoding());1262emit_arith(0x03, 0xC0, dst, src);1263}12641265void Assembler::addw(Address dst, int imm16) {1266InstructionMark im(this);1267emit_int8(0x66);1268prefix(dst);1269emit_int8((unsigned char)0x81);1270emit_operand(rax, dst, 2);1271emit_int16(imm16);1272}12731274void Assembler::addl(Address dst, Register src) {1275InstructionMark im(this);1276prefix(dst, src);1277emit_int8(0x01);1278emit_operand(src, dst);1279}12801281void Assembler::addl(Register dst, int32_t imm32) {1282prefix(dst);1283emit_arith(0x81, 0xC0, dst, imm32);1284}12851286void Assembler::addl(Register dst, Address src) {1287InstructionMark im(this);1288prefix(src, dst);1289emit_int8(0x03);1290emit_operand(dst, src);1291}12921293void Assembler::addl(Register dst, Register src) {1294(void) prefix_and_encode(dst->encoding(), src->encoding());1295emit_arith(0x03, 0xC0, dst, src);1296}12971298void Assembler::addr_nop_4() {1299assert(UseAddressNop, "no CPU support");1300// 4 bytes: NOP DWORD PTR [EAX+0]1301emit_int32(0x0F,13020x1F,13030x40, // emit_rm(cbuf, 0x1, EAX_enc, EAX_enc);13040); // 8-bits offset (1 byte)1305}13061307void Assembler::addr_nop_5() {1308assert(UseAddressNop, "no CPU support");1309// 5 bytes: NOP DWORD PTR [EAX+EAX*0+0] 8-bits offset1310emit_int32(0x0F,13110x1F,13120x44, // emit_rm(cbuf, 0x1, EAX_enc, 0x4);13130x00); // emit_rm(cbuf, 0x0, EAX_enc, EAX_enc);1314emit_int8(0); // 8-bits offset (1 byte)1315}13161317void Assembler::addr_nop_7() {1318assert(UseAddressNop, "no CPU support");1319// 7 bytes: NOP DWORD PTR [EAX+0] 32-bits offset1320emit_int24(0x0F,13210x1F,1322(unsigned char)0x80);1323// emit_rm(cbuf, 0x2, EAX_enc, EAX_enc);1324emit_int32(0); // 32-bits offset (4 bytes)1325}13261327void Assembler::addr_nop_8() {1328assert(UseAddressNop, "no CPU support");1329// 8 bytes: NOP DWORD PTR [EAX+EAX*0+0] 32-bits offset1330emit_int32(0x0F,13310x1F,1332(unsigned char)0x84,1333// emit_rm(cbuf, 0x2, EAX_enc, 0x4);13340x00); // emit_rm(cbuf, 0x0, EAX_enc, EAX_enc);1335emit_int32(0); // 32-bits offset (4 bytes)1336}13371338void Assembler::addsd(XMMRegister dst, XMMRegister src) {1339NOT_LP64(assert(VM_Version::supports_sse2(), ""));1340InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1341attributes.set_rex_vex_w_reverted();1342int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);1343emit_int16(0x58, (0xC0 | encode));1344}13451346void Assembler::addsd(XMMRegister dst, Address src) {1347NOT_LP64(assert(VM_Version::supports_sse2(), ""));1348InstructionMark im(this);1349InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1350attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);1351attributes.set_rex_vex_w_reverted();1352simd_prefix(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);1353emit_int8(0x58);1354emit_operand(dst, src);1355}13561357void Assembler::addss(XMMRegister dst, XMMRegister src) {1358NOT_LP64(assert(VM_Version::supports_sse(), ""));1359InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1360int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);1361emit_int16(0x58, (0xC0 | encode));1362}13631364void Assembler::addss(XMMRegister dst, Address src) {1365NOT_LP64(assert(VM_Version::supports_sse(), ""));1366InstructionMark im(this);1367InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1368attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);1369simd_prefix(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);1370emit_int8(0x58);1371emit_operand(dst, src);1372}13731374void Assembler::aesdec(XMMRegister dst, Address src) {1375assert(VM_Version::supports_aes(), "");1376InstructionMark im(this);1377InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);1378simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);1379emit_int8((unsigned char)0xDE);1380emit_operand(dst, src);1381}13821383void Assembler::aesdec(XMMRegister dst, XMMRegister src) {1384assert(VM_Version::supports_aes(), "");1385InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);1386int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);1387emit_int16((unsigned char)0xDE, (0xC0 | encode));1388}13891390void Assembler::vaesdec(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {1391assert(VM_Version::supports_avx512_vaes(), "");1392InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);1393attributes.set_is_evex_instruction();1394int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);1395emit_int16((unsigned char)0xDE, (0xC0 | encode));1396}139713981399void Assembler::aesdeclast(XMMRegister dst, Address src) {1400assert(VM_Version::supports_aes(), "");1401InstructionMark im(this);1402InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);1403simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);1404emit_int8((unsigned char)0xDF);1405emit_operand(dst, src);1406}14071408void Assembler::aesdeclast(XMMRegister dst, XMMRegister src) {1409assert(VM_Version::supports_aes(), "");1410InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);1411int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);1412emit_int16((unsigned char)0xDF, (0xC0 | encode));1413}14141415void Assembler::vaesdeclast(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {1416assert(VM_Version::supports_avx512_vaes(), "");1417InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);1418attributes.set_is_evex_instruction();1419int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);1420emit_int16((unsigned char)0xDF, (0xC0 | encode));1421}14221423void Assembler::aesenc(XMMRegister dst, Address src) {1424assert(VM_Version::supports_aes(), "");1425InstructionMark im(this);1426InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);1427simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);1428emit_int8((unsigned char)0xDC);1429emit_operand(dst, src);1430}14311432void Assembler::aesenc(XMMRegister dst, XMMRegister src) {1433assert(VM_Version::supports_aes(), "");1434InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);1435int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);1436emit_int16((unsigned char)0xDC, 0xC0 | encode);1437}14381439void Assembler::vaesenc(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {1440assert(VM_Version::supports_avx512_vaes(), "requires vaes support/enabling");1441InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);1442attributes.set_is_evex_instruction();1443int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);1444emit_int16((unsigned char)0xDC, (0xC0 | encode));1445}14461447void Assembler::aesenclast(XMMRegister dst, Address src) {1448assert(VM_Version::supports_aes(), "");1449InstructionMark im(this);1450InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);1451simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);1452emit_int8((unsigned char)0xDD);1453emit_operand(dst, src);1454}14551456void Assembler::aesenclast(XMMRegister dst, XMMRegister src) {1457assert(VM_Version::supports_aes(), "");1458InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);1459int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);1460emit_int16((unsigned char)0xDD, (0xC0 | encode));1461}14621463void Assembler::vaesenclast(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {1464assert(VM_Version::supports_avx512_vaes(), "requires vaes support/enabling");1465InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);1466attributes.set_is_evex_instruction();1467int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);1468emit_int16((unsigned char)0xDD, (0xC0 | encode));1469}14701471void Assembler::andb(Address dst, Register src) {1472InstructionMark im(this);1473prefix(dst, src, true);1474emit_int8(0x20);1475emit_operand(src, dst);1476}14771478void Assembler::andw(Register dst, Register src) {1479(void)prefix_and_encode(dst->encoding(), src->encoding());1480emit_arith(0x23, 0xC0, dst, src);1481}14821483void Assembler::andl(Address dst, int32_t imm32) {1484InstructionMark im(this);1485prefix(dst);1486emit_arith_operand(0x81, as_Register(4), dst, imm32);1487}14881489void Assembler::andl(Register dst, int32_t imm32) {1490prefix(dst);1491emit_arith(0x81, 0xE0, dst, imm32);1492}14931494void Assembler::andl(Address dst, Register src) {1495InstructionMark im(this);1496prefix(dst, src);1497emit_int8(0x21);1498emit_operand(src, dst);1499}15001501void Assembler::andl(Register dst, Address src) {1502InstructionMark im(this);1503prefix(src, dst);1504emit_int8(0x23);1505emit_operand(dst, src);1506}15071508void Assembler::andl(Register dst, Register src) {1509(void) prefix_and_encode(dst->encoding(), src->encoding());1510emit_arith(0x23, 0xC0, dst, src);1511}15121513void Assembler::andnl(Register dst, Register src1, Register src2) {1514assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");1515InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);1516int encode = vex_prefix_and_encode(dst->encoding(), src1->encoding(), src2->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);1517emit_int16((unsigned char)0xF2, (0xC0 | encode));1518}15191520void Assembler::andnl(Register dst, Register src1, Address src2) {1521assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");1522InstructionMark im(this);1523InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);1524vex_prefix(src2, src1->encoding(), dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);1525emit_int8((unsigned char)0xF2);1526emit_operand(dst, src2);1527}15281529void Assembler::bsfl(Register dst, Register src) {1530int encode = prefix_and_encode(dst->encoding(), src->encoding());1531emit_int24(0x0F,1532(unsigned char)0xBC,15330xC0 | encode);1534}15351536void Assembler::bsrl(Register dst, Register src) {1537int encode = prefix_and_encode(dst->encoding(), src->encoding());1538emit_int24(0x0F,1539(unsigned char)0xBD,15400xC0 | encode);1541}15421543void Assembler::bswapl(Register reg) { // bswap1544int encode = prefix_and_encode(reg->encoding());1545emit_int16(0x0F, (0xC8 | encode));1546}15471548void Assembler::blsil(Register dst, Register src) {1549assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");1550InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);1551int encode = vex_prefix_and_encode(rbx->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);1552emit_int16((unsigned char)0xF3, (0xC0 | encode));1553}15541555void Assembler::blsil(Register dst, Address src) {1556assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");1557InstructionMark im(this);1558InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);1559vex_prefix(src, dst->encoding(), rbx->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);1560emit_int8((unsigned char)0xF3);1561emit_operand(rbx, src);1562}15631564void Assembler::blsmskl(Register dst, Register src) {1565assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");1566InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);1567int encode = vex_prefix_and_encode(rdx->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);1568emit_int16((unsigned char)0xF3,15690xC0 | encode);1570}15711572void Assembler::blsmskl(Register dst, Address src) {1573assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");1574InstructionMark im(this);1575InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);1576vex_prefix(src, dst->encoding(), rdx->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);1577emit_int8((unsigned char)0xF3);1578emit_operand(rdx, src);1579}15801581void Assembler::blsrl(Register dst, Register src) {1582assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");1583InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);1584int encode = vex_prefix_and_encode(rcx->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);1585emit_int16((unsigned char)0xF3, (0xC0 | encode));1586}15871588void Assembler::blsrl(Register dst, Address src) {1589assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");1590InstructionMark im(this);1591InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);1592vex_prefix(src, dst->encoding(), rcx->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);1593emit_int8((unsigned char)0xF3);1594emit_operand(rcx, src);1595}15961597void Assembler::call(Label& L, relocInfo::relocType rtype) {1598// suspect disp32 is always good1599int operand = LP64_ONLY(disp32_operand) NOT_LP64(imm_operand);16001601if (L.is_bound()) {1602const int long_size = 5;1603int offs = (int)( target(L) - pc() );1604assert(offs <= 0, "assembler error");1605InstructionMark im(this);1606// 1110 1000 #32-bit disp1607emit_int8((unsigned char)0xE8);1608emit_data(offs - long_size, rtype, operand);1609} else {1610InstructionMark im(this);1611// 1110 1000 #32-bit disp1612L.add_patch_at(code(), locator());16131614emit_int8((unsigned char)0xE8);1615emit_data(int(0), rtype, operand);1616}1617}16181619void Assembler::call(Register dst) {1620int encode = prefix_and_encode(dst->encoding());1621emit_int16((unsigned char)0xFF, (0xD0 | encode));1622}162316241625void Assembler::call(Address adr) {1626InstructionMark im(this);1627prefix(adr);1628emit_int8((unsigned char)0xFF);1629emit_operand(rdx, adr);1630}16311632void Assembler::call_literal(address entry, RelocationHolder const& rspec) {1633InstructionMark im(this);1634emit_int8((unsigned char)0xE8);1635intptr_t disp = entry - (pc() + sizeof(int32_t));1636// Entry is NULL in case of a scratch emit.1637assert(entry == NULL || is_simm32(disp), "disp=" INTPTR_FORMAT " must be 32bit offset (call2)", disp);1638// Technically, should use call32_operand, but this format is1639// implied by the fact that we're emitting a call instruction.16401641int operand = LP64_ONLY(disp32_operand) NOT_LP64(call32_operand);1642emit_data((int) disp, rspec, operand);1643}16441645void Assembler::cdql() {1646emit_int8((unsigned char)0x99);1647}16481649void Assembler::cld() {1650emit_int8((unsigned char)0xFC);1651}16521653void Assembler::cmovl(Condition cc, Register dst, Register src) {1654NOT_LP64(guarantee(VM_Version::supports_cmov(), "illegal instruction"));1655int encode = prefix_and_encode(dst->encoding(), src->encoding());1656emit_int24(0x0F,16570x40 | cc,16580xC0 | encode);1659}166016611662void Assembler::cmovl(Condition cc, Register dst, Address src) {1663InstructionMark im(this);1664NOT_LP64(guarantee(VM_Version::supports_cmov(), "illegal instruction"));1665prefix(src, dst);1666emit_int16(0x0F, (0x40 | cc));1667emit_operand(dst, src);1668}16691670void Assembler::cmpb(Address dst, int imm8) {1671InstructionMark im(this);1672prefix(dst);1673emit_int8((unsigned char)0x80);1674emit_operand(rdi, dst, 1);1675emit_int8(imm8);1676}16771678void Assembler::cmpl(Address dst, int32_t imm32) {1679InstructionMark im(this);1680prefix(dst);1681emit_int8((unsigned char)0x81);1682emit_operand(rdi, dst, 4);1683emit_int32(imm32);1684}16851686void Assembler::cmp(Register dst, int32_t imm32) {1687prefix(dst);1688emit_int8((unsigned char)0x3D);1689emit_int32(imm32);1690}16911692void Assembler::cmpl(Register dst, int32_t imm32) {1693prefix(dst);1694emit_arith(0x81, 0xF8, dst, imm32);1695}16961697void Assembler::cmpl(Register dst, Register src) {1698(void) prefix_and_encode(dst->encoding(), src->encoding());1699emit_arith(0x3B, 0xC0, dst, src);1700}17011702void Assembler::cmpl(Register dst, Address src) {1703InstructionMark im(this);1704prefix(src, dst);1705emit_int8(0x3B);1706emit_operand(dst, src);1707}17081709void Assembler::cmpw(Address dst, int imm16) {1710InstructionMark im(this);1711assert(!dst.base_needs_rex() && !dst.index_needs_rex(), "no extended registers");1712emit_int16(0x66, (unsigned char)0x81);1713emit_operand(rdi, dst, 2);1714emit_int16(imm16);1715}17161717// The 32-bit cmpxchg compares the value at adr with the contents of rax,1718// and stores reg into adr if so; otherwise, the value at adr is loaded into rax,.1719// The ZF is set if the compared values were equal, and cleared otherwise.1720void Assembler::cmpxchgl(Register reg, Address adr) { // cmpxchg1721InstructionMark im(this);1722prefix(adr, reg);1723emit_int16(0x0F, (unsigned char)0xB1);1724emit_operand(reg, adr);1725}17261727void Assembler::cmpxchgw(Register reg, Address adr) { // cmpxchg1728InstructionMark im(this);1729size_prefix();1730prefix(adr, reg);1731emit_int16(0x0F, (unsigned char)0xB1);1732emit_operand(reg, adr);1733}17341735// The 8-bit cmpxchg compares the value at adr with the contents of rax,1736// and stores reg into adr if so; otherwise, the value at adr is loaded into rax,.1737// The ZF is set if the compared values were equal, and cleared otherwise.1738void Assembler::cmpxchgb(Register reg, Address adr) { // cmpxchg1739InstructionMark im(this);1740prefix(adr, reg, true);1741emit_int16(0x0F, (unsigned char)0xB0);1742emit_operand(reg, adr);1743}17441745void Assembler::comisd(XMMRegister dst, Address src) {1746// NOTE: dbx seems to decode this as comiss even though the1747// 0x66 is there. Strangly ucomisd comes out correct1748NOT_LP64(assert(VM_Version::supports_sse2(), ""));1749InstructionMark im(this);1750InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);;1751attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);1752attributes.set_rex_vex_w_reverted();1753simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);1754emit_int8(0x2F);1755emit_operand(dst, src);1756}17571758void Assembler::comisd(XMMRegister dst, XMMRegister src) {1759NOT_LP64(assert(VM_Version::supports_sse2(), ""));1760InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1761attributes.set_rex_vex_w_reverted();1762int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);1763emit_int16(0x2F, (0xC0 | encode));1764}17651766void Assembler::comiss(XMMRegister dst, Address src) {1767NOT_LP64(assert(VM_Version::supports_sse(), ""));1768InstructionMark im(this);1769InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1770attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);1771simd_prefix(dst, xnoreg, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);1772emit_int8(0x2F);1773emit_operand(dst, src);1774}17751776void Assembler::comiss(XMMRegister dst, XMMRegister src) {1777NOT_LP64(assert(VM_Version::supports_sse(), ""));1778InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1779int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);1780emit_int16(0x2F, (0xC0 | encode));1781}17821783void Assembler::cpuid() {1784emit_int16(0x0F, (unsigned char)0xA2);1785}17861787// Opcode / Instruction Op / En 64 - Bit Mode Compat / Leg Mode Description Implemented1788// F2 0F 38 F0 / r CRC32 r32, r / m8 RM Valid Valid Accumulate CRC32 on r / m8. v1789// F2 REX 0F 38 F0 / r CRC32 r32, r / m8* RM Valid N.E. Accumulate CRC32 on r / m8. -1790// F2 REX.W 0F 38 F0 / r CRC32 r64, r / m8 RM Valid N.E. Accumulate CRC32 on r / m8. -1791//1792// F2 0F 38 F1 / r CRC32 r32, r / m16 RM Valid Valid Accumulate CRC32 on r / m16. v1793//1794// F2 0F 38 F1 / r CRC32 r32, r / m32 RM Valid Valid Accumulate CRC32 on r / m32. v1795//1796// F2 REX.W 0F 38 F1 / r CRC32 r64, r / m64 RM Valid N.E. Accumulate CRC32 on r / m64. v1797void Assembler::crc32(Register crc, Register v, int8_t sizeInBytes) {1798assert(VM_Version::supports_sse4_2(), "");1799int8_t w = 0x01;1800Prefix p = Prefix_EMPTY;18011802emit_int8((unsigned char)0xF2);1803switch (sizeInBytes) {1804case 1:1805w = 0;1806break;1807case 2:1808case 4:1809break;1810LP64_ONLY(case 8:)1811// This instruction is not valid in 32 bits1812// Note:1813// http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf1814//1815// Page B - 72 Vol. 2C says1816// qwreg2 to qwreg 1111 0010 : 0100 1R0B : 0000 1111 : 0011 1000 : 1111 0000 : 11 qwreg1 qwreg21817// mem64 to qwreg 1111 0010 : 0100 1R0B : 0000 1111 : 0011 1000 : 1111 0000 : mod qwreg r / m1818// F0!!!1819// while 3 - 208 Vol. 2A1820// F2 REX.W 0F 38 F1 / r CRC32 r64, r / m64 RM Valid N.E.Accumulate CRC32 on r / m64.1821//1822// the 0 on a last bit is reserved for a different flavor of this instruction :1823// F2 REX.W 0F 38 F0 / r CRC32 r64, r / m8 RM Valid N.E.Accumulate CRC32 on r / m8.1824p = REX_W;1825break;1826default:1827assert(0, "Unsupported value for a sizeInBytes argument");1828break;1829}1830LP64_ONLY(prefix(crc, v, p);)1831emit_int32(0x0F,18320x38,18330xF0 | w,18340xC0 | ((crc->encoding() & 0x7) << 3) | (v->encoding() & 7));1835}18361837void Assembler::crc32(Register crc, Address adr, int8_t sizeInBytes) {1838assert(VM_Version::supports_sse4_2(), "");1839InstructionMark im(this);1840int8_t w = 0x01;1841Prefix p = Prefix_EMPTY;18421843emit_int8((int8_t)0xF2);1844switch (sizeInBytes) {1845case 1:1846w = 0;1847break;1848case 2:1849case 4:1850break;1851LP64_ONLY(case 8:)1852// This instruction is not valid in 32 bits1853p = REX_W;1854break;1855default:1856assert(0, "Unsupported value for a sizeInBytes argument");1857break;1858}1859LP64_ONLY(prefix(crc, adr, p);)1860emit_int24(0x0F, 0x38, (0xF0 | w));1861emit_operand(crc, adr);1862}18631864void Assembler::cvtdq2pd(XMMRegister dst, XMMRegister src) {1865NOT_LP64(assert(VM_Version::supports_sse2(), ""));1866InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);1867int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);1868emit_int16((unsigned char)0xE6, (0xC0 | encode));1869}18701871void Assembler::vcvtdq2pd(XMMRegister dst, XMMRegister src, int vector_len) {1872assert(vector_len <= AVX_256bit ? VM_Version::supports_avx() : VM_Version::supports_evex(), "");1873InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);1874int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);1875emit_int16((unsigned char)0xE6, (0xC0 | encode));1876}18771878void Assembler::cvtdq2ps(XMMRegister dst, XMMRegister src) {1879NOT_LP64(assert(VM_Version::supports_sse2(), ""));1880InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);1881int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);1882emit_int16(0x5B, (0xC0 | encode));1883}18841885void Assembler::vcvtdq2ps(XMMRegister dst, XMMRegister src, int vector_len) {1886assert(vector_len <= AVX_256bit ? VM_Version::supports_avx() : VM_Version::supports_evex(), "");1887InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);1888int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);1889emit_int16(0x5B, (0xC0 | encode));1890}18911892void Assembler::cvtsd2ss(XMMRegister dst, XMMRegister src) {1893NOT_LP64(assert(VM_Version::supports_sse2(), ""));1894InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1895attributes.set_rex_vex_w_reverted();1896int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);1897emit_int16(0x5A, (0xC0 | encode));1898}18991900void Assembler::cvtsd2ss(XMMRegister dst, Address src) {1901NOT_LP64(assert(VM_Version::supports_sse2(), ""));1902InstructionMark im(this);1903InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1904attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);1905attributes.set_rex_vex_w_reverted();1906simd_prefix(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);1907emit_int8(0x5A);1908emit_operand(dst, src);1909}19101911void Assembler::cvtsi2sdl(XMMRegister dst, Register src) {1912NOT_LP64(assert(VM_Version::supports_sse2(), ""));1913InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1914int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);1915emit_int16(0x2A, (0xC0 | encode));1916}19171918void Assembler::cvtsi2sdl(XMMRegister dst, Address src) {1919NOT_LP64(assert(VM_Version::supports_sse2(), ""));1920InstructionMark im(this);1921InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1922attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);1923simd_prefix(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);1924emit_int8(0x2A);1925emit_operand(dst, src);1926}19271928void Assembler::cvtsi2ssl(XMMRegister dst, Register src) {1929NOT_LP64(assert(VM_Version::supports_sse(), ""));1930InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1931int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);1932emit_int16(0x2A, (0xC0 | encode));1933}19341935void Assembler::cvtsi2ssl(XMMRegister dst, Address src) {1936NOT_LP64(assert(VM_Version::supports_sse(), ""));1937InstructionMark im(this);1938InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1939attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);1940simd_prefix(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);1941emit_int8(0x2A);1942emit_operand(dst, src);1943}19441945void Assembler::cvtsi2ssq(XMMRegister dst, Register src) {1946NOT_LP64(assert(VM_Version::supports_sse(), ""));1947InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1948int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);1949emit_int16(0x2A, (0xC0 | encode));1950}19511952void Assembler::cvtss2sd(XMMRegister dst, XMMRegister src) {1953NOT_LP64(assert(VM_Version::supports_sse2(), ""));1954InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1955int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);1956emit_int16(0x5A, (0xC0 | encode));1957}19581959void Assembler::cvtss2sd(XMMRegister dst, Address src) {1960NOT_LP64(assert(VM_Version::supports_sse2(), ""));1961InstructionMark im(this);1962InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1963attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);1964simd_prefix(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);1965emit_int8(0x5A);1966emit_operand(dst, src);1967}196819691970void Assembler::cvttsd2sil(Register dst, XMMRegister src) {1971NOT_LP64(assert(VM_Version::supports_sse2(), ""));1972InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1973int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);1974emit_int16(0x2C, (0xC0 | encode));1975}19761977void Assembler::cvttss2sil(Register dst, XMMRegister src) {1978NOT_LP64(assert(VM_Version::supports_sse(), ""));1979InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);1980int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);1981emit_int16(0x2C, (0xC0 | encode));1982}19831984void Assembler::cvttpd2dq(XMMRegister dst, XMMRegister src) {1985NOT_LP64(assert(VM_Version::supports_sse2(), ""));1986int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_128bit;1987InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);1988int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);1989emit_int16((unsigned char)0xE6, (0xC0 | encode));1990}19911992void Assembler::pabsb(XMMRegister dst, XMMRegister src) {1993assert(VM_Version::supports_ssse3(), "");1994InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);1995int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);1996emit_int16(0x1C, (0xC0 | encode));1997}19981999void Assembler::pabsw(XMMRegister dst, XMMRegister src) {2000assert(VM_Version::supports_ssse3(), "");2001InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);2002int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);2003emit_int16(0x1D, (0xC0 | encode));2004}20052006void Assembler::pabsd(XMMRegister dst, XMMRegister src) {2007assert(VM_Version::supports_ssse3(), "");2008InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2009int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);2010emit_int16(0x1E, (0xC0 | encode));2011}20122013void Assembler::vpabsb(XMMRegister dst, XMMRegister src, int vector_len) {2014assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :2015vector_len == AVX_256bit ? VM_Version::supports_avx2() :2016vector_len == AVX_512bit ? VM_Version::supports_avx512bw() : false, "not supported");2017InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);2018int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);2019emit_int16(0x1C, (0xC0 | encode));2020}20212022void Assembler::vpabsw(XMMRegister dst, XMMRegister src, int vector_len) {2023assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :2024vector_len == AVX_256bit ? VM_Version::supports_avx2() :2025vector_len == AVX_512bit ? VM_Version::supports_avx512bw() : false, "");2026InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);2027int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);2028emit_int16(0x1D, (0xC0 | encode));2029}20302031void Assembler::vpabsd(XMMRegister dst, XMMRegister src, int vector_len) {2032assert(vector_len == AVX_128bit? VM_Version::supports_avx() :2033vector_len == AVX_256bit? VM_Version::supports_avx2() :2034vector_len == AVX_512bit? VM_Version::supports_evex() : 0, "");2035InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2036int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);2037emit_int16(0x1E, (0xC0 | encode));2038}20392040void Assembler::evpabsq(XMMRegister dst, XMMRegister src, int vector_len) {2041assert(UseAVX > 2, "");2042InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2043attributes.set_is_evex_instruction();2044int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);2045emit_int16(0x1F, (0xC0 | encode));2046}20472048void Assembler::vcvtps2pd(XMMRegister dst, XMMRegister src, int vector_len) {2049assert(vector_len <= AVX_256bit ? VM_Version::supports_avx() : VM_Version::supports_evex(), "");2050InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2051int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2052emit_int16(0x5A, (0xC0 | encode));2053}20542055void Assembler::vcvtpd2ps(XMMRegister dst, XMMRegister src, int vector_len) {2056assert(vector_len <= AVX_256bit ? VM_Version::supports_avx() : VM_Version::supports_evex(), "");2057InstructionAttr attributes(vector_len, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2058int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2059attributes.set_rex_vex_w_reverted();2060emit_int16(0x5A, (0xC0 | encode));2061}20622063void Assembler::evcvtqq2ps(XMMRegister dst, XMMRegister src, int vector_len) {2064assert(UseAVX > 2 && VM_Version::supports_avx512dq(), "");2065InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2066attributes.set_is_evex_instruction();2067int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2068emit_int16(0x5B, (0xC0 | encode));2069}20702071void Assembler::evcvtqq2pd(XMMRegister dst, XMMRegister src, int vector_len) {2072assert(UseAVX > 2 && VM_Version::supports_avx512dq(), "");2073InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2074attributes.set_is_evex_instruction();2075int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2076emit_int16((unsigned char)0xE6, (0xC0 | encode));2077}20782079void Assembler::evpmovwb(XMMRegister dst, XMMRegister src, int vector_len) {2080assert(UseAVX > 2 && VM_Version::supports_avx512bw(), "");2081InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2082attributes.set_is_evex_instruction();2083int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);2084emit_int16(0x30, (0xC0 | encode));2085}20862087void Assembler::evpmovdw(XMMRegister dst, XMMRegister src, int vector_len) {2088assert(UseAVX > 2, "");2089InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2090attributes.set_is_evex_instruction();2091int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);2092emit_int16(0x33, (0xC0 | encode));2093}20942095void Assembler::evpmovdb(XMMRegister dst, XMMRegister src, int vector_len) {2096assert(UseAVX > 2, "");2097InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2098attributes.set_is_evex_instruction();2099int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);2100emit_int16(0x31, (0xC0 | encode));2101}21022103void Assembler::evpmovqd(XMMRegister dst, XMMRegister src, int vector_len) {2104assert(UseAVX > 2, "");2105InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2106attributes.set_is_evex_instruction();2107int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);2108emit_int16(0x35, (0xC0 | encode));2109}21102111void Assembler::evpmovqb(XMMRegister dst, XMMRegister src, int vector_len) {2112assert(UseAVX > 2, "");2113InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2114attributes.set_is_evex_instruction();2115int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);2116emit_int16(0x32, (0xC0 | encode));2117}21182119void Assembler::evpmovqw(XMMRegister dst, XMMRegister src, int vector_len) {2120assert(UseAVX > 2, "");2121InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2122attributes.set_is_evex_instruction();2123int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);2124emit_int16(0x34, (0xC0 | encode));2125}21262127void Assembler::decl(Address dst) {2128// Don't use it directly. Use MacroAssembler::decrement() instead.2129InstructionMark im(this);2130prefix(dst);2131emit_int8((unsigned char)0xFF);2132emit_operand(rcx, dst);2133}21342135void Assembler::divsd(XMMRegister dst, Address src) {2136NOT_LP64(assert(VM_Version::supports_sse2(), ""));2137InstructionMark im(this);2138InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);2139attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);2140attributes.set_rex_vex_w_reverted();2141simd_prefix(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);2142emit_int8(0x5E);2143emit_operand(dst, src);2144}21452146void Assembler::divsd(XMMRegister dst, XMMRegister src) {2147NOT_LP64(assert(VM_Version::supports_sse2(), ""));2148InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);2149attributes.set_rex_vex_w_reverted();2150int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);2151emit_int16(0x5E, (0xC0 | encode));2152}21532154void Assembler::divss(XMMRegister dst, Address src) {2155NOT_LP64(assert(VM_Version::supports_sse(), ""));2156InstructionMark im(this);2157InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);2158attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);2159simd_prefix(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2160emit_int8(0x5E);2161emit_operand(dst, src);2162}21632164void Assembler::divss(XMMRegister dst, XMMRegister src) {2165NOT_LP64(assert(VM_Version::supports_sse(), ""));2166InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);2167int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2168emit_int16(0x5E, (0xC0 | encode));2169}21702171void Assembler::hlt() {2172emit_int8((unsigned char)0xF4);2173}21742175void Assembler::idivl(Register src) {2176int encode = prefix_and_encode(src->encoding());2177emit_int16((unsigned char)0xF7, (0xF8 | encode));2178}21792180void Assembler::divl(Register src) { // Unsigned2181int encode = prefix_and_encode(src->encoding());2182emit_int16((unsigned char)0xF7, (0xF0 | encode));2183}21842185void Assembler::imull(Register src) {2186int encode = prefix_and_encode(src->encoding());2187emit_int16((unsigned char)0xF7, (0xE8 | encode));2188}21892190void Assembler::imull(Register dst, Register src) {2191int encode = prefix_and_encode(dst->encoding(), src->encoding());2192emit_int24(0x0F,2193(unsigned char)0xAF,2194(0xC0 | encode));2195}21962197void Assembler::imull(Register dst, Address src, int32_t value) {2198InstructionMark im(this);2199prefix(src, dst);2200if (is8bit(value)) {2201emit_int8((unsigned char)0x6B);2202emit_operand(dst, src);2203emit_int8(value);2204} else {2205emit_int8((unsigned char)0x69);2206emit_operand(dst, src);2207emit_int32(value);2208}2209}22102211void Assembler::imull(Register dst, Register src, int value) {2212int encode = prefix_and_encode(dst->encoding(), src->encoding());2213if (is8bit(value)) {2214emit_int24(0x6B, (0xC0 | encode), value & 0xFF);2215} else {2216emit_int16(0x69, (0xC0 | encode));2217emit_int32(value);2218}2219}22202221void Assembler::imull(Register dst, Address src) {2222InstructionMark im(this);2223prefix(src, dst);2224emit_int16(0x0F, (unsigned char)0xAF);2225emit_operand(dst, src);2226}222722282229void Assembler::incl(Address dst) {2230// Don't use it directly. Use MacroAssembler::increment() instead.2231InstructionMark im(this);2232prefix(dst);2233emit_int8((unsigned char)0xFF);2234emit_operand(rax, dst);2235}22362237void Assembler::jcc(Condition cc, Label& L, bool maybe_short) {2238InstructionMark im(this);2239assert((0 <= cc) && (cc < 16), "illegal cc");2240if (L.is_bound()) {2241address dst = target(L);2242assert(dst != NULL, "jcc most probably wrong");22432244const int short_size = 2;2245const int long_size = 6;2246intptr_t offs = (intptr_t)dst - (intptr_t)pc();2247if (maybe_short && is8bit(offs - short_size)) {2248// 0111 tttn #8-bit disp2249emit_int16(0x70 | cc, (offs - short_size) & 0xFF);2250} else {2251// 0000 1111 1000 tttn #32-bit disp2252assert(is_simm32(offs - long_size),2253"must be 32bit offset (call4)");2254emit_int16(0x0F, (0x80 | cc));2255emit_int32(offs - long_size);2256}2257} else {2258// Note: could eliminate cond. jumps to this jump if condition2259// is the same however, seems to be rather unlikely case.2260// Note: use jccb() if label to be bound is very close to get2261// an 8-bit displacement2262L.add_patch_at(code(), locator());2263emit_int16(0x0F, (0x80 | cc));2264emit_int32(0);2265}2266}22672268void Assembler::jccb_0(Condition cc, Label& L, const char* file, int line) {2269if (L.is_bound()) {2270const int short_size = 2;2271address entry = target(L);2272#ifdef ASSERT2273intptr_t dist = (intptr_t)entry - ((intptr_t)pc() + short_size);2274intptr_t delta = short_branch_delta();2275if (delta != 0) {2276dist += (dist < 0 ? (-delta) :delta);2277}2278assert(is8bit(dist), "Dispacement too large for a short jmp at %s:%d", file, line);2279#endif2280intptr_t offs = (intptr_t)entry - (intptr_t)pc();2281// 0111 tttn #8-bit disp2282emit_int16(0x70 | cc, (offs - short_size) & 0xFF);2283} else {2284InstructionMark im(this);2285L.add_patch_at(code(), locator(), file, line);2286emit_int16(0x70 | cc, 0);2287}2288}22892290void Assembler::jmp(Address adr) {2291InstructionMark im(this);2292prefix(adr);2293emit_int8((unsigned char)0xFF);2294emit_operand(rsp, adr);2295}22962297void Assembler::jmp(Label& L, bool maybe_short) {2298if (L.is_bound()) {2299address entry = target(L);2300assert(entry != NULL, "jmp most probably wrong");2301InstructionMark im(this);2302const int short_size = 2;2303const int long_size = 5;2304intptr_t offs = entry - pc();2305if (maybe_short && is8bit(offs - short_size)) {2306emit_int16((unsigned char)0xEB, ((offs - short_size) & 0xFF));2307} else {2308emit_int8((unsigned char)0xE9);2309emit_int32(offs - long_size);2310}2311} else {2312// By default, forward jumps are always 32-bit displacements, since2313// we can't yet know where the label will be bound. If you're sure that2314// the forward jump will not run beyond 256 bytes, use jmpb to2315// force an 8-bit displacement.2316InstructionMark im(this);2317L.add_patch_at(code(), locator());2318emit_int8((unsigned char)0xE9);2319emit_int32(0);2320}2321}23222323void Assembler::jmp(Register entry) {2324int encode = prefix_and_encode(entry->encoding());2325emit_int16((unsigned char)0xFF, (0xE0 | encode));2326}23272328void Assembler::jmp_literal(address dest, RelocationHolder const& rspec) {2329InstructionMark im(this);2330emit_int8((unsigned char)0xE9);2331assert(dest != NULL, "must have a target");2332intptr_t disp = dest - (pc() + sizeof(int32_t));2333assert(is_simm32(disp), "must be 32bit offset (jmp)");2334emit_data(disp, rspec.reloc(), call32_operand);2335}23362337void Assembler::jmpb_0(Label& L, const char* file, int line) {2338if (L.is_bound()) {2339const int short_size = 2;2340address entry = target(L);2341assert(entry != NULL, "jmp most probably wrong");2342#ifdef ASSERT2343intptr_t dist = (intptr_t)entry - ((intptr_t)pc() + short_size);2344intptr_t delta = short_branch_delta();2345if (delta != 0) {2346dist += (dist < 0 ? (-delta) :delta);2347}2348assert(is8bit(dist), "Dispacement too large for a short jmp at %s:%d", file, line);2349#endif2350intptr_t offs = entry - pc();2351emit_int16((unsigned char)0xEB, (offs - short_size) & 0xFF);2352} else {2353InstructionMark im(this);2354L.add_patch_at(code(), locator(), file, line);2355emit_int16((unsigned char)0xEB, 0);2356}2357}23582359void Assembler::ldmxcsr( Address src) {2360if (UseAVX > 0 ) {2361InstructionMark im(this);2362InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2363vex_prefix(src, 0, 0, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2364emit_int8((unsigned char)0xAE);2365emit_operand(as_Register(2), src);2366} else {2367NOT_LP64(assert(VM_Version::supports_sse(), ""));2368InstructionMark im(this);2369prefix(src);2370emit_int16(0x0F, (unsigned char)0xAE);2371emit_operand(as_Register(2), src);2372}2373}23742375void Assembler::leal(Register dst, Address src) {2376InstructionMark im(this);2377#ifdef _LP642378emit_int8(0x67); // addr322379prefix(src, dst);2380#endif // LP642381emit_int8((unsigned char)0x8D);2382emit_operand(dst, src);2383}23842385void Assembler::lfence() {2386emit_int24(0x0F, (unsigned char)0xAE, (unsigned char)0xE8);2387}23882389void Assembler::lock() {2390emit_int8((unsigned char)0xF0);2391}23922393void Assembler::size_prefix() {2394emit_int8(0x66);2395}23962397void Assembler::lzcntl(Register dst, Register src) {2398assert(VM_Version::supports_lzcnt(), "encoding is treated as BSR");2399emit_int8((unsigned char)0xF3);2400int encode = prefix_and_encode(dst->encoding(), src->encoding());2401emit_int24(0x0F, (unsigned char)0xBD, (0xC0 | encode));2402}24032404// Emit mfence instruction2405void Assembler::mfence() {2406NOT_LP64(assert(VM_Version::supports_sse2(), "unsupported");)2407emit_int24(0x0F, (unsigned char)0xAE, (unsigned char)0xF0);2408}24092410// Emit sfence instruction2411void Assembler::sfence() {2412NOT_LP64(assert(VM_Version::supports_sse2(), "unsupported");)2413emit_int24(0x0F, (unsigned char)0xAE, (unsigned char)0xF8);2414}24152416void Assembler::mov(Register dst, Register src) {2417LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));2418}24192420void Assembler::movapd(XMMRegister dst, XMMRegister src) {2421NOT_LP64(assert(VM_Version::supports_sse2(), ""));2422int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_128bit;2423InstructionAttr attributes(vector_len, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2424attributes.set_rex_vex_w_reverted();2425int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2426emit_int16(0x28, (0xC0 | encode));2427}24282429void Assembler::movaps(XMMRegister dst, XMMRegister src) {2430NOT_LP64(assert(VM_Version::supports_sse(), ""));2431int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_128bit;2432InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2433int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2434emit_int16(0x28, (0xC0 | encode));2435}24362437void Assembler::movlhps(XMMRegister dst, XMMRegister src) {2438NOT_LP64(assert(VM_Version::supports_sse(), ""));2439InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2440int encode = simd_prefix_and_encode(dst, src, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2441emit_int16(0x16, (0xC0 | encode));2442}24432444void Assembler::movb(Register dst, Address src) {2445NOT_LP64(assert(dst->has_byte_register(), "must have byte register"));2446InstructionMark im(this);2447prefix(src, dst, true);2448emit_int8((unsigned char)0x8A);2449emit_operand(dst, src);2450}24512452void Assembler::movddup(XMMRegister dst, XMMRegister src) {2453NOT_LP64(assert(VM_Version::supports_sse3(), ""));2454int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_128bit;2455InstructionAttr attributes(vector_len, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2456attributes.set_rex_vex_w_reverted();2457int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);2458emit_int16(0x12, 0xC0 | encode);2459}24602461void Assembler::kmovbl(KRegister dst, Register src) {2462assert(VM_Version::supports_avx512dq(), "");2463InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2464int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2465emit_int16((unsigned char)0x92, (0xC0 | encode));2466}24672468void Assembler::kmovbl(Register dst, KRegister src) {2469assert(VM_Version::supports_avx512dq(), "");2470InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2471int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2472emit_int16((unsigned char)0x93, (0xC0 | encode));2473}24742475void Assembler::kmovwl(KRegister dst, Register src) {2476assert(VM_Version::supports_evex(), "");2477InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2478int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2479emit_int16((unsigned char)0x92, (0xC0 | encode));2480}24812482void Assembler::kmovwl(Register dst, KRegister src) {2483assert(VM_Version::supports_evex(), "");2484InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2485int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2486emit_int16((unsigned char)0x93, (0xC0 | encode));2487}24882489void Assembler::kmovwl(KRegister dst, Address src) {2490assert(VM_Version::supports_evex(), "");2491InstructionMark im(this);2492InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2493vex_prefix(src, 0, dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2494emit_int8((unsigned char)0x90);2495emit_operand((Register)dst, src);2496}24972498void Assembler::kmovwl(Address dst, KRegister src) {2499assert(VM_Version::supports_evex(), "");2500InstructionMark im(this);2501InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2502vex_prefix(dst, 0, src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2503emit_int8((unsigned char)0x91);2504emit_operand((Register)src, dst);2505}25062507void Assembler::kmovwl(KRegister dst, KRegister src) {2508assert(VM_Version::supports_avx512bw(), "");2509InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2510int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2511emit_int16((unsigned char)0x90, (0xC0 | encode));2512}25132514void Assembler::kmovdl(KRegister dst, Register src) {2515assert(VM_Version::supports_avx512bw(), "");2516InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2517int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);2518emit_int16((unsigned char)0x92, (0xC0 | encode));2519}25202521void Assembler::kmovdl(Register dst, KRegister src) {2522assert(VM_Version::supports_avx512bw(), "");2523InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2524int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);2525emit_int16((unsigned char)0x93, (0xC0 | encode));2526}25272528void Assembler::kmovql(KRegister dst, KRegister src) {2529assert(VM_Version::supports_avx512bw(), "");2530InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2531int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2532emit_int16((unsigned char)0x90, (0xC0 | encode));2533}25342535void Assembler::kmovql(KRegister dst, Address src) {2536assert(VM_Version::supports_avx512bw(), "");2537InstructionMark im(this);2538InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2539vex_prefix(src, 0, dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2540emit_int8((unsigned char)0x90);2541emit_operand((Register)dst, src);2542}25432544void Assembler::kmovql(Address dst, KRegister src) {2545assert(VM_Version::supports_avx512bw(), "");2546InstructionMark im(this);2547InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2548vex_prefix(dst, 0, src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2549emit_int8((unsigned char)0x91);2550emit_operand((Register)src, dst);2551}25522553void Assembler::kmovql(KRegister dst, Register src) {2554assert(VM_Version::supports_avx512bw(), "");2555InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2556int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);2557emit_int16((unsigned char)0x92, (0xC0 | encode));2558}25592560void Assembler::kmovql(Register dst, KRegister src) {2561assert(VM_Version::supports_avx512bw(), "");2562InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2563int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);2564emit_int16((unsigned char)0x93, (0xC0 | encode));2565}25662567void Assembler::knotwl(KRegister dst, KRegister src) {2568assert(VM_Version::supports_evex(), "");2569InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2570int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2571emit_int16(0x44, (0xC0 | encode));2572}25732574void Assembler::knotql(KRegister dst, KRegister src) {2575assert(VM_Version::supports_avx512bw(), "");2576InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2577int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2578emit_int16(0x44, (0xC0 | encode));2579}25802581// This instruction produces ZF or CF flags2582void Assembler::kortestbl(KRegister src1, KRegister src2) {2583assert(VM_Version::supports_avx512dq(), "");2584InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2585int encode = vex_prefix_and_encode(src1->encoding(), 0, src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2586emit_int16((unsigned char)0x98, (0xC0 | encode));2587}25882589// This instruction produces ZF or CF flags2590void Assembler::kortestwl(KRegister src1, KRegister src2) {2591assert(VM_Version::supports_evex(), "");2592InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2593int encode = vex_prefix_and_encode(src1->encoding(), 0, src2->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2594emit_int16((unsigned char)0x98, (0xC0 | encode));2595}25962597// This instruction produces ZF or CF flags2598void Assembler::kortestdl(KRegister src1, KRegister src2) {2599assert(VM_Version::supports_avx512bw(), "");2600InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2601int encode = vex_prefix_and_encode(src1->encoding(), 0, src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2602emit_int16((unsigned char)0x98, (0xC0 | encode));2603}26042605// This instruction produces ZF or CF flags2606void Assembler::kortestql(KRegister src1, KRegister src2) {2607assert(VM_Version::supports_avx512bw(), "");2608InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2609int encode = vex_prefix_and_encode(src1->encoding(), 0, src2->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2610emit_int16((unsigned char)0x98, (0xC0 | encode));2611}26122613// This instruction produces ZF or CF flags2614void Assembler::ktestql(KRegister src1, KRegister src2) {2615assert(VM_Version::supports_avx512bw(), "");2616InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2617int encode = vex_prefix_and_encode(src1->encoding(), 0, src2->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2618emit_int16((unsigned char)0x99, (0xC0 | encode));2619}26202621void Assembler::ktestq(KRegister src1, KRegister src2) {2622assert(VM_Version::supports_avx512bw(), "");2623InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2624int encode = vex_prefix_and_encode(src1->encoding(), 0, src2->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2625emit_int16((unsigned char)0x99, (0xC0 | encode));2626}26272628void Assembler::ktestd(KRegister src1, KRegister src2) {2629assert(VM_Version::supports_avx512bw(), "");2630InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2631int encode = vex_prefix_and_encode(src1->encoding(), 0, src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2632emit_int16((unsigned char)0x99, (0xC0 | encode));2633}26342635void Assembler::movb(Address dst, int imm8) {2636InstructionMark im(this);2637prefix(dst);2638emit_int8((unsigned char)0xC6);2639emit_operand(rax, dst, 1);2640emit_int8(imm8);2641}264226432644void Assembler::movb(Address dst, Register src) {2645assert(src->has_byte_register(), "must have byte register");2646InstructionMark im(this);2647prefix(dst, src, true);2648emit_int8((unsigned char)0x88);2649emit_operand(src, dst);2650}26512652void Assembler::movdl(XMMRegister dst, Register src) {2653NOT_LP64(assert(VM_Version::supports_sse2(), ""));2654InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);2655int encode = simd_prefix_and_encode(dst, xnoreg, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2656emit_int16(0x6E, (0xC0 | encode));2657}26582659void Assembler::movdl(Register dst, XMMRegister src) {2660NOT_LP64(assert(VM_Version::supports_sse2(), ""));2661InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);2662// swap src/dst to get correct prefix2663int encode = simd_prefix_and_encode(src, xnoreg, as_XMMRegister(dst->encoding()), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2664emit_int16(0x7E, (0xC0 | encode));2665}26662667void Assembler::movdl(XMMRegister dst, Address src) {2668NOT_LP64(assert(VM_Version::supports_sse2(), ""));2669InstructionMark im(this);2670InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);2671attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);2672simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2673emit_int8(0x6E);2674emit_operand(dst, src);2675}26762677void Assembler::movdl(Address dst, XMMRegister src) {2678NOT_LP64(assert(VM_Version::supports_sse2(), ""));2679InstructionMark im(this);2680InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);2681attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);2682simd_prefix(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2683emit_int8(0x7E);2684emit_operand(src, dst);2685}26862687void Assembler::movdqa(XMMRegister dst, XMMRegister src) {2688NOT_LP64(assert(VM_Version::supports_sse2(), ""));2689InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2690int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2691emit_int16(0x6F, (0xC0 | encode));2692}26932694void Assembler::movdqa(XMMRegister dst, Address src) {2695NOT_LP64(assert(VM_Version::supports_sse2(), ""));2696InstructionMark im(this);2697InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2698attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2699simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2700emit_int8(0x6F);2701emit_operand(dst, src);2702}27032704void Assembler::movdqu(XMMRegister dst, Address src) {2705NOT_LP64(assert(VM_Version::supports_sse2(), ""));2706InstructionMark im(this);2707InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2708attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2709simd_prefix(dst, xnoreg, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2710emit_int8(0x6F);2711emit_operand(dst, src);2712}27132714void Assembler::movdqu(XMMRegister dst, XMMRegister src) {2715NOT_LP64(assert(VM_Version::supports_sse2(), ""));2716InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2717int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2718emit_int16(0x6F, (0xC0 | encode));2719}27202721void Assembler::movdqu(Address dst, XMMRegister src) {2722NOT_LP64(assert(VM_Version::supports_sse2(), ""));2723InstructionMark im(this);2724InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2725attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2726attributes.reset_is_clear_context();2727simd_prefix(src, xnoreg, dst, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2728emit_int8(0x7F);2729emit_operand(src, dst);2730}27312732// Move Unaligned 256bit Vector2733void Assembler::vmovdqu(XMMRegister dst, XMMRegister src) {2734assert(UseAVX > 0, "");2735InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2736int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2737emit_int16(0x6F, (0xC0 | encode));2738}27392740void Assembler::vmovdqu(XMMRegister dst, Address src) {2741assert(UseAVX > 0, "");2742InstructionMark im(this);2743InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2744attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2745vex_prefix(src, 0, dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2746emit_int8(0x6F);2747emit_operand(dst, src);2748}27492750void Assembler::vmovdqu(Address dst, XMMRegister src) {2751assert(UseAVX > 0, "");2752InstructionMark im(this);2753InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2754attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2755attributes.reset_is_clear_context();2756// swap src<->dst for encoding2757assert(src != xnoreg, "sanity");2758vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2759emit_int8(0x7F);2760emit_operand(src, dst);2761}27622763// Move Unaligned EVEX enabled Vector (programmable : 8,16,32,64)2764void Assembler::evmovdqub(XMMRegister dst, XMMRegister src, bool merge, int vector_len) {2765assert(VM_Version::supports_evex(), "");2766InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);2767attributes.set_is_evex_instruction();2768if (merge) {2769attributes.reset_is_clear_context();2770}2771int prefix = (_legacy_mode_bw) ? VEX_SIMD_F2 : VEX_SIMD_F3;2772int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), (Assembler::VexSimdPrefix)prefix, VEX_OPCODE_0F, &attributes);2773emit_int16(0x6F, (0xC0 | encode));2774}27752776void Assembler::evmovdqub(XMMRegister dst, Address src, bool merge, int vector_len) {2777assert(VM_Version::supports_evex(), "");2778InstructionMark im(this);2779InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);2780int prefix = (_legacy_mode_bw) ? VEX_SIMD_F2 : VEX_SIMD_F3;2781attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2782attributes.set_is_evex_instruction();2783if (merge) {2784attributes.reset_is_clear_context();2785}2786vex_prefix(src, 0, dst->encoding(), (Assembler::VexSimdPrefix)prefix, VEX_OPCODE_0F, &attributes);2787emit_int8(0x6F);2788emit_operand(dst, src);2789}27902791void Assembler::evmovdqub(Address dst, XMMRegister src, bool merge, int vector_len) {2792assert(VM_Version::supports_evex(), "");2793assert(src != xnoreg, "sanity");2794InstructionMark im(this);2795InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);2796int prefix = (_legacy_mode_bw) ? VEX_SIMD_F2 : VEX_SIMD_F3;2797attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2798attributes.set_is_evex_instruction();2799if (merge) {2800attributes.reset_is_clear_context();2801}2802vex_prefix(dst, 0, src->encoding(), (Assembler::VexSimdPrefix)prefix, VEX_OPCODE_0F, &attributes);2803emit_int8(0x7F);2804emit_operand(src, dst);2805}28062807void Assembler::evmovdqub(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) {2808assert(VM_Version::supports_avx512vlbw(), "");2809InstructionMark im(this);2810InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);2811attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2812attributes.set_embedded_opmask_register_specifier(mask);2813attributes.set_is_evex_instruction();2814if (merge) {2815attributes.reset_is_clear_context();2816}2817vex_prefix(src, 0, dst->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);2818emit_int8(0x6F);2819emit_operand(dst, src);2820}28212822void Assembler::evmovdqub(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {2823assert(VM_Version::supports_avx512vlbw(), "");2824assert(src != xnoreg, "sanity");2825InstructionMark im(this);2826InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);2827attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2828attributes.set_embedded_opmask_register_specifier(mask);2829attributes.set_is_evex_instruction();2830if (merge) {2831attributes.reset_is_clear_context();2832}2833vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);2834emit_int8(0x7F);2835emit_operand(src, dst);2836}28372838void Assembler::evmovdquw(XMMRegister dst, Address src, bool merge, int vector_len) {2839assert(VM_Version::supports_evex(), "");2840InstructionMark im(this);2841InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);2842attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2843attributes.set_is_evex_instruction();2844if (merge) {2845attributes.reset_is_clear_context();2846}2847int prefix = (_legacy_mode_bw) ? VEX_SIMD_F2 : VEX_SIMD_F3;2848vex_prefix(src, 0, dst->encoding(), (Assembler::VexSimdPrefix)prefix, VEX_OPCODE_0F, &attributes);2849emit_int8(0x6F);2850emit_operand(dst, src);2851}28522853void Assembler::evmovdquw(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) {2854assert(VM_Version::supports_avx512vlbw(), "");2855InstructionMark im(this);2856InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);2857attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2858attributes.set_embedded_opmask_register_specifier(mask);2859attributes.set_is_evex_instruction();2860if (merge) {2861attributes.reset_is_clear_context();2862}2863vex_prefix(src, 0, dst->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);2864emit_int8(0x6F);2865emit_operand(dst, src);2866}28672868void Assembler::evmovdquw(Address dst, XMMRegister src, bool merge, int vector_len) {2869assert(VM_Version::supports_evex(), "");2870assert(src != xnoreg, "sanity");2871InstructionMark im(this);2872InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);2873attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2874attributes.set_is_evex_instruction();2875if (merge) {2876attributes.reset_is_clear_context();2877}2878int prefix = (_legacy_mode_bw) ? VEX_SIMD_F2 : VEX_SIMD_F3;2879vex_prefix(dst, 0, src->encoding(), (Assembler::VexSimdPrefix)prefix, VEX_OPCODE_0F, &attributes);2880emit_int8(0x7F);2881emit_operand(src, dst);2882}28832884void Assembler::evmovdquw(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {2885assert(VM_Version::supports_avx512vlbw(), "");2886assert(src != xnoreg, "sanity");2887InstructionMark im(this);2888InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);2889attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2890attributes.set_embedded_opmask_register_specifier(mask);2891attributes.set_is_evex_instruction();2892if (merge) {2893attributes.reset_is_clear_context();2894}2895vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);2896emit_int8(0x7F);2897emit_operand(src, dst);2898}28992900void Assembler::evmovdqul(XMMRegister dst, XMMRegister src, int vector_len) {2901// Unmasked instruction2902evmovdqul(dst, k0, src, /*merge*/ false, vector_len);2903}29042905void Assembler::evmovdqul(XMMRegister dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {2906assert(VM_Version::supports_evex(), "");2907InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);2908attributes.set_embedded_opmask_register_specifier(mask);2909attributes.set_is_evex_instruction();2910if (merge) {2911attributes.reset_is_clear_context();2912}2913int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2914emit_int16(0x6F, (0xC0 | encode));2915}29162917void Assembler::evmovdqul(XMMRegister dst, Address src, int vector_len) {2918// Unmasked instruction2919evmovdqul(dst, k0, src, /*merge*/ false, vector_len);2920}29212922void Assembler::evmovdqul(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) {2923assert(VM_Version::supports_evex(), "");2924InstructionMark im(this);2925InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false , /* uses_vl */ true);2926attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2927attributes.set_embedded_opmask_register_specifier(mask);2928attributes.set_is_evex_instruction();2929if (merge) {2930attributes.reset_is_clear_context();2931}2932vex_prefix(src, 0, dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2933emit_int8(0x6F);2934emit_operand(dst, src);2935}29362937void Assembler::evmovdqul(Address dst, XMMRegister src, int vector_len) {2938// Unmasked isntruction2939evmovdqul(dst, k0, src, /*merge*/ true, vector_len);2940}29412942void Assembler::evmovdqul(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {2943assert(VM_Version::supports_evex(), "");2944assert(src != xnoreg, "sanity");2945InstructionMark im(this);2946InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);2947attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2948attributes.set_embedded_opmask_register_specifier(mask);2949attributes.set_is_evex_instruction();2950if (merge) {2951attributes.reset_is_clear_context();2952}2953vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2954emit_int8(0x7F);2955emit_operand(src, dst);2956}29572958void Assembler::evmovdquq(XMMRegister dst, XMMRegister src, int vector_len) {2959// Unmasked instruction2960if (dst->encoding() == src->encoding()) return;2961evmovdquq(dst, k0, src, /*merge*/ false, vector_len);2962}29632964void Assembler::evmovdquq(XMMRegister dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {2965assert(VM_Version::supports_evex(), "");2966InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);2967attributes.set_embedded_opmask_register_specifier(mask);2968attributes.set_is_evex_instruction();2969if (merge) {2970attributes.reset_is_clear_context();2971}2972int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2973emit_int16(0x6F, (0xC0 | encode));2974}29752976void Assembler::evmovdquq(XMMRegister dst, Address src, int vector_len) {2977// Unmasked instruction2978evmovdquq(dst, k0, src, /*merge*/ false, vector_len);2979}29802981void Assembler::evmovdquq(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) {2982assert(VM_Version::supports_evex(), "");2983InstructionMark im(this);2984InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);2985attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2986attributes.set_embedded_opmask_register_specifier(mask);2987attributes.set_is_evex_instruction();2988if (merge) {2989attributes.reset_is_clear_context();2990}2991vex_prefix(src, 0, dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2992emit_int8(0x6F);2993emit_operand(dst, src);2994}29952996void Assembler::evmovdquq(Address dst, XMMRegister src, int vector_len) {2997// Unmasked instruction2998evmovdquq(dst, k0, src, /*merge*/ true, vector_len);2999}30003001void Assembler::evmovdquq(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {3002assert(VM_Version::supports_evex(), "");3003assert(src != xnoreg, "sanity");3004InstructionMark im(this);3005InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);3006attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);3007attributes.set_embedded_opmask_register_specifier(mask);3008if (merge) {3009attributes.reset_is_clear_context();3010}3011attributes.set_is_evex_instruction();3012vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);3013emit_int8(0x7F);3014emit_operand(src, dst);3015}30163017// Uses zero extension on 64bit30183019void Assembler::movl(Register dst, int32_t imm32) {3020int encode = prefix_and_encode(dst->encoding());3021emit_int8(0xB8 | encode);3022emit_int32(imm32);3023}30243025void Assembler::movl(Register dst, Register src) {3026int encode = prefix_and_encode(dst->encoding(), src->encoding());3027emit_int16((unsigned char)0x8B, (0xC0 | encode));3028}30293030void Assembler::movl(Register dst, Address src) {3031InstructionMark im(this);3032prefix(src, dst);3033emit_int8((unsigned char)0x8B);3034emit_operand(dst, src);3035}30363037void Assembler::movl(Address dst, int32_t imm32) {3038InstructionMark im(this);3039prefix(dst);3040emit_int8((unsigned char)0xC7);3041emit_operand(rax, dst, 4);3042emit_int32(imm32);3043}30443045void Assembler::movl(Address dst, Register src) {3046InstructionMark im(this);3047prefix(dst, src);3048emit_int8((unsigned char)0x89);3049emit_operand(src, dst);3050}30513052// New cpus require to use movsd and movss to avoid partial register stall3053// when loading from memory. But for old Opteron use movlpd instead of movsd.3054// The selection is done in MacroAssembler::movdbl() and movflt().3055void Assembler::movlpd(XMMRegister dst, Address src) {3056NOT_LP64(assert(VM_Version::supports_sse2(), ""));3057InstructionMark im(this);3058InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3059attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);3060attributes.set_rex_vex_w_reverted();3061simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3062emit_int8(0x12);3063emit_operand(dst, src);3064}30653066void Assembler::movq(XMMRegister dst, Address src) {3067NOT_LP64(assert(VM_Version::supports_sse2(), ""));3068InstructionMark im(this);3069InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3070attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);3071attributes.set_rex_vex_w_reverted();3072simd_prefix(dst, xnoreg, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);3073emit_int8(0x7E);3074emit_operand(dst, src);3075}30763077void Assembler::movq(Address dst, XMMRegister src) {3078NOT_LP64(assert(VM_Version::supports_sse2(), ""));3079InstructionMark im(this);3080InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3081attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);3082attributes.set_rex_vex_w_reverted();3083simd_prefix(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3084emit_int8((unsigned char)0xD6);3085emit_operand(src, dst);3086}30873088void Assembler::movq(XMMRegister dst, XMMRegister src) {3089NOT_LP64(assert(VM_Version::supports_sse2(), ""));3090InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3091attributes.set_rex_vex_w_reverted();3092int encode = simd_prefix_and_encode(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3093emit_int16((unsigned char)0xD6, (0xC0 | encode));3094}30953096void Assembler::movq(Register dst, XMMRegister src) {3097NOT_LP64(assert(VM_Version::supports_sse2(), ""));3098InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3099// swap src/dst to get correct prefix3100int encode = simd_prefix_and_encode(src, xnoreg, as_XMMRegister(dst->encoding()), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3101emit_int16(0x7E, (0xC0 | encode));3102}31033104void Assembler::movq(XMMRegister dst, Register src) {3105NOT_LP64(assert(VM_Version::supports_sse2(), ""));3106InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3107int encode = simd_prefix_and_encode(dst, xnoreg, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3108emit_int16(0x6E, (0xC0 | encode));3109}31103111void Assembler::movsbl(Register dst, Address src) { // movsxb3112InstructionMark im(this);3113prefix(src, dst);3114emit_int16(0x0F, (unsigned char)0xBE);3115emit_operand(dst, src);3116}31173118void Assembler::movsbl(Register dst, Register src) { // movsxb3119NOT_LP64(assert(src->has_byte_register(), "must have byte register"));3120int encode = prefix_and_encode(dst->encoding(), false, src->encoding(), true);3121emit_int24(0x0F, (unsigned char)0xBE, (0xC0 | encode));3122}31233124void Assembler::movsd(XMMRegister dst, XMMRegister src) {3125NOT_LP64(assert(VM_Version::supports_sse2(), ""));3126InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3127attributes.set_rex_vex_w_reverted();3128int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);3129emit_int16(0x10, (0xC0 | encode));3130}31313132void Assembler::movsd(XMMRegister dst, Address src) {3133NOT_LP64(assert(VM_Version::supports_sse2(), ""));3134InstructionMark im(this);3135InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3136attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);3137attributes.set_rex_vex_w_reverted();3138simd_prefix(dst, xnoreg, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);3139emit_int8(0x10);3140emit_operand(dst, src);3141}31423143void Assembler::movsd(Address dst, XMMRegister src) {3144NOT_LP64(assert(VM_Version::supports_sse2(), ""));3145InstructionMark im(this);3146InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3147attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);3148attributes.reset_is_clear_context();3149attributes.set_rex_vex_w_reverted();3150simd_prefix(src, xnoreg, dst, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);3151emit_int8(0x11);3152emit_operand(src, dst);3153}31543155void Assembler::movss(XMMRegister dst, XMMRegister src) {3156NOT_LP64(assert(VM_Version::supports_sse(), ""));3157InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3158int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);3159emit_int16(0x10, (0xC0 | encode));3160}31613162void Assembler::movss(XMMRegister dst, Address src) {3163NOT_LP64(assert(VM_Version::supports_sse(), ""));3164InstructionMark im(this);3165InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3166attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);3167simd_prefix(dst, xnoreg, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);3168emit_int8(0x10);3169emit_operand(dst, src);3170}31713172void Assembler::movss(Address dst, XMMRegister src) {3173NOT_LP64(assert(VM_Version::supports_sse(), ""));3174InstructionMark im(this);3175InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3176attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);3177attributes.reset_is_clear_context();3178simd_prefix(src, xnoreg, dst, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);3179emit_int8(0x11);3180emit_operand(src, dst);3181}31823183void Assembler::movswl(Register dst, Address src) { // movsxw3184InstructionMark im(this);3185prefix(src, dst);3186emit_int16(0x0F, (unsigned char)0xBF);3187emit_operand(dst, src);3188}31893190void Assembler::movswl(Register dst, Register src) { // movsxw3191int encode = prefix_and_encode(dst->encoding(), src->encoding());3192emit_int24(0x0F, (unsigned char)0xBF, (0xC0 | encode));3193}31943195void Assembler::movw(Address dst, int imm16) {3196InstructionMark im(this);31973198emit_int8(0x66); // switch to 16-bit mode3199prefix(dst);3200emit_int8((unsigned char)0xC7);3201emit_operand(rax, dst, 2);3202emit_int16(imm16);3203}32043205void Assembler::movw(Register dst, Address src) {3206InstructionMark im(this);3207emit_int8(0x66);3208prefix(src, dst);3209emit_int8((unsigned char)0x8B);3210emit_operand(dst, src);3211}32123213void Assembler::movw(Address dst, Register src) {3214InstructionMark im(this);3215emit_int8(0x66);3216prefix(dst, src);3217emit_int8((unsigned char)0x89);3218emit_operand(src, dst);3219}32203221void Assembler::movzbl(Register dst, Address src) { // movzxb3222InstructionMark im(this);3223prefix(src, dst);3224emit_int16(0x0F, (unsigned char)0xB6);3225emit_operand(dst, src);3226}32273228void Assembler::movzbl(Register dst, Register src) { // movzxb3229NOT_LP64(assert(src->has_byte_register(), "must have byte register"));3230int encode = prefix_and_encode(dst->encoding(), false, src->encoding(), true);3231emit_int24(0x0F, (unsigned char)0xB6, 0xC0 | encode);3232}32333234void Assembler::movzwl(Register dst, Address src) { // movzxw3235InstructionMark im(this);3236prefix(src, dst);3237emit_int16(0x0F, (unsigned char)0xB7);3238emit_operand(dst, src);3239}32403241void Assembler::movzwl(Register dst, Register src) { // movzxw3242int encode = prefix_and_encode(dst->encoding(), src->encoding());3243emit_int24(0x0F, (unsigned char)0xB7, 0xC0 | encode);3244}32453246void Assembler::mull(Address src) {3247InstructionMark im(this);3248prefix(src);3249emit_int8((unsigned char)0xF7);3250emit_operand(rsp, src);3251}32523253void Assembler::mull(Register src) {3254int encode = prefix_and_encode(src->encoding());3255emit_int16((unsigned char)0xF7, (0xE0 | encode));3256}32573258void Assembler::mulsd(XMMRegister dst, Address src) {3259NOT_LP64(assert(VM_Version::supports_sse2(), ""));3260InstructionMark im(this);3261InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3262attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);3263attributes.set_rex_vex_w_reverted();3264simd_prefix(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);3265emit_int8(0x59);3266emit_operand(dst, src);3267}32683269void Assembler::mulsd(XMMRegister dst, XMMRegister src) {3270NOT_LP64(assert(VM_Version::supports_sse2(), ""));3271InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3272attributes.set_rex_vex_w_reverted();3273int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);3274emit_int16(0x59, (0xC0 | encode));3275}32763277void Assembler::mulss(XMMRegister dst, Address src) {3278NOT_LP64(assert(VM_Version::supports_sse(), ""));3279InstructionMark im(this);3280InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3281attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);3282simd_prefix(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);3283emit_int8(0x59);3284emit_operand(dst, src);3285}32863287void Assembler::mulss(XMMRegister dst, XMMRegister src) {3288NOT_LP64(assert(VM_Version::supports_sse(), ""));3289InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3290int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);3291emit_int16(0x59, (0xC0 | encode));3292}32933294void Assembler::negl(Register dst) {3295int encode = prefix_and_encode(dst->encoding());3296emit_int16((unsigned char)0xF7, (0xD8 | encode));3297}32983299void Assembler::negl(Address dst) {3300InstructionMark im(this);3301prefix(dst);3302emit_int8((unsigned char)0xF7);3303emit_operand(as_Register(3), dst);3304}33053306void Assembler::nop(int i) {3307#ifdef ASSERT3308assert(i > 0, " ");3309// The fancy nops aren't currently recognized by debuggers making it a3310// pain to disassemble code while debugging. If asserts are on clearly3311// speed is not an issue so simply use the single byte traditional nop3312// to do alignment.33133314for (; i > 0 ; i--) emit_int8((unsigned char)0x90);3315return;33163317#endif // ASSERT33183319if (UseAddressNop && VM_Version::is_intel()) {3320//3321// Using multi-bytes nops "0x0F 0x1F [address]" for Intel3322// 1: 0x903323// 2: 0x66 0x903324// 3: 0x66 0x66 0x90 (don't use "0x0F 0x1F 0x00" - need patching safe padding)3325// 4: 0x0F 0x1F 0x40 0x003326// 5: 0x0F 0x1F 0x44 0x00 0x003327// 6: 0x66 0x0F 0x1F 0x44 0x00 0x003328// 7: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x003329// 8: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003330// 9: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003331// 10: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003332// 11: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x0033333334// The rest coding is Intel specific - don't use consecutive address nops33353336// 12: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x903337// 13: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x903338// 14: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x903339// 15: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x9033403341while(i >= 15) {3342// For Intel don't generate consecutive addess nops (mix with regular nops)3343i -= 15;3344emit_int24(0x66, 0x66, 0x66);3345addr_nop_8();3346emit_int32(0x66, 0x66, 0x66, (unsigned char)0x90);3347}3348switch (i) {3349case 14:3350emit_int8(0x66); // size prefix3351case 13:3352emit_int8(0x66); // size prefix3353case 12:3354addr_nop_8();3355emit_int32(0x66, 0x66, 0x66, (unsigned char)0x90);3356break;3357case 11:3358emit_int8(0x66); // size prefix3359case 10:3360emit_int8(0x66); // size prefix3361case 9:3362emit_int8(0x66); // size prefix3363case 8:3364addr_nop_8();3365break;3366case 7:3367addr_nop_7();3368break;3369case 6:3370emit_int8(0x66); // size prefix3371case 5:3372addr_nop_5();3373break;3374case 4:3375addr_nop_4();3376break;3377case 3:3378// Don't use "0x0F 0x1F 0x00" - need patching safe padding3379emit_int8(0x66); // size prefix3380case 2:3381emit_int8(0x66); // size prefix3382case 1:3383emit_int8((unsigned char)0x90);3384// nop3385break;3386default:3387assert(i == 0, " ");3388}3389return;3390}3391if (UseAddressNop && VM_Version::is_amd_family()) {3392//3393// Using multi-bytes nops "0x0F 0x1F [address]" for AMD.3394// 1: 0x903395// 2: 0x66 0x903396// 3: 0x66 0x66 0x90 (don't use "0x0F 0x1F 0x00" - need patching safe padding)3397// 4: 0x0F 0x1F 0x40 0x003398// 5: 0x0F 0x1F 0x44 0x00 0x003399// 6: 0x66 0x0F 0x1F 0x44 0x00 0x003400// 7: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x003401// 8: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003402// 9: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003403// 10: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003404// 11: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x0034053406// The rest coding is AMD specific - use consecutive address nops34073408// 12: 0x66 0x0F 0x1F 0x44 0x00 0x00 0x66 0x0F 0x1F 0x44 0x00 0x003409// 13: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00 0x66 0x0F 0x1F 0x44 0x00 0x003410// 14: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00 0x0F 0x1F 0x80 0x00 0x00 0x00 0x003411// 15: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x0F 0x1F 0x80 0x00 0x00 0x00 0x003412// 16: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003413// Size prefixes (0x66) are added for larger sizes34143415while(i >= 22) {3416i -= 11;3417emit_int24(0x66, 0x66, 0x66);3418addr_nop_8();3419}3420// Generate first nop for size between 21-123421switch (i) {3422case 21:3423i -= 1;3424emit_int8(0x66); // size prefix3425case 20:3426case 19:3427i -= 1;3428emit_int8(0x66); // size prefix3429case 18:3430case 17:3431i -= 1;3432emit_int8(0x66); // size prefix3433case 16:3434case 15:3435i -= 8;3436addr_nop_8();3437break;3438case 14:3439case 13:3440i -= 7;3441addr_nop_7();3442break;3443case 12:3444i -= 6;3445emit_int8(0x66); // size prefix3446addr_nop_5();3447break;3448default:3449assert(i < 12, " ");3450}34513452// Generate second nop for size between 11-13453switch (i) {3454case 11:3455emit_int8(0x66); // size prefix3456case 10:3457emit_int8(0x66); // size prefix3458case 9:3459emit_int8(0x66); // size prefix3460case 8:3461addr_nop_8();3462break;3463case 7:3464addr_nop_7();3465break;3466case 6:3467emit_int8(0x66); // size prefix3468case 5:3469addr_nop_5();3470break;3471case 4:3472addr_nop_4();3473break;3474case 3:3475// Don't use "0x0F 0x1F 0x00" - need patching safe padding3476emit_int8(0x66); // size prefix3477case 2:3478emit_int8(0x66); // size prefix3479case 1:3480emit_int8((unsigned char)0x90);3481// nop3482break;3483default:3484assert(i == 0, " ");3485}3486return;3487}34883489if (UseAddressNop && VM_Version::is_zx()) {3490//3491// Using multi-bytes nops "0x0F 0x1F [address]" for ZX3492// 1: 0x903493// 2: 0x66 0x903494// 3: 0x66 0x66 0x90 (don't use "0x0F 0x1F 0x00" - need patching safe padding)3495// 4: 0x0F 0x1F 0x40 0x003496// 5: 0x0F 0x1F 0x44 0x00 0x003497// 6: 0x66 0x0F 0x1F 0x44 0x00 0x003498// 7: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x003499// 8: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003500// 9: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003501// 10: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003502// 11: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x0035033504// The rest coding is ZX specific - don't use consecutive address nops35053506// 12: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x903507// 13: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x903508// 14: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x903509// 15: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x9035103511while (i >= 15) {3512// For ZX don't generate consecutive addess nops (mix with regular nops)3513i -= 15;3514emit_int24(0x66, 0x66, 0x66);3515addr_nop_8();3516emit_int32(0x66, 0x66, 0x66, (unsigned char)0x90);3517}3518switch (i) {3519case 14:3520emit_int8(0x66); // size prefix3521case 13:3522emit_int8(0x66); // size prefix3523case 12:3524addr_nop_8();3525emit_int32(0x66, 0x66, 0x66, (unsigned char)0x90);3526break;3527case 11:3528emit_int8(0x66); // size prefix3529case 10:3530emit_int8(0x66); // size prefix3531case 9:3532emit_int8(0x66); // size prefix3533case 8:3534addr_nop_8();3535break;3536case 7:3537addr_nop_7();3538break;3539case 6:3540emit_int8(0x66); // size prefix3541case 5:3542addr_nop_5();3543break;3544case 4:3545addr_nop_4();3546break;3547case 3:3548// Don't use "0x0F 0x1F 0x00" - need patching safe padding3549emit_int8(0x66); // size prefix3550case 2:3551emit_int8(0x66); // size prefix3552case 1:3553emit_int8((unsigned char)0x90);3554// nop3555break;3556default:3557assert(i == 0, " ");3558}3559return;3560}35613562// Using nops with size prefixes "0x66 0x90".3563// From AMD Optimization Guide:3564// 1: 0x903565// 2: 0x66 0x903566// 3: 0x66 0x66 0x903567// 4: 0x66 0x66 0x66 0x903568// 5: 0x66 0x66 0x90 0x66 0x903569// 6: 0x66 0x66 0x90 0x66 0x66 0x903570// 7: 0x66 0x66 0x66 0x90 0x66 0x66 0x903571// 8: 0x66 0x66 0x66 0x90 0x66 0x66 0x66 0x903572// 9: 0x66 0x66 0x90 0x66 0x66 0x90 0x66 0x66 0x903573// 10: 0x66 0x66 0x66 0x90 0x66 0x66 0x90 0x66 0x66 0x903574//3575while (i > 12) {3576i -= 4;3577emit_int32(0x66, 0x66, 0x66, (unsigned char)0x90);3578}3579// 1 - 12 nops3580if (i > 8) {3581if (i > 9) {3582i -= 1;3583emit_int8(0x66);3584}3585i -= 3;3586emit_int24(0x66, 0x66, (unsigned char)0x90);3587}3588// 1 - 8 nops3589if (i > 4) {3590if (i > 6) {3591i -= 1;3592emit_int8(0x66);3593}3594i -= 3;3595emit_int24(0x66, 0x66, (unsigned char)0x90);3596}3597switch (i) {3598case 4:3599emit_int8(0x66);3600case 3:3601emit_int8(0x66);3602case 2:3603emit_int8(0x66);3604case 1:3605emit_int8((unsigned char)0x90);3606break;3607default:3608assert(i == 0, " ");3609}3610}36113612void Assembler::notl(Register dst) {3613int encode = prefix_and_encode(dst->encoding());3614emit_int16((unsigned char)0xF7, (0xD0 | encode));3615}36163617void Assembler::orw(Register dst, Register src) {3618(void)prefix_and_encode(dst->encoding(), src->encoding());3619emit_arith(0x0B, 0xC0, dst, src);3620}36213622void Assembler::orl(Address dst, int32_t imm32) {3623InstructionMark im(this);3624prefix(dst);3625emit_arith_operand(0x81, rcx, dst, imm32);3626}36273628void Assembler::orl(Register dst, int32_t imm32) {3629prefix(dst);3630emit_arith(0x81, 0xC8, dst, imm32);3631}36323633void Assembler::orl(Register dst, Address src) {3634InstructionMark im(this);3635prefix(src, dst);3636emit_int8(0x0B);3637emit_operand(dst, src);3638}36393640void Assembler::orl(Register dst, Register src) {3641(void) prefix_and_encode(dst->encoding(), src->encoding());3642emit_arith(0x0B, 0xC0, dst, src);3643}36443645void Assembler::orl(Address dst, Register src) {3646InstructionMark im(this);3647prefix(dst, src);3648emit_int8(0x09);3649emit_operand(src, dst);3650}36513652void Assembler::orb(Address dst, int imm8) {3653InstructionMark im(this);3654prefix(dst);3655emit_int8((unsigned char)0x80);3656emit_operand(rcx, dst, 1);3657emit_int8(imm8);3658}36593660void Assembler::orb(Address dst, Register src) {3661InstructionMark im(this);3662prefix(dst, src, true);3663emit_int8(0x08);3664emit_operand(src, dst);3665}36663667void Assembler::packsswb(XMMRegister dst, XMMRegister src) {3668NOT_LP64(assert(VM_Version::supports_sse2(), ""));3669InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3670int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3671emit_int16(0x63, (0xC0 | encode));3672}36733674void Assembler::vpacksswb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3675assert(UseAVX > 0, "some form of AVX must be enabled");3676InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3677int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3678emit_int16(0x63, (0xC0 | encode));3679}36803681void Assembler::packssdw(XMMRegister dst, XMMRegister src) {3682assert(VM_Version::supports_sse2(), "");3683InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3684int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3685emit_int16(0x6B, (0xC0 | encode));3686}36873688void Assembler::vpackssdw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3689assert(UseAVX > 0, "some form of AVX must be enabled");3690InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3691int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3692emit_int16(0x6B, (0xC0 | encode));3693}36943695void Assembler::packuswb(XMMRegister dst, Address src) {3696NOT_LP64(assert(VM_Version::supports_sse2(), ""));3697assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");3698InstructionMark im(this);3699InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3700attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);3701simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3702emit_int8(0x67);3703emit_operand(dst, src);3704}37053706void Assembler::packuswb(XMMRegister dst, XMMRegister src) {3707NOT_LP64(assert(VM_Version::supports_sse2(), ""));3708InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3709int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3710emit_int16(0x67, (0xC0 | encode));3711}37123713void Assembler::vpackuswb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3714assert(UseAVX > 0, "some form of AVX must be enabled");3715InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3716int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3717emit_int16(0x67, (0xC0 | encode));3718}37193720void Assembler::packusdw(XMMRegister dst, XMMRegister src) {3721assert(VM_Version::supports_sse4_1(), "");3722InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3723int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);3724emit_int16(0x2B, (0xC0 | encode));3725}37263727void Assembler::vpackusdw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3728assert(UseAVX > 0, "some form of AVX must be enabled");3729InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3730int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);3731emit_int16(0x2B, (0xC0 | encode));3732}37333734void Assembler::vpermq(XMMRegister dst, XMMRegister src, int imm8, int vector_len) {3735assert(VM_Version::supports_avx2(), "");3736assert(vector_len != AVX_128bit, "");3737// VEX.256.66.0F3A.W1 00 /r ib3738InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3739int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3740emit_int24(0x00, (0xC0 | encode), imm8);3741}37423743void Assembler::vpermq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3744assert(vector_len == AVX_256bit ? VM_Version::supports_avx512vl() :3745vector_len == AVX_512bit ? VM_Version::supports_evex() : false, "not supported");3746InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3747attributes.set_is_evex_instruction();3748int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);3749emit_int16(0x36, (0xC0 | encode));3750}37513752void Assembler::vpermb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3753assert(VM_Version::supports_avx512_vbmi(), "");3754InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3755attributes.set_is_evex_instruction();3756int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);3757emit_int16((unsigned char)0x8D, (0xC0 | encode));3758}37593760void Assembler::vpermw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3761assert(vector_len == AVX_128bit ? VM_Version::supports_avx512vlbw() :3762vector_len == AVX_256bit ? VM_Version::supports_avx512vlbw() :3763vector_len == AVX_512bit ? VM_Version::supports_avx512bw() : false, "not supported");3764InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3765attributes.set_is_evex_instruction();3766int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);3767emit_int16((unsigned char)0x8D, (0xC0 | encode));3768}37693770void Assembler::vpermd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3771assert(vector_len <= AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_evex(), "");3772// VEX.NDS.256.66.0F38.W0 36 /r3773InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3774int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);3775emit_int16(0x36, (0xC0 | encode));3776}37773778void Assembler::vpermd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {3779assert(vector_len <= AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_evex(), "");3780// VEX.NDS.256.66.0F38.W0 36 /r3781InstructionMark im(this);3782InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3783vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);3784emit_int8(0x36);3785emit_operand(dst, src);3786}37873788void Assembler::vperm2i128(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8) {3789assert(VM_Version::supports_avx2(), "");3790InstructionAttr attributes(AVX_256bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3791int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3792emit_int24(0x46, (0xC0 | encode), imm8);3793}37943795void Assembler::vperm2f128(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8) {3796assert(VM_Version::supports_avx(), "");3797InstructionAttr attributes(AVX_256bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3798int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3799emit_int24(0x06, (0xC0 | encode), imm8);3800}38013802void Assembler::vpermilps(XMMRegister dst, XMMRegister src, int imm8, int vector_len) {3803assert(vector_len <= AVX_256bit ? VM_Version::supports_avx() : VM_Version::supports_evex(), "");3804InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3805int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3806emit_int24(0x04, (0xC0 | encode), imm8);3807}38083809void Assembler::vpermilpd(XMMRegister dst, XMMRegister src, int imm8, int vector_len) {3810assert(vector_len <= AVX_256bit ? VM_Version::supports_avx() : VM_Version::supports_evex(), "");3811InstructionAttr attributes(vector_len, /* rex_w */ VM_Version::supports_evex(),/* legacy_mode */ false,/* no_mask_reg */ true, /* uses_vl */ false);3812attributes.set_rex_vex_w_reverted();3813int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3814emit_int24(0x05, (0xC0 | encode), imm8);3815}38163817void Assembler::vpermpd(XMMRegister dst, XMMRegister src, int imm8, int vector_len) {3818assert(vector_len <= AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_evex(), "");3819InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */false, /* no_mask_reg */ true, /* uses_vl */ false);3820int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3821emit_int24(0x01, (0xC0 | encode), imm8);3822}38233824void Assembler::evpermi2q(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3825assert(VM_Version::supports_evex(), "");3826InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3827attributes.set_is_evex_instruction();3828int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);3829emit_int16(0x76, (0xC0 | encode));3830}38313832void Assembler::pause() {3833emit_int16((unsigned char)0xF3, (unsigned char)0x90);3834}38353836void Assembler::ud2() {3837emit_int16(0x0F, 0x0B);3838}38393840void Assembler::pcmpestri(XMMRegister dst, Address src, int imm8) {3841assert(VM_Version::supports_sse4_2(), "");3842InstructionMark im(this);3843InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3844simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3845emit_int8(0x61);3846emit_operand(dst, src);3847emit_int8(imm8);3848}38493850void Assembler::pcmpestri(XMMRegister dst, XMMRegister src, int imm8) {3851assert(VM_Version::supports_sse4_2(), "");3852InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3853int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3854emit_int24(0x61, (0xC0 | encode), imm8);3855}38563857// In this context, the dst vector contains the components that are equal, non equal components are zeroed in dst3858void Assembler::pcmpeqb(XMMRegister dst, XMMRegister src) {3859assert(VM_Version::supports_sse2(), "");3860InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3861int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3862emit_int16(0x74, (0xC0 | encode));3863}38643865void Assembler::vpcmpCCbwd(XMMRegister dst, XMMRegister nds, XMMRegister src, int cond_encoding, int vector_len) {3866assert(vector_len == AVX_128bit ? VM_Version::supports_avx() : VM_Version::supports_avx2(), "");3867assert(vector_len <= AVX_256bit, "evex encoding is different - has k register as dest");3868InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3869int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3870emit_int16(cond_encoding, (0xC0 | encode));3871}38723873// In this context, the dst vector contains the components that are equal, non equal components are zeroed in dst3874void Assembler::vpcmpeqb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3875assert(vector_len == AVX_128bit ? VM_Version::supports_avx() : VM_Version::supports_avx2(), "");3876assert(vector_len <= AVX_256bit, "evex encoding is different - has k register as dest");3877InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3878int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3879emit_int16(0x74, (0xC0 | encode));3880}38813882// In this context, kdst is written the mask used to process the equal components3883void Assembler::evpcmpeqb(KRegister kdst, XMMRegister nds, XMMRegister src, int vector_len) {3884assert(VM_Version::supports_avx512bw(), "");3885InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3886attributes.set_is_evex_instruction();3887int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3888emit_int16(0x74, (0xC0 | encode));3889}38903891void Assembler::evpcmpgtb(KRegister kdst, XMMRegister nds, Address src, int vector_len) {3892assert(VM_Version::supports_avx512vlbw(), "");3893InstructionMark im(this);3894InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3895attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);3896attributes.set_is_evex_instruction();3897int dst_enc = kdst->encoding();3898vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3899emit_int8(0x64);3900emit_operand(as_Register(dst_enc), src);3901}39023903void Assembler::evpcmpgtb(KRegister kdst, KRegister mask, XMMRegister nds, Address src, int vector_len) {3904assert(VM_Version::supports_avx512vlbw(), "");3905InstructionMark im(this);3906InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);3907attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);3908attributes.reset_is_clear_context();3909attributes.set_embedded_opmask_register_specifier(mask);3910attributes.set_is_evex_instruction();3911int dst_enc = kdst->encoding();3912vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3913emit_int8(0x64);3914emit_operand(as_Register(dst_enc), src);3915}39163917void Assembler::evpcmpuw(KRegister kdst, XMMRegister nds, XMMRegister src, ComparisonPredicate vcc, int vector_len) {3918assert(VM_Version::supports_avx512vlbw(), "");3919InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3920attributes.set_is_evex_instruction();3921int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3922emit_int24(0x3E, (0xC0 | encode), vcc);3923}39243925void Assembler::evpcmpuw(KRegister kdst, XMMRegister nds, Address src, ComparisonPredicate vcc, int vector_len) {3926assert(VM_Version::supports_avx512vlbw(), "");3927InstructionMark im(this);3928InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3929attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);3930attributes.set_is_evex_instruction();3931int dst_enc = kdst->encoding();3932vex_prefix(src, nds->encoding(), kdst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3933emit_int8(0x3E);3934emit_operand(as_Register(dst_enc), src);3935emit_int8(vcc);3936}39373938void Assembler::evpcmpeqb(KRegister kdst, XMMRegister nds, Address src, int vector_len) {3939assert(VM_Version::supports_avx512bw(), "");3940InstructionMark im(this);3941InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3942attributes.set_is_evex_instruction();3943attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);3944int dst_enc = kdst->encoding();3945vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3946emit_int8(0x74);3947emit_operand(as_Register(dst_enc), src);3948}39493950void Assembler::evpcmpeqb(KRegister kdst, KRegister mask, XMMRegister nds, Address src, int vector_len) {3951assert(VM_Version::supports_avx512vlbw(), "");3952InstructionMark im(this);3953InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);3954attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);3955attributes.reset_is_clear_context();3956attributes.set_embedded_opmask_register_specifier(mask);3957attributes.set_is_evex_instruction();3958vex_prefix(src, nds->encoding(), kdst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3959emit_int8(0x74);3960emit_operand(as_Register(kdst->encoding()), src);3961}39623963// In this context, the dst vector contains the components that are equal, non equal components are zeroed in dst3964void Assembler::pcmpeqw(XMMRegister dst, XMMRegister src) {3965assert(VM_Version::supports_sse2(), "");3966InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3967int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3968emit_int16(0x75, (0xC0 | encode));3969}39703971// In this context, the dst vector contains the components that are equal, non equal components are zeroed in dst3972void Assembler::vpcmpeqw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3973assert(vector_len == AVX_128bit ? VM_Version::supports_avx() : VM_Version::supports_avx2(), "");3974assert(vector_len <= AVX_256bit, "evex encoding is different - has k register as dest");3975InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3976int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3977emit_int16(0x75, (0xC0 | encode));3978}39793980// In this context, kdst is written the mask used to process the equal components3981void Assembler::evpcmpeqw(KRegister kdst, XMMRegister nds, XMMRegister src, int vector_len) {3982assert(VM_Version::supports_avx512bw(), "");3983InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3984attributes.set_is_evex_instruction();3985int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3986emit_int16(0x75, (0xC0 | encode));3987}39883989void Assembler::evpcmpeqw(KRegister kdst, XMMRegister nds, Address src, int vector_len) {3990assert(VM_Version::supports_avx512bw(), "");3991InstructionMark im(this);3992InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3993attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);3994attributes.set_is_evex_instruction();3995int dst_enc = kdst->encoding();3996vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3997emit_int8(0x75);3998emit_operand(as_Register(dst_enc), src);3999}40004001// In this context, the dst vector contains the components that are equal, non equal components are zeroed in dst4002void Assembler::pcmpeqd(XMMRegister dst, XMMRegister src) {4003assert(VM_Version::supports_sse2(), "");4004InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4005int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4006emit_int16(0x76, (0xC0 | encode));4007}40084009// In this context, the dst vector contains the components that are equal, non equal components are zeroed in dst4010void Assembler::vpcmpeqd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {4011assert(vector_len == AVX_128bit ? VM_Version::supports_avx() : VM_Version::supports_avx2(), "");4012assert(vector_len <= AVX_256bit, "evex encoding is different - has k register as dest");4013InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4014int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4015emit_int16(0x76, (0xC0 | encode));4016}40174018// In this context, kdst is written the mask used to process the equal components4019void Assembler::evpcmpeqd(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src, int vector_len) {4020assert(VM_Version::supports_evex(), "");4021InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);4022attributes.set_is_evex_instruction();4023attributes.reset_is_clear_context();4024attributes.set_embedded_opmask_register_specifier(mask);4025int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4026emit_int16(0x76, (0xC0 | encode));4027}40284029void Assembler::evpcmpeqd(KRegister kdst, KRegister mask, XMMRegister nds, Address src, int vector_len) {4030assert(VM_Version::supports_evex(), "");4031InstructionMark im(this);4032InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);4033attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);4034attributes.set_is_evex_instruction();4035attributes.reset_is_clear_context();4036attributes.set_embedded_opmask_register_specifier(mask);4037int dst_enc = kdst->encoding();4038vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4039emit_int8(0x76);4040emit_operand(as_Register(dst_enc), src);4041}40424043// In this context, the dst vector contains the components that are equal, non equal components are zeroed in dst4044void Assembler::pcmpeqq(XMMRegister dst, XMMRegister src) {4045assert(VM_Version::supports_sse4_1(), "");4046InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4047int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4048emit_int16(0x29, (0xC0 | encode));4049}40504051void Assembler::vpcmpCCq(XMMRegister dst, XMMRegister nds, XMMRegister src, int cond_encoding, int vector_len) {4052assert(VM_Version::supports_avx(), "");4053InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4054int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4055emit_int16(cond_encoding, (0xC0 | encode));4056}40574058// In this context, the dst vector contains the components that are equal, non equal components are zeroed in dst4059void Assembler::vpcmpeqq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {4060assert(VM_Version::supports_avx(), "");4061InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4062int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4063emit_int16(0x29, (0xC0 | encode));4064}40654066// In this context, kdst is written the mask used to process the equal components4067void Assembler::evpcmpeqq(KRegister kdst, XMMRegister nds, XMMRegister src, int vector_len) {4068assert(VM_Version::supports_evex(), "");4069InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4070attributes.reset_is_clear_context();4071attributes.set_is_evex_instruction();4072int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4073emit_int16(0x29, (0xC0 | encode));4074}40754076// In this context, kdst is written the mask used to process the equal components4077void Assembler::evpcmpeqq(KRegister kdst, XMMRegister nds, Address src, int vector_len) {4078assert(VM_Version::supports_evex(), "");4079InstructionMark im(this);4080InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4081attributes.reset_is_clear_context();4082attributes.set_is_evex_instruction();4083attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);4084int dst_enc = kdst->encoding();4085vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4086emit_int8(0x29);4087emit_operand(as_Register(dst_enc), src);4088}40894090void Assembler::evpmovd2m(KRegister kdst, XMMRegister src, int vector_len) {4091assert(UseAVX > 2 && VM_Version::supports_avx512dq(), "");4092assert(vector_len == AVX_512bit || VM_Version::supports_avx512vl(), "");4093InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4094attributes.set_is_evex_instruction();4095int encode = vex_prefix_and_encode(kdst->encoding(), 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);4096emit_int16(0x39, (0xC0 | encode));4097}40984099void Assembler::evpmovq2m(KRegister kdst, XMMRegister src, int vector_len) {4100assert(UseAVX > 2 && VM_Version::supports_avx512dq(), "");4101assert(vector_len == AVX_512bit || VM_Version::supports_avx512vl(), "");4102InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4103attributes.set_is_evex_instruction();4104int encode = vex_prefix_and_encode(kdst->encoding(), 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);4105emit_int16(0x39, (0xC0 | encode));4106}41074108void Assembler::pcmpgtq(XMMRegister dst, XMMRegister src) {4109assert(VM_Version::supports_sse4_1(), "");4110InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4111int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4112emit_int16(0x37, (0xC0 | encode));4113}41144115void Assembler::pmovmskb(Register dst, XMMRegister src) {4116assert(VM_Version::supports_sse2(), "");4117InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4118int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4119emit_int16((unsigned char)0xD7, (0xC0 | encode));4120}41214122void Assembler::vpmovmskb(Register dst, XMMRegister src, int vec_enc) {4123assert((VM_Version::supports_avx() && vec_enc == AVX_128bit) ||4124(VM_Version::supports_avx2() && vec_enc == AVX_256bit), "");4125InstructionAttr attributes(vec_enc, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4126int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4127emit_int16((unsigned char)0xD7, (0xC0 | encode));4128}41294130void Assembler::pextrd(Register dst, XMMRegister src, int imm8) {4131assert(VM_Version::supports_sse4_1(), "");4132InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);4133int encode = simd_prefix_and_encode(src, xnoreg, as_XMMRegister(dst->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4134emit_int24(0x16, (0xC0 | encode), imm8);4135}41364137void Assembler::pextrd(Address dst, XMMRegister src, int imm8) {4138assert(VM_Version::supports_sse4_1(), "");4139InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);4140attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);4141simd_prefix(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4142emit_int8(0x16);4143emit_operand(src, dst);4144emit_int8(imm8);4145}41464147void Assembler::pextrq(Register dst, XMMRegister src, int imm8) {4148assert(VM_Version::supports_sse4_1(), "");4149InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);4150int encode = simd_prefix_and_encode(src, xnoreg, as_XMMRegister(dst->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4151emit_int24(0x16, (0xC0 | encode), imm8);4152}41534154void Assembler::pextrq(Address dst, XMMRegister src, int imm8) {4155assert(VM_Version::supports_sse4_1(), "");4156InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);4157attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);4158simd_prefix(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4159emit_int8(0x16);4160emit_operand(src, dst);4161emit_int8(imm8);4162}41634164void Assembler::pextrw(Register dst, XMMRegister src, int imm8) {4165assert(VM_Version::supports_sse2(), "");4166InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4167int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4168emit_int24((unsigned char)0xC5, (0xC0 | encode), imm8);4169}41704171void Assembler::pextrw(Address dst, XMMRegister src, int imm8) {4172assert(VM_Version::supports_sse4_1(), "");4173InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4174attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_16bit);4175simd_prefix(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4176emit_int8(0x15);4177emit_operand(src, dst);4178emit_int8(imm8);4179}41804181void Assembler::pextrb(Register dst, XMMRegister src, int imm8) {4182assert(VM_Version::supports_sse4_1(), "");4183InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4184int encode = simd_prefix_and_encode(src, xnoreg, as_XMMRegister(dst->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4185emit_int24(0x14, (0xC0 | encode), imm8);4186}41874188void Assembler::pextrb(Address dst, XMMRegister src, int imm8) {4189assert(VM_Version::supports_sse4_1(), "");4190InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4191attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_8bit);4192simd_prefix(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4193emit_int8(0x14);4194emit_operand(src, dst);4195emit_int8(imm8);4196}41974198void Assembler::pinsrd(XMMRegister dst, Register src, int imm8) {4199assert(VM_Version::supports_sse4_1(), "");4200InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);4201int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4202emit_int24(0x22, (0xC0 | encode), imm8);4203}42044205void Assembler::pinsrd(XMMRegister dst, Address src, int imm8) {4206assert(VM_Version::supports_sse4_1(), "");4207InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);4208attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);4209simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4210emit_int8(0x22);4211emit_operand(dst,src);4212emit_int8(imm8);4213}42144215void Assembler::vpinsrd(XMMRegister dst, XMMRegister nds, Register src, int imm8) {4216assert(VM_Version::supports_avx(), "");4217InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);4218int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4219emit_int24(0x22, (0xC0 | encode), imm8);4220}42214222void Assembler::pinsrq(XMMRegister dst, Register src, int imm8) {4223assert(VM_Version::supports_sse4_1(), "");4224InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);4225int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4226emit_int24(0x22, (0xC0 | encode), imm8);4227}42284229void Assembler::pinsrq(XMMRegister dst, Address src, int imm8) {4230assert(VM_Version::supports_sse4_1(), "");4231InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);4232attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);4233simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4234emit_int8(0x22);4235emit_operand(dst, src);4236emit_int8(imm8);4237}42384239void Assembler::vpinsrq(XMMRegister dst, XMMRegister nds, Register src, int imm8) {4240assert(VM_Version::supports_avx(), "");4241InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);4242int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4243emit_int24(0x22, (0xC0 | encode), imm8);4244}42454246void Assembler::pinsrw(XMMRegister dst, Register src, int imm8) {4247assert(VM_Version::supports_sse2(), "");4248InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4249int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4250emit_int24((unsigned char)0xC4, (0xC0 | encode), imm8);4251}42524253void Assembler::pinsrw(XMMRegister dst, Address src, int imm8) {4254assert(VM_Version::supports_sse2(), "");4255InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4256attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_16bit);4257simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4258emit_int8((unsigned char)0xC4);4259emit_operand(dst, src);4260emit_int8(imm8);4261}42624263void Assembler::vpinsrw(XMMRegister dst, XMMRegister nds, Register src, int imm8) {4264assert(VM_Version::supports_avx(), "");4265InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4266int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4267emit_int24((unsigned char)0xC4, (0xC0 | encode), imm8);4268}42694270void Assembler::pinsrb(XMMRegister dst, Address src, int imm8) {4271assert(VM_Version::supports_sse4_1(), "");4272InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4273attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_8bit);4274simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4275emit_int8(0x20);4276emit_operand(dst, src);4277emit_int8(imm8);4278}42794280void Assembler::pinsrb(XMMRegister dst, Register src, int imm8) {4281assert(VM_Version::supports_sse4_1(), "");4282InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4283int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4284emit_int24(0x20, (0xC0 | encode), imm8);4285}42864287void Assembler::vpinsrb(XMMRegister dst, XMMRegister nds, Register src, int imm8) {4288assert(VM_Version::supports_avx(), "");4289InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4290int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4291emit_int24(0x20, (0xC0 | encode), imm8);4292}42934294void Assembler::insertps(XMMRegister dst, XMMRegister src, int imm8) {4295assert(VM_Version::supports_sse4_1(), "");4296InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);4297int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4298emit_int24(0x21, (0xC0 | encode), imm8);4299}43004301void Assembler::vinsertps(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8) {4302assert(VM_Version::supports_avx(), "");4303InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);4304int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4305emit_int24(0x21, (0xC0 | encode), imm8);4306}43074308void Assembler::pmovzxbw(XMMRegister dst, Address src) {4309assert(VM_Version::supports_sse4_1(), "");4310InstructionMark im(this);4311InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4312attributes.set_address_attributes(/* tuple_type */ EVEX_HVM, /* input_size_in_bits */ EVEX_NObit);4313simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4314emit_int8(0x30);4315emit_operand(dst, src);4316}43174318void Assembler::pmovzxbw(XMMRegister dst, XMMRegister src) {4319assert(VM_Version::supports_sse4_1(), "");4320InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4321int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4322emit_int16(0x30, (0xC0 | encode));4323}43244325void Assembler::pmovsxbw(XMMRegister dst, XMMRegister src) {4326assert(VM_Version::supports_sse4_1(), "");4327InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4328int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4329emit_int16(0x20, (0xC0 | encode));4330}43314332void Assembler::pmovzxdq(XMMRegister dst, XMMRegister src) {4333assert(VM_Version::supports_sse4_1(), "");4334InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4335int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4336emit_int16(0x35, (0xC0 | encode));4337}43384339void Assembler::pmovsxbd(XMMRegister dst, XMMRegister src) {4340assert(VM_Version::supports_sse4_1(), "");4341InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4342int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4343emit_int16(0x21, (0xC0 | encode));4344}43454346void Assembler::pmovzxbd(XMMRegister dst, XMMRegister src) {4347assert(VM_Version::supports_sse4_1(), "");4348InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4349int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4350emit_int16(0x31, (0xC0 | encode));4351}43524353void Assembler::pmovsxbq(XMMRegister dst, XMMRegister src) {4354assert(VM_Version::supports_sse4_1(), "");4355InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4356int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4357emit_int16(0x22, (0xC0 | encode));4358}43594360void Assembler::pmovsxwd(XMMRegister dst, XMMRegister src) {4361assert(VM_Version::supports_sse4_1(), "");4362InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4363int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4364emit_int16(0x23, (0xC0 | encode));4365}43664367void Assembler::vpmovzxbw(XMMRegister dst, Address src, int vector_len) {4368assert(VM_Version::supports_avx(), "");4369InstructionMark im(this);4370assert(dst != xnoreg, "sanity");4371InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4372attributes.set_address_attributes(/* tuple_type */ EVEX_HVM, /* input_size_in_bits */ EVEX_NObit);4373vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4374emit_int8(0x30);4375emit_operand(dst, src);4376}43774378void Assembler::vpmovzxbw(XMMRegister dst, XMMRegister src, int vector_len) {4379assert(vector_len == AVX_128bit? VM_Version::supports_avx() :4380vector_len == AVX_256bit? VM_Version::supports_avx2() :4381vector_len == AVX_512bit? VM_Version::supports_avx512bw() : 0, "");4382InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4383int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4384emit_int16(0x30, (unsigned char) (0xC0 | encode));4385}43864387void Assembler::vpmovsxbw(XMMRegister dst, XMMRegister src, int vector_len) {4388assert(vector_len == AVX_128bit? VM_Version::supports_avx() :4389vector_len == AVX_256bit? VM_Version::supports_avx2() :4390vector_len == AVX_512bit? VM_Version::supports_avx512bw() : 0, "");4391InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4392int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4393emit_int16(0x20, (0xC0 | encode));4394}43954396void Assembler::evpmovzxbw(XMMRegister dst, KRegister mask, Address src, int vector_len) {4397assert(VM_Version::supports_avx512vlbw(), "");4398assert(dst != xnoreg, "sanity");4399InstructionMark im(this);4400InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);4401attributes.set_address_attributes(/* tuple_type */ EVEX_HVM, /* input_size_in_bits */ EVEX_NObit);4402attributes.set_embedded_opmask_register_specifier(mask);4403attributes.set_is_evex_instruction();4404vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4405emit_int8(0x30);4406emit_operand(dst, src);4407}44084409void Assembler::evpandd(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len) {4410assert(VM_Version::supports_evex(), "");4411// Encoding: EVEX.NDS.XXX.66.0F.W0 DB /r4412InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);4413attributes.set_is_evex_instruction();4414attributes.set_embedded_opmask_register_specifier(mask);4415if (merge) {4416attributes.reset_is_clear_context();4417}4418int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4419emit_int16((unsigned char)0xDB, (0xC0 | encode));4420}44214422void Assembler::vpmovzxdq(XMMRegister dst, XMMRegister src, int vector_len) {4423assert(vector_len > AVX_128bit ? VM_Version::supports_avx2() : VM_Version::supports_avx(), "");4424InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4425int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4426emit_int16(0x35, (0xC0 | encode));4427}44284429void Assembler::vpmovzxbd(XMMRegister dst, XMMRegister src, int vector_len) {4430assert(vector_len > AVX_128bit ? VM_Version::supports_avx2() : VM_Version::supports_avx(), "");4431InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4432int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4433emit_int16(0x31, (0xC0 | encode));4434}44354436void Assembler::vpmovzxbq(XMMRegister dst, XMMRegister src, int vector_len) {4437assert(vector_len > AVX_128bit ? VM_Version::supports_avx2() : VM_Version::supports_avx(), "");4438InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4439int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4440emit_int16(0x32, (0xC0 | encode));4441}44424443void Assembler::vpmovsxbd(XMMRegister dst, XMMRegister src, int vector_len) {4444assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :4445vector_len == AVX_256bit ? VM_Version::supports_avx2() :4446VM_Version::supports_evex(), "");4447InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4448int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4449emit_int16(0x21, (0xC0 | encode));4450}44514452void Assembler::vpmovsxbq(XMMRegister dst, XMMRegister src, int vector_len) {4453assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :4454vector_len == AVX_256bit ? VM_Version::supports_avx2() :4455VM_Version::supports_evex(), "");4456InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4457int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4458emit_int16(0x22, (0xC0 | encode));4459}44604461void Assembler::vpmovsxwd(XMMRegister dst, XMMRegister src, int vector_len) {4462assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :4463vector_len == AVX_256bit ? VM_Version::supports_avx2() :4464VM_Version::supports_evex(), "");4465InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4466int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4467emit_int16(0x23, (0xC0 | encode));4468}44694470void Assembler::vpmovsxwq(XMMRegister dst, XMMRegister src, int vector_len) {4471assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :4472vector_len == AVX_256bit ? VM_Version::supports_avx2() :4473VM_Version::supports_evex(), "");4474InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4475int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4476emit_int16(0x24, (0xC0 | encode));4477}44784479void Assembler::vpmovsxdq(XMMRegister dst, XMMRegister src, int vector_len) {4480assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :4481vector_len == AVX_256bit ? VM_Version::supports_avx2() :4482VM_Version::supports_evex(), "");4483InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4484int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4485emit_int16(0x25, (0xC0 | encode));4486}44874488void Assembler::evpmovwb(Address dst, XMMRegister src, int vector_len) {4489assert(VM_Version::supports_avx512vlbw(), "");4490assert(src != xnoreg, "sanity");4491InstructionMark im(this);4492InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4493attributes.set_address_attributes(/* tuple_type */ EVEX_HVM, /* input_size_in_bits */ EVEX_NObit);4494attributes.set_is_evex_instruction();4495vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);4496emit_int8(0x30);4497emit_operand(src, dst);4498}44994500void Assembler::evpmovwb(Address dst, KRegister mask, XMMRegister src, int vector_len) {4501assert(VM_Version::supports_avx512vlbw(), "");4502assert(src != xnoreg, "sanity");4503InstructionMark im(this);4504InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);4505attributes.set_address_attributes(/* tuple_type */ EVEX_HVM, /* input_size_in_bits */ EVEX_NObit);4506attributes.reset_is_clear_context();4507attributes.set_embedded_opmask_register_specifier(mask);4508attributes.set_is_evex_instruction();4509vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);4510emit_int8(0x30);4511emit_operand(src, dst);4512}45134514void Assembler::evpmovdb(Address dst, XMMRegister src, int vector_len) {4515assert(VM_Version::supports_evex(), "");4516assert(src != xnoreg, "sanity");4517InstructionMark im(this);4518InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4519attributes.set_address_attributes(/* tuple_type */ EVEX_QVM, /* input_size_in_bits */ EVEX_NObit);4520attributes.set_is_evex_instruction();4521vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);4522emit_int8(0x31);4523emit_operand(src, dst);4524}45254526void Assembler::vpmovzxwd(XMMRegister dst, XMMRegister src, int vector_len) {4527assert(vector_len == AVX_128bit? VM_Version::supports_avx() :4528vector_len == AVX_256bit? VM_Version::supports_avx2() :4529vector_len == AVX_512bit? VM_Version::supports_evex() : 0, " ");4530InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4531int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4532emit_int16(0x33, (0xC0 | encode));4533}45344535void Assembler::pmaddwd(XMMRegister dst, XMMRegister src) {4536NOT_LP64(assert(VM_Version::supports_sse2(), ""));4537InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4538int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4539emit_int16((unsigned char)0xF5, (0xC0 | encode));4540}45414542void Assembler::vpmaddwd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {4543assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :4544(vector_len == AVX_256bit ? VM_Version::supports_avx2() :4545(vector_len == AVX_512bit ? VM_Version::supports_evex() : 0)), "");4546InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4547int encode = simd_prefix_and_encode(dst, nds, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4548emit_int16((unsigned char)0xF5, (0xC0 | encode));4549}45504551void Assembler::evpdpwssd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {4552assert(VM_Version::supports_evex(), "");4553assert(VM_Version::supports_avx512_vnni(), "must support vnni");4554InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4555attributes.set_is_evex_instruction();4556int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4557emit_int16(0x52, (0xC0 | encode));4558}45594560// generic4561void Assembler::pop(Register dst) {4562int encode = prefix_and_encode(dst->encoding());4563emit_int8(0x58 | encode);4564}45654566void Assembler::popcntl(Register dst, Address src) {4567assert(VM_Version::supports_popcnt(), "must support");4568InstructionMark im(this);4569emit_int8((unsigned char)0xF3);4570prefix(src, dst);4571emit_int16(0x0F, (unsigned char)0xB8);4572emit_operand(dst, src);4573}45744575void Assembler::popcntl(Register dst, Register src) {4576assert(VM_Version::supports_popcnt(), "must support");4577emit_int8((unsigned char)0xF3);4578int encode = prefix_and_encode(dst->encoding(), src->encoding());4579emit_int24(0x0F, (unsigned char)0xB8, (0xC0 | encode));4580}45814582void Assembler::vpopcntd(XMMRegister dst, XMMRegister src, int vector_len) {4583assert(VM_Version::supports_avx512_vpopcntdq(), "must support vpopcntdq feature");4584InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4585attributes.set_is_evex_instruction();4586int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4587emit_int16(0x55, (0xC0 | encode));4588}45894590void Assembler::popf() {4591emit_int8((unsigned char)0x9D);4592}45934594#ifndef _LP64 // no 32bit push/pop on amd644595void Assembler::popl(Address dst) {4596// NOTE: this will adjust stack by 8byte on 64bits4597InstructionMark im(this);4598prefix(dst);4599emit_int8((unsigned char)0x8F);4600emit_operand(rax, dst);4601}4602#endif46034604void Assembler::prefetchnta(Address src) {4605NOT_LP64(assert(VM_Version::supports_sse(), "must support"));4606InstructionMark im(this);4607prefix(src);4608emit_int16(0x0F, 0x18);4609emit_operand(rax, src); // 0, src4610}46114612void Assembler::prefetchr(Address src) {4613assert(VM_Version::supports_3dnow_prefetch(), "must support");4614InstructionMark im(this);4615prefix(src);4616emit_int16(0x0F, 0x0D);4617emit_operand(rax, src); // 0, src4618}46194620void Assembler::prefetcht0(Address src) {4621NOT_LP64(assert(VM_Version::supports_sse(), "must support"));4622InstructionMark im(this);4623prefix(src);4624emit_int16(0x0F, 0x18);4625emit_operand(rcx, src); // 1, src4626}46274628void Assembler::prefetcht1(Address src) {4629NOT_LP64(assert(VM_Version::supports_sse(), "must support"));4630InstructionMark im(this);4631prefix(src);4632emit_int16(0x0F, 0x18);4633emit_operand(rdx, src); // 2, src4634}46354636void Assembler::prefetcht2(Address src) {4637NOT_LP64(assert(VM_Version::supports_sse(), "must support"));4638InstructionMark im(this);4639prefix(src);4640emit_int16(0x0F, 0x18);4641emit_operand(rbx, src); // 3, src4642}46434644void Assembler::prefetchw(Address src) {4645assert(VM_Version::supports_3dnow_prefetch(), "must support");4646InstructionMark im(this);4647prefix(src);4648emit_int16(0x0F, 0x0D);4649emit_operand(rcx, src); // 1, src4650}46514652void Assembler::prefix(Prefix p) {4653emit_int8(p);4654}46554656void Assembler::pshufb(XMMRegister dst, XMMRegister src) {4657assert(VM_Version::supports_ssse3(), "");4658InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4659int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4660emit_int16(0x00, (0xC0 | encode));4661}46624663void Assembler::vpshufb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {4664assert(vector_len == AVX_128bit? VM_Version::supports_avx() :4665vector_len == AVX_256bit? VM_Version::supports_avx2() :4666vector_len == AVX_512bit? VM_Version::supports_avx512bw() : 0, "");4667InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4668int encode = simd_prefix_and_encode(dst, nds, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4669emit_int16(0x00, (0xC0 | encode));4670}46714672void Assembler::pshufb(XMMRegister dst, Address src) {4673assert(VM_Version::supports_ssse3(), "");4674InstructionMark im(this);4675InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4676attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);4677simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4678emit_int8(0x00);4679emit_operand(dst, src);4680}46814682void Assembler::pshufd(XMMRegister dst, XMMRegister src, int mode) {4683assert(isByte(mode), "invalid value");4684NOT_LP64(assert(VM_Version::supports_sse2(), ""));4685int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_128bit;4686InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4687int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4688emit_int24(0x70, (0xC0 | encode), mode & 0xFF);4689}46904691void Assembler::vpshufd(XMMRegister dst, XMMRegister src, int mode, int vector_len) {4692assert(vector_len == AVX_128bit? VM_Version::supports_avx() :4693(vector_len == AVX_256bit? VM_Version::supports_avx2() :4694(vector_len == AVX_512bit? VM_Version::supports_evex() : 0)), "");4695NOT_LP64(assert(VM_Version::supports_sse2(), ""));4696InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4697int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4698emit_int24(0x70, (0xC0 | encode), mode & 0xFF);4699}47004701void Assembler::pshufd(XMMRegister dst, Address src, int mode) {4702assert(isByte(mode), "invalid value");4703NOT_LP64(assert(VM_Version::supports_sse2(), ""));4704assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");4705InstructionMark im(this);4706InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4707attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);4708simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4709emit_int8(0x70);4710emit_operand(dst, src);4711emit_int8(mode & 0xFF);4712}47134714void Assembler::pshufhw(XMMRegister dst, XMMRegister src, int mode) {4715assert(isByte(mode), "invalid value");4716NOT_LP64(assert(VM_Version::supports_sse2(), ""));4717InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4718int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);4719emit_int24(0x70, (0xC0 | encode), mode & 0xFF);4720}47214722void Assembler::pshuflw(XMMRegister dst, XMMRegister src, int mode) {4723assert(isByte(mode), "invalid value");4724NOT_LP64(assert(VM_Version::supports_sse2(), ""));4725InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4726int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);4727emit_int24(0x70, (0xC0 | encode), mode & 0xFF);4728}47294730void Assembler::pshuflw(XMMRegister dst, Address src, int mode) {4731assert(isByte(mode), "invalid value");4732NOT_LP64(assert(VM_Version::supports_sse2(), ""));4733assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");4734InstructionMark im(this);4735InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4736attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);4737simd_prefix(dst, xnoreg, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);4738emit_int8(0x70);4739emit_operand(dst, src);4740emit_int8(mode & 0xFF);4741}47424743void Assembler::evshufi64x2(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8, int vector_len) {4744assert(VM_Version::supports_evex(), "requires EVEX support");4745assert(vector_len == Assembler::AVX_256bit || vector_len == Assembler::AVX_512bit, "");4746InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4747attributes.set_is_evex_instruction();4748int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4749emit_int24(0x43, (0xC0 | encode), imm8 & 0xFF);4750}47514752void Assembler::pshufpd(XMMRegister dst, XMMRegister src, int imm8) {4753assert(isByte(imm8), "invalid value");4754NOT_LP64(assert(VM_Version::supports_sse2(), ""));4755InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4756int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4757emit_int24((unsigned char)0xC6, (0xC0 | encode), imm8 & 0xFF);4758}47594760void Assembler::vpshufpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8, int vector_len) {4761InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4762attributes.set_rex_vex_w_reverted();4763int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4764emit_int24((unsigned char)0xC6, (0xC0 | encode), imm8 & 0xFF);4765}47664767void Assembler::pshufps(XMMRegister dst, XMMRegister src, int imm8) {4768assert(isByte(imm8), "invalid value");4769NOT_LP64(assert(VM_Version::supports_sse2(), ""));4770InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4771int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);4772emit_int24((unsigned char)0xC6, (0xC0 | encode), imm8 & 0xFF);4773}47744775void Assembler::vpshufps(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8, int vector_len) {4776InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4777int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);4778emit_int24((unsigned char)0xC6, (0xC0 | encode), imm8 & 0xFF);4779}47804781void Assembler::psrldq(XMMRegister dst, int shift) {4782// Shift left 128 bit value in dst XMMRegister by shift number of bytes.4783NOT_LP64(assert(VM_Version::supports_sse2(), ""));4784InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4785int encode = simd_prefix_and_encode(xmm3, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4786emit_int24(0x73, (0xC0 | encode), shift);4787}47884789void Assembler::vpsrldq(XMMRegister dst, XMMRegister src, int shift, int vector_len) {4790assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :4791vector_len == AVX_256bit ? VM_Version::supports_avx2() :4792vector_len == AVX_512bit ? VM_Version::supports_avx512bw() : 0, "");4793InstructionAttr attributes(vector_len, /*vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4794int encode = vex_prefix_and_encode(xmm3->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4795emit_int24(0x73, (0xC0 | encode), shift & 0xFF);4796}47974798void Assembler::pslldq(XMMRegister dst, int shift) {4799// Shift left 128 bit value in dst XMMRegister by shift number of bytes.4800NOT_LP64(assert(VM_Version::supports_sse2(), ""));4801InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4802// XMM7 is for /7 encoding: 66 0F 73 /7 ib4803int encode = simd_prefix_and_encode(xmm7, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4804emit_int24(0x73, (0xC0 | encode), shift);4805}48064807void Assembler::vpslldq(XMMRegister dst, XMMRegister src, int shift, int vector_len) {4808assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :4809vector_len == AVX_256bit ? VM_Version::supports_avx2() :4810vector_len == AVX_512bit ? VM_Version::supports_avx512bw() : 0, "");4811InstructionAttr attributes(vector_len, /*vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4812int encode = vex_prefix_and_encode(xmm7->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4813emit_int24(0x73, (0xC0 | encode), shift & 0xFF);4814}48154816void Assembler::ptest(XMMRegister dst, Address src) {4817assert(VM_Version::supports_sse4_1(), "");4818assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");4819InstructionMark im(this);4820InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4821simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4822emit_int8(0x17);4823emit_operand(dst, src);4824}48254826void Assembler::ptest(XMMRegister dst, XMMRegister src) {4827assert(VM_Version::supports_sse4_1() || VM_Version::supports_avx(), "");4828InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4829int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4830emit_int8(0x17);4831emit_int8((0xC0 | encode));4832}48334834void Assembler::vptest(XMMRegister dst, Address src) {4835assert(VM_Version::supports_avx(), "");4836InstructionMark im(this);4837InstructionAttr attributes(AVX_256bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4838assert(dst != xnoreg, "sanity");4839// swap src<->dst for encoding4840vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4841emit_int8(0x17);4842emit_operand(dst, src);4843}48444845void Assembler::vptest(XMMRegister dst, XMMRegister src) {4846assert(VM_Version::supports_avx(), "");4847InstructionAttr attributes(AVX_256bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4848int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4849emit_int16(0x17, (0xC0 | encode));4850}48514852void Assembler::vptest(XMMRegister dst, XMMRegister src, int vector_len) {4853assert(VM_Version::supports_avx(), "");4854InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4855int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4856emit_int16(0x17, (0xC0 | encode));4857}48584859void Assembler::punpcklbw(XMMRegister dst, Address src) {4860NOT_LP64(assert(VM_Version::supports_sse2(), ""));4861assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");4862InstructionMark im(this);4863InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_vlbw, /* no_mask_reg */ true, /* uses_vl */ true);4864attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);4865simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4866emit_int8(0x60);4867emit_operand(dst, src);4868}48694870void Assembler::punpcklbw(XMMRegister dst, XMMRegister src) {4871NOT_LP64(assert(VM_Version::supports_sse2(), ""));4872InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_vlbw, /* no_mask_reg */ true, /* uses_vl */ true);4873int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4874emit_int16(0x60, (0xC0 | encode));4875}48764877void Assembler::punpckldq(XMMRegister dst, Address src) {4878NOT_LP64(assert(VM_Version::supports_sse2(), ""));4879assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");4880InstructionMark im(this);4881InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4882attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);4883simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4884emit_int8(0x62);4885emit_operand(dst, src);4886}48874888void Assembler::punpckldq(XMMRegister dst, XMMRegister src) {4889NOT_LP64(assert(VM_Version::supports_sse2(), ""));4890InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4891int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4892emit_int16(0x62, (0xC0 | encode));4893}48944895void Assembler::punpcklqdq(XMMRegister dst, XMMRegister src) {4896NOT_LP64(assert(VM_Version::supports_sse2(), ""));4897InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4898attributes.set_rex_vex_w_reverted();4899int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4900emit_int16(0x6C, (0xC0 | encode));4901}49024903void Assembler::push(int32_t imm32) {4904// in 64bits we push 64bits onto the stack but only4905// take a 32bit immediate4906emit_int8(0x68);4907emit_int32(imm32);4908}49094910void Assembler::push(Register src) {4911int encode = prefix_and_encode(src->encoding());4912emit_int8(0x50 | encode);4913}49144915void Assembler::pushf() {4916emit_int8((unsigned char)0x9C);4917}49184919#ifndef _LP64 // no 32bit push/pop on amd644920void Assembler::pushl(Address src) {4921// Note this will push 64bit on 64bit4922InstructionMark im(this);4923prefix(src);4924emit_int8((unsigned char)0xFF);4925emit_operand(rsi, src);4926}4927#endif49284929void Assembler::rcll(Register dst, int imm8) {4930assert(isShiftCount(imm8), "illegal shift count");4931int encode = prefix_and_encode(dst->encoding());4932if (imm8 == 1) {4933emit_int16((unsigned char)0xD1, (0xD0 | encode));4934} else {4935emit_int24((unsigned char)0xC1, (0xD0 | encode), imm8);4936}4937}49384939void Assembler::rcpps(XMMRegister dst, XMMRegister src) {4940NOT_LP64(assert(VM_Version::supports_sse(), ""));4941InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4942int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);4943emit_int16(0x53, (0xC0 | encode));4944}49454946void Assembler::rcpss(XMMRegister dst, XMMRegister src) {4947NOT_LP64(assert(VM_Version::supports_sse(), ""));4948InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4949int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);4950emit_int16(0x53, (0xC0 | encode));4951}49524953void Assembler::rdtsc() {4954emit_int16(0x0F, 0x31);4955}49564957// copies data from [esi] to [edi] using rcx pointer sized words4958// generic4959void Assembler::rep_mov() {4960// REP4961// MOVSQ4962LP64_ONLY(emit_int24((unsigned char)0xF3, REX_W, (unsigned char)0xA5);)4963NOT_LP64( emit_int16((unsigned char)0xF3, (unsigned char)0xA5);)4964}49654966// sets rcx bytes with rax, value at [edi]4967void Assembler::rep_stosb() {4968// REP4969// STOSB4970LP64_ONLY(emit_int24((unsigned char)0xF3, REX_W, (unsigned char)0xAA);)4971NOT_LP64( emit_int16((unsigned char)0xF3, (unsigned char)0xAA);)4972}49734974// sets rcx pointer sized words with rax, value at [edi]4975// generic4976void Assembler::rep_stos() {4977// REP4978// LP64:STOSQ, LP32:STOSD4979LP64_ONLY(emit_int24((unsigned char)0xF3, REX_W, (unsigned char)0xAB);)4980NOT_LP64( emit_int16((unsigned char)0xF3, (unsigned char)0xAB);)4981}49824983// scans rcx pointer sized words at [edi] for occurance of rax,4984// generic4985void Assembler::repne_scan() { // repne_scan4986// SCASQ4987LP64_ONLY(emit_int24((unsigned char)0xF2, REX_W, (unsigned char)0xAF);)4988NOT_LP64( emit_int16((unsigned char)0xF2, (unsigned char)0xAF);)4989}49904991#ifdef _LP644992// scans rcx 4 byte words at [edi] for occurance of rax,4993// generic4994void Assembler::repne_scanl() { // repne_scan4995// SCASL4996emit_int16((unsigned char)0xF2, (unsigned char)0xAF);4997}4998#endif49995000void Assembler::ret(int imm16) {5001if (imm16 == 0) {5002emit_int8((unsigned char)0xC3);5003} else {5004emit_int8((unsigned char)0xC2);5005emit_int16(imm16);5006}5007}50085009void Assembler::roll(Register dst, int imm8) {5010assert(isShiftCount(imm8), "illegal shift count");5011int encode = prefix_and_encode(dst->encoding());5012if (imm8 == 1) {5013emit_int16((unsigned char)0xD1, (0xC0 | encode));5014} else {5015emit_int24((unsigned char)0xC1, (0xc0 | encode), imm8);5016}5017}50185019void Assembler::roll(Register dst) {5020int encode = prefix_and_encode(dst->encoding());5021emit_int16((unsigned char)0xD3, (0xC0 | encode));5022}50235024void Assembler::rorl(Register dst, int imm8) {5025assert(isShiftCount(imm8), "illegal shift count");5026int encode = prefix_and_encode(dst->encoding());5027if (imm8 == 1) {5028emit_int16((unsigned char)0xD1, (0xC8 | encode));5029} else {5030emit_int24((unsigned char)0xC1, (0xc8 | encode), imm8);5031}5032}50335034void Assembler::rorl(Register dst) {5035int encode = prefix_and_encode(dst->encoding());5036emit_int16((unsigned char)0xD3, (0xC8 | encode));5037}50385039#ifdef _LP645040void Assembler::rorq(Register dst) {5041int encode = prefixq_and_encode(dst->encoding());5042emit_int16((unsigned char)0xD3, (0xC8 | encode));5043}50445045void Assembler::rorq(Register dst, int imm8) {5046assert(isShiftCount(imm8 >> 1), "illegal shift count");5047int encode = prefixq_and_encode(dst->encoding());5048if (imm8 == 1) {5049emit_int16((unsigned char)0xD1, (0xC8 | encode));5050} else {5051emit_int24((unsigned char)0xC1, (0xc8 | encode), imm8);5052}5053}50545055void Assembler::rolq(Register dst) {5056int encode = prefixq_and_encode(dst->encoding());5057emit_int16((unsigned char)0xD3, (0xC0 | encode));5058}50595060void Assembler::rolq(Register dst, int imm8) {5061assert(isShiftCount(imm8 >> 1), "illegal shift count");5062int encode = prefixq_and_encode(dst->encoding());5063if (imm8 == 1) {5064emit_int16((unsigned char)0xD1, (0xC0 | encode));5065} else {5066emit_int24((unsigned char)0xC1, (0xc0 | encode), imm8);5067}5068}5069#endif50705071void Assembler::sahf() {5072#ifdef _LP645073// Not supported in 64bit mode5074ShouldNotReachHere();5075#endif5076emit_int8((unsigned char)0x9E);5077}50785079void Assembler::sall(Address dst, int imm8) {5080InstructionMark im(this);5081assert(isShiftCount(imm8), "illegal shift count");5082prefix(dst);5083if (imm8 == 1) {5084emit_int8((unsigned char)0xD1);5085emit_operand(as_Register(4), dst);5086}5087else {5088emit_int8((unsigned char)0xC1);5089emit_operand(as_Register(4), dst);5090emit_int8(imm8);5091}5092}50935094void Assembler::sall(Address dst) {5095InstructionMark im(this);5096prefix(dst);5097emit_int8((unsigned char)0xD3);5098emit_operand(as_Register(4), dst);5099}51005101void Assembler::sall(Register dst, int imm8) {5102assert(isShiftCount(imm8), "illegal shift count");5103int encode = prefix_and_encode(dst->encoding());5104if (imm8 == 1) {5105emit_int16((unsigned char)0xD1, (0xE0 | encode));5106} else {5107emit_int24((unsigned char)0xC1, (0xE0 | encode), imm8);5108}5109}51105111void Assembler::sall(Register dst) {5112int encode = prefix_and_encode(dst->encoding());5113emit_int16((unsigned char)0xD3, (0xE0 | encode));5114}51155116void Assembler::sarl(Address dst, int imm8) {5117assert(isShiftCount(imm8), "illegal shift count");5118InstructionMark im(this);5119prefix(dst);5120if (imm8 == 1) {5121emit_int8((unsigned char)0xD1);5122emit_operand(as_Register(7), dst);5123}5124else {5125emit_int8((unsigned char)0xC1);5126emit_operand(as_Register(7), dst);5127emit_int8(imm8);5128}5129}51305131void Assembler::sarl(Address dst) {5132InstructionMark im(this);5133prefix(dst);5134emit_int8((unsigned char)0xD3);5135emit_operand(as_Register(7), dst);5136}51375138void Assembler::sarl(Register dst, int imm8) {5139int encode = prefix_and_encode(dst->encoding());5140assert(isShiftCount(imm8), "illegal shift count");5141if (imm8 == 1) {5142emit_int16((unsigned char)0xD1, (0xF8 | encode));5143} else {5144emit_int24((unsigned char)0xC1, (0xF8 | encode), imm8);5145}5146}51475148void Assembler::sarl(Register dst) {5149int encode = prefix_and_encode(dst->encoding());5150emit_int16((unsigned char)0xD3, (0xF8 | encode));5151}51525153void Assembler::sbbl(Address dst, int32_t imm32) {5154InstructionMark im(this);5155prefix(dst);5156emit_arith_operand(0x81, rbx, dst, imm32);5157}51585159void Assembler::sbbl(Register dst, int32_t imm32) {5160prefix(dst);5161emit_arith(0x81, 0xD8, dst, imm32);5162}516351645165void Assembler::sbbl(Register dst, Address src) {5166InstructionMark im(this);5167prefix(src, dst);5168emit_int8(0x1B);5169emit_operand(dst, src);5170}51715172void Assembler::sbbl(Register dst, Register src) {5173(void) prefix_and_encode(dst->encoding(), src->encoding());5174emit_arith(0x1B, 0xC0, dst, src);5175}51765177void Assembler::setb(Condition cc, Register dst) {5178assert(0 <= cc && cc < 16, "illegal cc");5179int encode = prefix_and_encode(dst->encoding(), true);5180emit_int24(0x0F, (unsigned char)0x90 | cc, (0xC0 | encode));5181}51825183void Assembler::sete(Register dst) {5184int encode = prefix_and_encode(dst->encoding(), true);5185emit_int24(0x0F, (unsigned char)0x94, (0xC0 | encode));5186}51875188void Assembler::setl(Register dst) {5189int encode = prefix_and_encode(dst->encoding(), true);5190emit_int24(0x0F, (unsigned char)0x9C, (0xC0 | encode));5191}51925193void Assembler::setne(Register dst) {5194int encode = prefix_and_encode(dst->encoding(), true);5195emit_int24(0x0F, (unsigned char)0x95, (0xC0 | encode));5196}51975198void Assembler::palignr(XMMRegister dst, XMMRegister src, int imm8) {5199assert(VM_Version::supports_ssse3(), "");5200InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);5201int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);5202emit_int24(0x0F, (0xC0 | encode), imm8);5203}52045205void Assembler::vpalignr(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8, int vector_len) {5206assert(vector_len == AVX_128bit? VM_Version::supports_avx() :5207vector_len == AVX_256bit? VM_Version::supports_avx2() :52080, "");5209InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);5210int encode = simd_prefix_and_encode(dst, nds, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);5211emit_int24(0x0F, (0xC0 | encode), imm8);5212}52135214void Assembler::evalignq(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {5215assert(VM_Version::supports_evex(), "");5216InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5217attributes.set_is_evex_instruction();5218int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);5219emit_int24(0x3, (0xC0 | encode), imm8);5220}52215222void Assembler::pblendw(XMMRegister dst, XMMRegister src, int imm8) {5223assert(VM_Version::supports_sse4_1(), "");5224InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);5225int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);5226emit_int24(0x0E, (0xC0 | encode), imm8);5227}52285229void Assembler::sha1rnds4(XMMRegister dst, XMMRegister src, int imm8) {5230assert(VM_Version::supports_sha(), "");5231int encode = rex_prefix_and_encode(dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_3A, /* rex_w */ false);5232emit_int24((unsigned char)0xCC, (0xC0 | encode), (unsigned char)imm8);5233}52345235void Assembler::sha1nexte(XMMRegister dst, XMMRegister src) {5236assert(VM_Version::supports_sha(), "");5237int encode = rex_prefix_and_encode(dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, /* rex_w */ false);5238emit_int16((unsigned char)0xC8, (0xC0 | encode));5239}52405241void Assembler::sha1msg1(XMMRegister dst, XMMRegister src) {5242assert(VM_Version::supports_sha(), "");5243int encode = rex_prefix_and_encode(dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, /* rex_w */ false);5244emit_int16((unsigned char)0xC9, (0xC0 | encode));5245}52465247void Assembler::sha1msg2(XMMRegister dst, XMMRegister src) {5248assert(VM_Version::supports_sha(), "");5249int encode = rex_prefix_and_encode(dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, /* rex_w */ false);5250emit_int16((unsigned char)0xCA, (0xC0 | encode));5251}52525253// xmm0 is implicit additional source to this instruction.5254void Assembler::sha256rnds2(XMMRegister dst, XMMRegister src) {5255assert(VM_Version::supports_sha(), "");5256int encode = rex_prefix_and_encode(dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, /* rex_w */ false);5257emit_int16((unsigned char)0xCB, (0xC0 | encode));5258}52595260void Assembler::sha256msg1(XMMRegister dst, XMMRegister src) {5261assert(VM_Version::supports_sha(), "");5262int encode = rex_prefix_and_encode(dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, /* rex_w */ false);5263emit_int16((unsigned char)0xCC, (0xC0 | encode));5264}52655266void Assembler::sha256msg2(XMMRegister dst, XMMRegister src) {5267assert(VM_Version::supports_sha(), "");5268int encode = rex_prefix_and_encode(dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, /* rex_w */ false);5269emit_int16((unsigned char)0xCD, (0xC0 | encode));5270}527152725273void Assembler::shll(Register dst, int imm8) {5274assert(isShiftCount(imm8), "illegal shift count");5275int encode = prefix_and_encode(dst->encoding());5276if (imm8 == 1 ) {5277emit_int16((unsigned char)0xD1, (0xE0 | encode));5278} else {5279emit_int24((unsigned char)0xC1, (0xE0 | encode), imm8);5280}5281}52825283void Assembler::shll(Register dst) {5284int encode = prefix_and_encode(dst->encoding());5285emit_int16((unsigned char)0xD3, (0xE0 | encode));5286}52875288void Assembler::shrl(Register dst, int imm8) {5289assert(isShiftCount(imm8), "illegal shift count");5290int encode = prefix_and_encode(dst->encoding());5291if (imm8 == 1) {5292emit_int16((unsigned char)0xD1, (0xE8 | encode));5293}5294else {5295emit_int24((unsigned char)0xC1, (0xE8 | encode), imm8);5296}5297}52985299void Assembler::shrl(Register dst) {5300int encode = prefix_and_encode(dst->encoding());5301emit_int16((unsigned char)0xD3, (0xE8 | encode));5302}53035304void Assembler::shrl(Address dst) {5305InstructionMark im(this);5306prefix(dst);5307emit_int8((unsigned char)0xD3);5308emit_operand(as_Register(5), dst);5309}53105311void Assembler::shrl(Address dst, int imm8) {5312InstructionMark im(this);5313assert(isShiftCount(imm8), "illegal shift count");5314prefix(dst);5315if (imm8 == 1) {5316emit_int8((unsigned char)0xD1);5317emit_operand(as_Register(5), dst);5318}5319else {5320emit_int8((unsigned char)0xC1);5321emit_operand(as_Register(5), dst);5322emit_int8(imm8);5323}5324}532553265327void Assembler::shldl(Register dst, Register src) {5328int encode = prefix_and_encode(src->encoding(), dst->encoding());5329emit_int24(0x0F, (unsigned char)0xA5, (0xC0 | encode));5330}53315332void Assembler::shldl(Register dst, Register src, int8_t imm8) {5333int encode = prefix_and_encode(src->encoding(), dst->encoding());5334emit_int32(0x0F, (unsigned char)0xA4, (0xC0 | encode), imm8);5335}53365337void Assembler::shrdl(Register dst, Register src) {5338int encode = prefix_and_encode(src->encoding(), dst->encoding());5339emit_int24(0x0F, (unsigned char)0xAD, (0xC0 | encode));5340}53415342void Assembler::shrdl(Register dst, Register src, int8_t imm8) {5343int encode = prefix_and_encode(src->encoding(), dst->encoding());5344emit_int32(0x0F, (unsigned char)0xAC, (0xC0 | encode), imm8);5345}53465347// copies a single word from [esi] to [edi]5348void Assembler::smovl() {5349emit_int8((unsigned char)0xA5);5350}53515352void Assembler::roundsd(XMMRegister dst, XMMRegister src, int32_t rmode) {5353assert(VM_Version::supports_sse4_1(), "");5354InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);5355int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);5356emit_int24(0x0B, (0xC0 | encode), (unsigned char)rmode);5357}53585359void Assembler::roundsd(XMMRegister dst, Address src, int32_t rmode) {5360assert(VM_Version::supports_sse4_1(), "");5361InstructionMark im(this);5362InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);5363simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);5364emit_int8(0x0B);5365emit_operand(dst, src);5366emit_int8((unsigned char)rmode);5367}53685369void Assembler::sqrtsd(XMMRegister dst, XMMRegister src) {5370NOT_LP64(assert(VM_Version::supports_sse2(), ""));5371InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5372attributes.set_rex_vex_w_reverted();5373int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5374emit_int16(0x51, (0xC0 | encode));5375}53765377void Assembler::sqrtsd(XMMRegister dst, Address src) {5378NOT_LP64(assert(VM_Version::supports_sse2(), ""));5379InstructionMark im(this);5380InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5381attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);5382attributes.set_rex_vex_w_reverted();5383simd_prefix(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5384emit_int8(0x51);5385emit_operand(dst, src);5386}53875388void Assembler::sqrtss(XMMRegister dst, XMMRegister src) {5389NOT_LP64(assert(VM_Version::supports_sse(), ""));5390InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5391int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5392emit_int16(0x51, (0xC0 | encode));5393}53945395void Assembler::std() {5396emit_int8((unsigned char)0xFD);5397}53985399void Assembler::sqrtss(XMMRegister dst, Address src) {5400NOT_LP64(assert(VM_Version::supports_sse(), ""));5401InstructionMark im(this);5402InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5403attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);5404simd_prefix(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5405emit_int8(0x51);5406emit_operand(dst, src);5407}54085409void Assembler::stmxcsr( Address dst) {5410if (UseAVX > 0 ) {5411assert(VM_Version::supports_avx(), "");5412InstructionMark im(this);5413InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);5414vex_prefix(dst, 0, 0, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5415emit_int8((unsigned char)0xAE);5416emit_operand(as_Register(3), dst);5417} else {5418NOT_LP64(assert(VM_Version::supports_sse(), ""));5419InstructionMark im(this);5420prefix(dst);5421emit_int16(0x0F, (unsigned char)0xAE);5422emit_operand(as_Register(3), dst);5423}5424}54255426void Assembler::subl(Address dst, int32_t imm32) {5427InstructionMark im(this);5428prefix(dst);5429emit_arith_operand(0x81, rbp, dst, imm32);5430}54315432void Assembler::subl(Address dst, Register src) {5433InstructionMark im(this);5434prefix(dst, src);5435emit_int8(0x29);5436emit_operand(src, dst);5437}54385439void Assembler::subl(Register dst, int32_t imm32) {5440prefix(dst);5441emit_arith(0x81, 0xE8, dst, imm32);5442}54435444// Force generation of a 4 byte immediate value even if it fits into 8bit5445void Assembler::subl_imm32(Register dst, int32_t imm32) {5446prefix(dst);5447emit_arith_imm32(0x81, 0xE8, dst, imm32);5448}54495450void Assembler::subl(Register dst, Address src) {5451InstructionMark im(this);5452prefix(src, dst);5453emit_int8(0x2B);5454emit_operand(dst, src);5455}54565457void Assembler::subl(Register dst, Register src) {5458(void) prefix_and_encode(dst->encoding(), src->encoding());5459emit_arith(0x2B, 0xC0, dst, src);5460}54615462void Assembler::subsd(XMMRegister dst, XMMRegister src) {5463NOT_LP64(assert(VM_Version::supports_sse2(), ""));5464InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5465attributes.set_rex_vex_w_reverted();5466int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5467emit_int16(0x5C, (0xC0 | encode));5468}54695470void Assembler::subsd(XMMRegister dst, Address src) {5471NOT_LP64(assert(VM_Version::supports_sse2(), ""));5472InstructionMark im(this);5473InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5474attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);5475attributes.set_rex_vex_w_reverted();5476simd_prefix(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5477emit_int8(0x5C);5478emit_operand(dst, src);5479}54805481void Assembler::subss(XMMRegister dst, XMMRegister src) {5482NOT_LP64(assert(VM_Version::supports_sse(), ""));5483InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true , /* uses_vl */ false);5484int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5485emit_int16(0x5C, (0xC0 | encode));5486}54875488void Assembler::subss(XMMRegister dst, Address src) {5489NOT_LP64(assert(VM_Version::supports_sse(), ""));5490InstructionMark im(this);5491InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5492attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);5493simd_prefix(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5494emit_int8(0x5C);5495emit_operand(dst, src);5496}54975498void Assembler::testb(Register dst, int imm8) {5499NOT_LP64(assert(dst->has_byte_register(), "must have byte register"));5500(void) prefix_and_encode(dst->encoding(), true);5501emit_arith_b(0xF6, 0xC0, dst, imm8);5502}55035504void Assembler::testb(Address dst, int imm8) {5505InstructionMark im(this);5506prefix(dst);5507emit_int8((unsigned char)0xF6);5508emit_operand(rax, dst, 1);5509emit_int8(imm8);5510}55115512void Assembler::testl(Register dst, int32_t imm32) {5513// not using emit_arith because test5514// doesn't support sign-extension of5515// 8bit operands5516int encode = dst->encoding();5517encode = prefix_and_encode(encode);5518emit_int16((unsigned char)0xF7, (0xC0 | encode));5519emit_int32(imm32);5520}55215522void Assembler::testl(Register dst, Register src) {5523(void) prefix_and_encode(dst->encoding(), src->encoding());5524emit_arith(0x85, 0xC0, dst, src);5525}55265527void Assembler::testl(Register dst, Address src) {5528InstructionMark im(this);5529prefix(src, dst);5530emit_int8((unsigned char)0x85);5531emit_operand(dst, src);5532}55335534void Assembler::tzcntl(Register dst, Register src) {5535assert(VM_Version::supports_bmi1(), "tzcnt instruction not supported");5536emit_int8((unsigned char)0xF3);5537int encode = prefix_and_encode(dst->encoding(), src->encoding());5538emit_int24(0x0F,5539(unsigned char)0xBC,55400xC0 | encode);5541}55425543void Assembler::tzcntq(Register dst, Register src) {5544assert(VM_Version::supports_bmi1(), "tzcnt instruction not supported");5545emit_int8((unsigned char)0xF3);5546int encode = prefixq_and_encode(dst->encoding(), src->encoding());5547emit_int24(0x0F, (unsigned char)0xBC, (0xC0 | encode));5548}55495550void Assembler::ucomisd(XMMRegister dst, Address src) {5551NOT_LP64(assert(VM_Version::supports_sse2(), ""));5552InstructionMark im(this);5553InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5554attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);5555attributes.set_rex_vex_w_reverted();5556simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5557emit_int8(0x2E);5558emit_operand(dst, src);5559}55605561void Assembler::ucomisd(XMMRegister dst, XMMRegister src) {5562NOT_LP64(assert(VM_Version::supports_sse2(), ""));5563InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5564attributes.set_rex_vex_w_reverted();5565int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5566emit_int16(0x2E, (0xC0 | encode));5567}55685569void Assembler::ucomiss(XMMRegister dst, Address src) {5570NOT_LP64(assert(VM_Version::supports_sse(), ""));5571InstructionMark im(this);5572InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5573attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);5574simd_prefix(dst, xnoreg, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5575emit_int8(0x2E);5576emit_operand(dst, src);5577}55785579void Assembler::ucomiss(XMMRegister dst, XMMRegister src) {5580NOT_LP64(assert(VM_Version::supports_sse(), ""));5581InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5582int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5583emit_int16(0x2E, (0xC0 | encode));5584}55855586void Assembler::xabort(int8_t imm8) {5587emit_int24((unsigned char)0xC6, (unsigned char)0xF8, (imm8 & 0xFF));5588}55895590void Assembler::xaddb(Address dst, Register src) {5591InstructionMark im(this);5592prefix(dst, src, true);5593emit_int16(0x0F, (unsigned char)0xC0);5594emit_operand(src, dst);5595}55965597void Assembler::xaddw(Address dst, Register src) {5598InstructionMark im(this);5599emit_int8(0x66);5600prefix(dst, src);5601emit_int16(0x0F, (unsigned char)0xC1);5602emit_operand(src, dst);5603}56045605void Assembler::xaddl(Address dst, Register src) {5606InstructionMark im(this);5607prefix(dst, src);5608emit_int16(0x0F, (unsigned char)0xC1);5609emit_operand(src, dst);5610}56115612void Assembler::xbegin(Label& abort, relocInfo::relocType rtype) {5613InstructionMark im(this);5614relocate(rtype);5615if (abort.is_bound()) {5616address entry = target(abort);5617assert(entry != NULL, "abort entry NULL");5618intptr_t offset = entry - pc();5619emit_int16((unsigned char)0xC7, (unsigned char)0xF8);5620emit_int32(offset - 6); // 2 opcode + 4 address5621} else {5622abort.add_patch_at(code(), locator());5623emit_int16((unsigned char)0xC7, (unsigned char)0xF8);5624emit_int32(0);5625}5626}56275628void Assembler::xchgb(Register dst, Address src) { // xchg5629InstructionMark im(this);5630prefix(src, dst, true);5631emit_int8((unsigned char)0x86);5632emit_operand(dst, src);5633}56345635void Assembler::xchgw(Register dst, Address src) { // xchg5636InstructionMark im(this);5637emit_int8(0x66);5638prefix(src, dst);5639emit_int8((unsigned char)0x87);5640emit_operand(dst, src);5641}56425643void Assembler::xchgl(Register dst, Address src) { // xchg5644InstructionMark im(this);5645prefix(src, dst);5646emit_int8((unsigned char)0x87);5647emit_operand(dst, src);5648}56495650void Assembler::xchgl(Register dst, Register src) {5651int encode = prefix_and_encode(dst->encoding(), src->encoding());5652emit_int16((unsigned char)0x87, (0xC0 | encode));5653}56545655void Assembler::xend() {5656emit_int24(0x0F, 0x01, (unsigned char)0xD5);5657}56585659void Assembler::xgetbv() {5660emit_int24(0x0F, 0x01, (unsigned char)0xD0);5661}56625663void Assembler::xorl(Address dst, int32_t imm32) {5664InstructionMark im(this);5665prefix(dst);5666emit_arith_operand(0x81, as_Register(6), dst, imm32);5667}56685669void Assembler::xorl(Register dst, int32_t imm32) {5670prefix(dst);5671emit_arith(0x81, 0xF0, dst, imm32);5672}56735674void Assembler::xorl(Register dst, Address src) {5675InstructionMark im(this);5676prefix(src, dst);5677emit_int8(0x33);5678emit_operand(dst, src);5679}56805681void Assembler::xorl(Register dst, Register src) {5682(void) prefix_and_encode(dst->encoding(), src->encoding());5683emit_arith(0x33, 0xC0, dst, src);5684}56855686void Assembler::xorl(Address dst, Register src) {5687InstructionMark im(this);5688prefix(dst, src);5689emit_int8(0x31);5690emit_operand(src, dst);5691}56925693void Assembler::xorb(Register dst, Address src) {5694InstructionMark im(this);5695prefix(src, dst);5696emit_int8(0x32);5697emit_operand(dst, src);5698}56995700void Assembler::xorb(Address dst, Register src) {5701InstructionMark im(this);5702prefix(dst, src, true);5703emit_int8(0x30);5704emit_operand(src, dst);5705}57065707void Assembler::xorw(Register dst, Register src) {5708(void)prefix_and_encode(dst->encoding(), src->encoding());5709emit_arith(0x33, 0xC0, dst, src);5710}57115712// AVX 3-operands scalar float-point arithmetic instructions57135714void Assembler::vaddsd(XMMRegister dst, XMMRegister nds, Address src) {5715assert(VM_Version::supports_avx(), "");5716InstructionMark im(this);5717InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5718attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);5719attributes.set_rex_vex_w_reverted();5720vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5721emit_int8(0x58);5722emit_operand(dst, src);5723}57245725void Assembler::vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {5726assert(VM_Version::supports_avx(), "");5727InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5728attributes.set_rex_vex_w_reverted();5729int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5730emit_int16(0x58, (0xC0 | encode));5731}57325733void Assembler::vaddss(XMMRegister dst, XMMRegister nds, Address src) {5734assert(VM_Version::supports_avx(), "");5735InstructionMark im(this);5736InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5737attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);5738vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5739emit_int8(0x58);5740emit_operand(dst, src);5741}57425743void Assembler::vaddss(XMMRegister dst, XMMRegister nds, XMMRegister src) {5744assert(VM_Version::supports_avx(), "");5745InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5746int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5747emit_int16(0x58, (0xC0 | encode));5748}57495750void Assembler::vdivsd(XMMRegister dst, XMMRegister nds, Address src) {5751assert(VM_Version::supports_avx(), "");5752InstructionMark im(this);5753InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5754attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);5755attributes.set_rex_vex_w_reverted();5756vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5757emit_int8(0x5E);5758emit_operand(dst, src);5759}57605761void Assembler::vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {5762assert(VM_Version::supports_avx(), "");5763InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5764attributes.set_rex_vex_w_reverted();5765int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5766emit_int16(0x5E, (0xC0 | encode));5767}57685769void Assembler::vdivss(XMMRegister dst, XMMRegister nds, Address src) {5770assert(VM_Version::supports_avx(), "");5771InstructionMark im(this);5772InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5773attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);5774vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5775emit_int8(0x5E);5776emit_operand(dst, src);5777}57785779void Assembler::vdivss(XMMRegister dst, XMMRegister nds, XMMRegister src) {5780assert(VM_Version::supports_avx(), "");5781InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5782int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5783emit_int16(0x5E, (0xC0 | encode));5784}57855786void Assembler::vfmadd231sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) {5787assert(VM_Version::supports_fma(), "");5788InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5789int encode = vex_prefix_and_encode(dst->encoding(), src1->encoding(), src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);5790emit_int16((unsigned char)0xB9, (0xC0 | encode));5791}57925793void Assembler::vfmadd231ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) {5794assert(VM_Version::supports_fma(), "");5795InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5796int encode = vex_prefix_and_encode(dst->encoding(), src1->encoding(), src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);5797emit_int16((unsigned char)0xB9, (0xC0 | encode));5798}57995800void Assembler::vmulsd(XMMRegister dst, XMMRegister nds, Address src) {5801assert(VM_Version::supports_avx(), "");5802InstructionMark im(this);5803InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5804attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);5805attributes.set_rex_vex_w_reverted();5806vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5807emit_int8(0x59);5808emit_operand(dst, src);5809}58105811void Assembler::vmulsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {5812assert(VM_Version::supports_avx(), "");5813InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5814attributes.set_rex_vex_w_reverted();5815int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5816emit_int16(0x59, (0xC0 | encode));5817}58185819void Assembler::vmulss(XMMRegister dst, XMMRegister nds, Address src) {5820assert(VM_Version::supports_avx(), "");5821InstructionMark im(this);5822InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5823attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);5824vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5825emit_int8(0x59);5826emit_operand(dst, src);5827}58285829void Assembler::vmulss(XMMRegister dst, XMMRegister nds, XMMRegister src) {5830assert(VM_Version::supports_avx(), "");5831InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5832int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5833emit_int16(0x59, (0xC0 | encode));5834}58355836void Assembler::vsubsd(XMMRegister dst, XMMRegister nds, Address src) {5837assert(VM_Version::supports_avx(), "");5838InstructionMark im(this);5839InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5840attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);5841attributes.set_rex_vex_w_reverted();5842vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5843emit_int8(0x5C);5844emit_operand(dst, src);5845}58465847void Assembler::vsubsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {5848assert(VM_Version::supports_avx(), "");5849InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5850attributes.set_rex_vex_w_reverted();5851int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5852emit_int16(0x5C, (0xC0 | encode));5853}58545855void Assembler::vsubss(XMMRegister dst, XMMRegister nds, Address src) {5856assert(VM_Version::supports_avx(), "");5857InstructionMark im(this);5858InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5859attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);5860vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5861emit_int8(0x5C);5862emit_operand(dst, src);5863}58645865void Assembler::vsubss(XMMRegister dst, XMMRegister nds, XMMRegister src) {5866assert(VM_Version::supports_avx(), "");5867InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5868int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5869emit_int16(0x5C, (0xC0 | encode));5870}58715872//====================VECTOR ARITHMETIC=====================================58735874// Float-point vector arithmetic58755876void Assembler::addpd(XMMRegister dst, XMMRegister src) {5877NOT_LP64(assert(VM_Version::supports_sse2(), ""));5878InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5879attributes.set_rex_vex_w_reverted();5880int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5881emit_int16(0x58, (0xC0 | encode));5882}58835884void Assembler::addpd(XMMRegister dst, Address src) {5885NOT_LP64(assert(VM_Version::supports_sse2(), ""));5886InstructionMark im(this);5887InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5888attributes.set_rex_vex_w_reverted();5889attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);5890simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5891emit_int8(0x58);5892emit_operand(dst, src);5893}589458955896void Assembler::addps(XMMRegister dst, XMMRegister src) {5897NOT_LP64(assert(VM_Version::supports_sse2(), ""));5898InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5899int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5900emit_int16(0x58, (0xC0 | encode));5901}59025903void Assembler::vaddpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {5904assert(VM_Version::supports_avx(), "");5905InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5906attributes.set_rex_vex_w_reverted();5907int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5908emit_int16(0x58, (0xC0 | encode));5909}59105911void Assembler::vaddps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {5912assert(VM_Version::supports_avx(), "");5913InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5914int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5915emit_int16(0x58, (0xC0 | encode));5916}59175918void Assembler::vaddpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {5919assert(VM_Version::supports_avx(), "");5920InstructionMark im(this);5921InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5922attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);5923attributes.set_rex_vex_w_reverted();5924vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5925emit_int8(0x58);5926emit_operand(dst, src);5927}59285929void Assembler::vaddps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {5930assert(VM_Version::supports_avx(), "");5931InstructionMark im(this);5932InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5933attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);5934vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5935emit_int8(0x58);5936emit_operand(dst, src);5937}59385939void Assembler::subpd(XMMRegister dst, XMMRegister src) {5940NOT_LP64(assert(VM_Version::supports_sse2(), ""));5941InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5942attributes.set_rex_vex_w_reverted();5943int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5944emit_int16(0x5C, (0xC0 | encode));5945}59465947void Assembler::subps(XMMRegister dst, XMMRegister src) {5948NOT_LP64(assert(VM_Version::supports_sse2(), ""));5949InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5950int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5951emit_int16(0x5C, (0xC0 | encode));5952}59535954void Assembler::vsubpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {5955assert(VM_Version::supports_avx(), "");5956InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5957attributes.set_rex_vex_w_reverted();5958int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5959emit_int16(0x5C, (0xC0 | encode));5960}59615962void Assembler::vsubps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {5963assert(VM_Version::supports_avx(), "");5964InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5965int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5966emit_int16(0x5C, (0xC0 | encode));5967}59685969void Assembler::vsubpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {5970assert(VM_Version::supports_avx(), "");5971InstructionMark im(this);5972InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5973attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);5974attributes.set_rex_vex_w_reverted();5975vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5976emit_int8(0x5C);5977emit_operand(dst, src);5978}59795980void Assembler::vsubps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {5981assert(VM_Version::supports_avx(), "");5982InstructionMark im(this);5983InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5984attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);5985vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5986emit_int8(0x5C);5987emit_operand(dst, src);5988}59895990void Assembler::mulpd(XMMRegister dst, XMMRegister src) {5991NOT_LP64(assert(VM_Version::supports_sse2(), ""));5992InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5993attributes.set_rex_vex_w_reverted();5994int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5995emit_int16(0x59, (0xC0 | encode));5996}59975998void Assembler::mulpd(XMMRegister dst, Address src) {5999NOT_LP64(assert(VM_Version::supports_sse2(), ""));6000InstructionMark im(this);6001InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6002attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6003attributes.set_rex_vex_w_reverted();6004simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6005emit_int8(0x59);6006emit_operand(dst, src);6007}60086009void Assembler::mulps(XMMRegister dst, XMMRegister src) {6010NOT_LP64(assert(VM_Version::supports_sse2(), ""));6011InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6012int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6013emit_int16(0x59, (0xC0 | encode));6014}60156016void Assembler::vmulpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6017assert(VM_Version::supports_avx(), "");6018InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6019attributes.set_rex_vex_w_reverted();6020int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6021emit_int16(0x59, (0xC0 | encode));6022}60236024void Assembler::vmulps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6025assert(VM_Version::supports_avx(), "");6026InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6027int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6028emit_int16(0x59, (0xC0 | encode));6029}60306031void Assembler::vmulpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6032assert(VM_Version::supports_avx(), "");6033InstructionMark im(this);6034InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6035attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6036attributes.set_rex_vex_w_reverted();6037vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6038emit_int8(0x59);6039emit_operand(dst, src);6040}60416042void Assembler::vmulps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6043assert(VM_Version::supports_avx(), "");6044InstructionMark im(this);6045InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6046attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6047vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6048emit_int8(0x59);6049emit_operand(dst, src);6050}60516052void Assembler::vfmadd231pd(XMMRegister dst, XMMRegister src1, XMMRegister src2, int vector_len) {6053assert(VM_Version::supports_fma(), "");6054InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6055int encode = vex_prefix_and_encode(dst->encoding(), src1->encoding(), src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6056emit_int16((unsigned char)0xB8, (0xC0 | encode));6057}60586059void Assembler::vfmadd231ps(XMMRegister dst, XMMRegister src1, XMMRegister src2, int vector_len) {6060assert(VM_Version::supports_fma(), "");6061InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6062int encode = vex_prefix_and_encode(dst->encoding(), src1->encoding(), src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6063emit_int16((unsigned char)0xB8, (0xC0 | encode));6064}60656066void Assembler::vfmadd231pd(XMMRegister dst, XMMRegister src1, Address src2, int vector_len) {6067assert(VM_Version::supports_fma(), "");6068InstructionMark im(this);6069InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6070attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6071vex_prefix(src2, src1->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6072emit_int8((unsigned char)0xB8);6073emit_operand(dst, src2);6074}60756076void Assembler::vfmadd231ps(XMMRegister dst, XMMRegister src1, Address src2, int vector_len) {6077assert(VM_Version::supports_fma(), "");6078InstructionMark im(this);6079InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6080attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6081vex_prefix(src2, src1->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6082emit_int8((unsigned char)0xB8);6083emit_operand(dst, src2);6084}60856086void Assembler::divpd(XMMRegister dst, XMMRegister src) {6087NOT_LP64(assert(VM_Version::supports_sse2(), ""));6088InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6089attributes.set_rex_vex_w_reverted();6090int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6091emit_int16(0x5E, (0xC0 | encode));6092}60936094void Assembler::divps(XMMRegister dst, XMMRegister src) {6095NOT_LP64(assert(VM_Version::supports_sse2(), ""));6096InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6097int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6098emit_int16(0x5E, (0xC0 | encode));6099}61006101void Assembler::vdivpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6102assert(VM_Version::supports_avx(), "");6103InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6104attributes.set_rex_vex_w_reverted();6105int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6106emit_int16(0x5E, (0xC0 | encode));6107}61086109void Assembler::vdivps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6110assert(VM_Version::supports_avx(), "");6111InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6112int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6113emit_int16(0x5E, (0xC0 | encode));6114}61156116void Assembler::vdivpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6117assert(VM_Version::supports_avx(), "");6118InstructionMark im(this);6119InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6120attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6121attributes.set_rex_vex_w_reverted();6122vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6123emit_int8(0x5E);6124emit_operand(dst, src);6125}61266127void Assembler::vdivps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6128assert(VM_Version::supports_avx(), "");6129InstructionMark im(this);6130InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6131attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6132vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6133emit_int8(0x5E);6134emit_operand(dst, src);6135}61366137void Assembler::vroundpd(XMMRegister dst, XMMRegister src, int32_t rmode, int vector_len) {6138assert(VM_Version::supports_avx(), "");6139InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);6140int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);6141emit_int24(0x09, (0xC0 | encode), (rmode));6142}61436144void Assembler::vroundpd(XMMRegister dst, Address src, int32_t rmode, int vector_len) {6145assert(VM_Version::supports_avx(), "");6146InstructionMark im(this);6147InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);6148vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);6149emit_int8(0x09);6150emit_operand(dst, src);6151emit_int8((rmode));6152}61536154void Assembler::vrndscalepd(XMMRegister dst, XMMRegister src, int32_t rmode, int vector_len) {6155assert(VM_Version::supports_evex(), "requires EVEX support");6156InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6157attributes.set_is_evex_instruction();6158int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);6159emit_int24(0x09, (0xC0 | encode), (rmode));6160}61616162void Assembler::vrndscalepd(XMMRegister dst, Address src, int32_t rmode, int vector_len) {6163assert(VM_Version::supports_evex(), "requires EVEX support");6164assert(dst != xnoreg, "sanity");6165InstructionMark im(this);6166InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6167attributes.set_is_evex_instruction();6168attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6169vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);6170emit_int8(0x09);6171emit_operand(dst, src);6172emit_int8((rmode));6173}617461756176void Assembler::vsqrtpd(XMMRegister dst, XMMRegister src, int vector_len) {6177assert(VM_Version::supports_avx(), "");6178InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6179attributes.set_rex_vex_w_reverted();6180int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6181emit_int16(0x51, (0xC0 | encode));6182}61836184void Assembler::vsqrtpd(XMMRegister dst, Address src, int vector_len) {6185assert(VM_Version::supports_avx(), "");6186InstructionMark im(this);6187InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6188attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6189attributes.set_rex_vex_w_reverted();6190vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6191emit_int8(0x51);6192emit_operand(dst, src);6193}61946195void Assembler::vsqrtps(XMMRegister dst, XMMRegister src, int vector_len) {6196assert(VM_Version::supports_avx(), "");6197InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6198int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6199emit_int16(0x51, (0xC0 | encode));6200}62016202void Assembler::vsqrtps(XMMRegister dst, Address src, int vector_len) {6203assert(VM_Version::supports_avx(), "");6204InstructionMark im(this);6205InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6206attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6207vex_prefix(src, 0, dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6208emit_int8(0x51);6209emit_operand(dst, src);6210}62116212void Assembler::andpd(XMMRegister dst, XMMRegister src) {6213NOT_LP64(assert(VM_Version::supports_sse2(), ""));6214InstructionAttr attributes(AVX_128bit, /* rex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6215attributes.set_rex_vex_w_reverted();6216int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6217emit_int16(0x54, (0xC0 | encode));6218}62196220void Assembler::andps(XMMRegister dst, XMMRegister src) {6221NOT_LP64(assert(VM_Version::supports_sse(), ""));6222InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6223int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6224emit_int16(0x54, (0xC0 | encode));6225}62266227void Assembler::andps(XMMRegister dst, Address src) {6228NOT_LP64(assert(VM_Version::supports_sse(), ""));6229InstructionMark im(this);6230InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6231attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6232simd_prefix(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6233emit_int8(0x54);6234emit_operand(dst, src);6235}62366237void Assembler::andpd(XMMRegister dst, Address src) {6238NOT_LP64(assert(VM_Version::supports_sse2(), ""));6239InstructionMark im(this);6240InstructionAttr attributes(AVX_128bit, /* rex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6241attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6242attributes.set_rex_vex_w_reverted();6243simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6244emit_int8(0x54);6245emit_operand(dst, src);6246}62476248void Assembler::vandpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6249assert(VM_Version::supports_avx(), "");6250InstructionAttr attributes(vector_len, /* vex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6251attributes.set_rex_vex_w_reverted();6252int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6253emit_int16(0x54, (0xC0 | encode));6254}62556256void Assembler::vandps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6257assert(VM_Version::supports_avx(), "");6258InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6259int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6260emit_int16(0x54, (0xC0 | encode));6261}62626263void Assembler::vandpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6264assert(VM_Version::supports_avx(), "");6265InstructionMark im(this);6266InstructionAttr attributes(vector_len, /* vex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6267attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6268attributes.set_rex_vex_w_reverted();6269vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6270emit_int8(0x54);6271emit_operand(dst, src);6272}62736274void Assembler::vandps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6275assert(VM_Version::supports_avx(), "");6276InstructionMark im(this);6277InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6278attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6279vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6280emit_int8(0x54);6281emit_operand(dst, src);6282}62836284void Assembler::unpckhpd(XMMRegister dst, XMMRegister src) {6285NOT_LP64(assert(VM_Version::supports_sse2(), ""));6286InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6287attributes.set_rex_vex_w_reverted();6288int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6289emit_int8(0x15);6290emit_int8((0xC0 | encode));6291}62926293void Assembler::unpcklpd(XMMRegister dst, XMMRegister src) {6294NOT_LP64(assert(VM_Version::supports_sse2(), ""));6295InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6296attributes.set_rex_vex_w_reverted();6297int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6298emit_int16(0x14, (0xC0 | encode));6299}63006301void Assembler::xorpd(XMMRegister dst, XMMRegister src) {6302NOT_LP64(assert(VM_Version::supports_sse2(), ""));6303InstructionAttr attributes(AVX_128bit, /* rex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6304attributes.set_rex_vex_w_reverted();6305int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6306emit_int16(0x57, (0xC0 | encode));6307}63086309void Assembler::xorps(XMMRegister dst, XMMRegister src) {6310NOT_LP64(assert(VM_Version::supports_sse(), ""));6311InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6312int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6313emit_int16(0x57, (0xC0 | encode));6314}63156316void Assembler::xorpd(XMMRegister dst, Address src) {6317NOT_LP64(assert(VM_Version::supports_sse2(), ""));6318InstructionMark im(this);6319InstructionAttr attributes(AVX_128bit, /* rex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6320attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6321attributes.set_rex_vex_w_reverted();6322simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6323emit_int8(0x57);6324emit_operand(dst, src);6325}63266327void Assembler::xorps(XMMRegister dst, Address src) {6328NOT_LP64(assert(VM_Version::supports_sse(), ""));6329InstructionMark im(this);6330InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6331attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6332simd_prefix(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6333emit_int8(0x57);6334emit_operand(dst, src);6335}63366337void Assembler::vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6338assert(VM_Version::supports_avx(), "");6339InstructionAttr attributes(vector_len, /* vex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6340attributes.set_rex_vex_w_reverted();6341int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6342emit_int16(0x57, (0xC0 | encode));6343}63446345void Assembler::vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6346assert(VM_Version::supports_avx(), "");6347InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6348int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6349emit_int16(0x57, (0xC0 | encode));6350}63516352void Assembler::vxorpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6353assert(VM_Version::supports_avx(), "");6354InstructionMark im(this);6355InstructionAttr attributes(vector_len, /* vex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6356attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6357attributes.set_rex_vex_w_reverted();6358vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6359emit_int8(0x57);6360emit_operand(dst, src);6361}63626363void Assembler::vxorps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6364assert(VM_Version::supports_avx(), "");6365InstructionMark im(this);6366InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6367attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6368vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6369emit_int8(0x57);6370emit_operand(dst, src);6371}63726373// Integer vector arithmetic6374void Assembler::vphaddw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6375assert(VM_Version::supports_avx() && (vector_len == 0) ||6376VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");6377InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);6378int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6379emit_int16(0x01, (0xC0 | encode));6380}63816382void Assembler::vphaddd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6383assert(VM_Version::supports_avx() && (vector_len == 0) ||6384VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");6385InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);6386int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6387emit_int16(0x02, (0xC0 | encode));6388}63896390void Assembler::paddb(XMMRegister dst, XMMRegister src) {6391NOT_LP64(assert(VM_Version::supports_sse2(), ""));6392InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6393int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6394emit_int16((unsigned char)0xFC, (0xC0 | encode));6395}63966397void Assembler::paddw(XMMRegister dst, XMMRegister src) {6398NOT_LP64(assert(VM_Version::supports_sse2(), ""));6399InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6400int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6401emit_int16((unsigned char)0xFD, (0xC0 | encode));6402}64036404void Assembler::paddd(XMMRegister dst, XMMRegister src) {6405NOT_LP64(assert(VM_Version::supports_sse2(), ""));6406InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6407int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6408emit_int16((unsigned char)0xFE, (0xC0 | encode));6409}64106411void Assembler::paddd(XMMRegister dst, Address src) {6412NOT_LP64(assert(VM_Version::supports_sse2(), ""));6413InstructionMark im(this);6414InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6415simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6416emit_int8((unsigned char)0xFE);6417emit_operand(dst, src);6418}64196420void Assembler::paddq(XMMRegister dst, XMMRegister src) {6421NOT_LP64(assert(VM_Version::supports_sse2(), ""));6422InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6423attributes.set_rex_vex_w_reverted();6424int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6425emit_int16((unsigned char)0xD4, (0xC0 | encode));6426}64276428void Assembler::phaddw(XMMRegister dst, XMMRegister src) {6429assert(VM_Version::supports_sse3(), "");6430InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);6431int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6432emit_int16(0x01, (0xC0 | encode));6433}64346435void Assembler::phaddd(XMMRegister dst, XMMRegister src) {6436assert(VM_Version::supports_sse3(), "");6437InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);6438int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6439emit_int16(0x02, (0xC0 | encode));6440}64416442void Assembler::vpaddb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6443assert(UseAVX > 0, "requires some form of AVX");6444InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6445int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6446emit_int16((unsigned char)0xFC, (0xC0 | encode));6447}64486449void Assembler::vpaddw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6450assert(UseAVX > 0, "requires some form of AVX");6451InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6452int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6453emit_int16((unsigned char)0xFD, (0xC0 | encode));6454}64556456void Assembler::vpaddd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6457assert(UseAVX > 0, "requires some form of AVX");6458InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6459int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6460emit_int16((unsigned char)0xFE, (0xC0 | encode));6461}64626463void Assembler::vpaddq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6464assert(UseAVX > 0, "requires some form of AVX");6465InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6466attributes.set_rex_vex_w_reverted();6467int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6468emit_int16((unsigned char)0xD4, (0xC0 | encode));6469}64706471void Assembler::vpaddb(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6472assert(UseAVX > 0, "requires some form of AVX");6473InstructionMark im(this);6474InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6475attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);6476vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6477emit_int8((unsigned char)0xFC);6478emit_operand(dst, src);6479}64806481void Assembler::vpaddw(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6482assert(UseAVX > 0, "requires some form of AVX");6483InstructionMark im(this);6484InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6485attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);6486vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6487emit_int8((unsigned char)0xFD);6488emit_operand(dst, src);6489}64906491void Assembler::vpaddd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6492assert(UseAVX > 0, "requires some form of AVX");6493InstructionMark im(this);6494InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6495attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6496vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6497emit_int8((unsigned char)0xFE);6498emit_operand(dst, src);6499}65006501void Assembler::vpaddq(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6502assert(UseAVX > 0, "requires some form of AVX");6503InstructionMark im(this);6504InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6505attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6506attributes.set_rex_vex_w_reverted();6507vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6508emit_int8((unsigned char)0xD4);6509emit_operand(dst, src);6510}65116512void Assembler::psubb(XMMRegister dst, XMMRegister src) {6513NOT_LP64(assert(VM_Version::supports_sse2(), ""));6514InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6515int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6516emit_int16((unsigned char)0xF8, (0xC0 | encode));6517}65186519void Assembler::psubw(XMMRegister dst, XMMRegister src) {6520NOT_LP64(assert(VM_Version::supports_sse2(), ""));6521InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6522int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6523emit_int16((unsigned char)0xF9, (0xC0 | encode));6524}65256526void Assembler::psubd(XMMRegister dst, XMMRegister src) {6527InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6528int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6529emit_int16((unsigned char)0xFA, (0xC0 | encode));6530}65316532void Assembler::psubq(XMMRegister dst, XMMRegister src) {6533NOT_LP64(assert(VM_Version::supports_sse2(), ""));6534InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6535attributes.set_rex_vex_w_reverted();6536int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6537emit_int8((unsigned char)0xFB);6538emit_int8((0xC0 | encode));6539}65406541void Assembler::vpsubb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6542assert(UseAVX > 0, "requires some form of AVX");6543InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6544int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6545emit_int16((unsigned char)0xF8, (0xC0 | encode));6546}65476548void Assembler::vpsubw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6549assert(UseAVX > 0, "requires some form of AVX");6550InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6551int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6552emit_int16((unsigned char)0xF9, (0xC0 | encode));6553}65546555void Assembler::vpsubd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6556assert(UseAVX > 0, "requires some form of AVX");6557InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6558int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6559emit_int16((unsigned char)0xFA, (0xC0 | encode));6560}65616562void Assembler::vpsubq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6563assert(UseAVX > 0, "requires some form of AVX");6564InstructionAttr attributes(vector_len, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6565attributes.set_rex_vex_w_reverted();6566int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6567emit_int16((unsigned char)0xFB, (0xC0 | encode));6568}65696570void Assembler::vpsubb(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6571assert(UseAVX > 0, "requires some form of AVX");6572InstructionMark im(this);6573InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6574attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);6575vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6576emit_int8((unsigned char)0xF8);6577emit_operand(dst, src);6578}65796580void Assembler::vpsubw(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6581assert(UseAVX > 0, "requires some form of AVX");6582InstructionMark im(this);6583InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6584attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);6585vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6586emit_int8((unsigned char)0xF9);6587emit_operand(dst, src);6588}65896590void Assembler::vpsubd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6591assert(UseAVX > 0, "requires some form of AVX");6592InstructionMark im(this);6593InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6594attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6595vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6596emit_int8((unsigned char)0xFA);6597emit_operand(dst, src);6598}65996600void Assembler::vpsubq(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6601assert(UseAVX > 0, "requires some form of AVX");6602InstructionMark im(this);6603InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6604attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6605attributes.set_rex_vex_w_reverted();6606vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6607emit_int8((unsigned char)0xFB);6608emit_operand(dst, src);6609}66106611void Assembler::pmullw(XMMRegister dst, XMMRegister src) {6612NOT_LP64(assert(VM_Version::supports_sse2(), ""));6613InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6614int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6615emit_int16((unsigned char)0xD5, (0xC0 | encode));6616}66176618void Assembler::pmulld(XMMRegister dst, XMMRegister src) {6619assert(VM_Version::supports_sse4_1(), "");6620InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6621int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6622emit_int16(0x40, (0xC0 | encode));6623}66246625void Assembler::pmuludq(XMMRegister dst, XMMRegister src) {6626assert(VM_Version::supports_sse2(), "");6627InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6628int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6629emit_int16((unsigned char)0xF4, (0xC0 | encode));6630}66316632void Assembler::vpmullw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6633assert(UseAVX > 0, "requires some form of AVX");6634InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6635int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6636emit_int16((unsigned char)0xD5, (0xC0 | encode));6637}66386639void Assembler::vpmulld(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6640assert(UseAVX > 0, "requires some form of AVX");6641InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6642int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6643emit_int16(0x40, (0xC0 | encode));6644}66456646void Assembler::vpmullq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6647assert(UseAVX > 2, "requires some form of EVEX");6648InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6649attributes.set_is_evex_instruction();6650int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6651emit_int16(0x40, (0xC0 | encode));6652}66536654void Assembler::vpmuludq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6655assert(UseAVX > 0, "requires some form of AVX");6656InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6657int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6658emit_int16((unsigned char)0xF4, (0xC0 | encode));6659}66606661void Assembler::vpmullw(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6662assert(UseAVX > 0, "requires some form of AVX");6663InstructionMark im(this);6664InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6665attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);6666vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6667emit_int8((unsigned char)0xD5);6668emit_operand(dst, src);6669}66706671void Assembler::vpmulld(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6672assert(UseAVX > 0, "requires some form of AVX");6673InstructionMark im(this);6674InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6675attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6676vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6677emit_int8(0x40);6678emit_operand(dst, src);6679}66806681void Assembler::vpmullq(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6682assert(UseAVX > 2, "requires some form of EVEX");6683InstructionMark im(this);6684InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6685attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6686attributes.set_is_evex_instruction();6687vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6688emit_int8(0x40);6689emit_operand(dst, src);6690}66916692// Min, max6693void Assembler::pminsb(XMMRegister dst, XMMRegister src) {6694assert(VM_Version::supports_sse4_1(), "");6695InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6696int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6697emit_int16(0x38, (0xC0 | encode));6698}66996700void Assembler::vpminsb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6701assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :6702(vector_len == AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_avx512bw()), "");6703InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6704int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6705emit_int16(0x38, (0xC0 | encode));6706}67076708void Assembler::pminsw(XMMRegister dst, XMMRegister src) {6709assert(VM_Version::supports_sse2(), "");6710InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6711int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6712emit_int16((unsigned char)0xEA, (0xC0 | encode));6713}67146715void Assembler::vpminsw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6716assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :6717(vector_len == AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_avx512bw()), "");6718InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6719int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6720emit_int16((unsigned char)0xEA, (0xC0 | encode));6721}67226723void Assembler::pminsd(XMMRegister dst, XMMRegister src) {6724assert(VM_Version::supports_sse4_1(), "");6725InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6726int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6727emit_int16(0x39, (0xC0 | encode));6728}67296730void Assembler::vpminsd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6731assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :6732(vector_len == AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_evex()), "");6733InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6734int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6735emit_int16(0x39, (0xC0 | encode));6736}67376738void Assembler::vpminsq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6739assert(UseAVX > 2, "requires AVX512F");6740InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6741attributes.set_is_evex_instruction();6742int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6743emit_int16(0x39, (0xC0 | encode));6744}67456746void Assembler::minps(XMMRegister dst, XMMRegister src) {6747NOT_LP64(assert(VM_Version::supports_sse(), ""));6748InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6749int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6750emit_int16(0x5D, (0xC0 | encode));6751}6752void Assembler::vminps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6753assert(vector_len >= AVX_512bit ? VM_Version::supports_evex() : VM_Version::supports_avx(), "");6754InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6755int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6756emit_int16(0x5D, (0xC0 | encode));6757}67586759void Assembler::minpd(XMMRegister dst, XMMRegister src) {6760NOT_LP64(assert(VM_Version::supports_sse(), ""));6761InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6762int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6763emit_int16(0x5D, (0xC0 | encode));6764}6765void Assembler::vminpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6766assert(vector_len >= AVX_512bit ? VM_Version::supports_evex() : VM_Version::supports_avx(), "");6767InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6768int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6769emit_int16(0x5D, (0xC0 | encode));6770}67716772void Assembler::pmaxsb(XMMRegister dst, XMMRegister src) {6773assert(VM_Version::supports_sse4_1(), "");6774InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6775int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6776emit_int16(0x3C, (0xC0 | encode));6777}67786779void Assembler::vpmaxsb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6780assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :6781(vector_len == AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_avx512bw()), "");6782InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6783int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6784emit_int16(0x3C, (0xC0 | encode));6785}67866787void Assembler::pmaxsw(XMMRegister dst, XMMRegister src) {6788assert(VM_Version::supports_sse2(), "");6789InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6790int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6791emit_int16((unsigned char)0xEE, (0xC0 | encode));6792}67936794void Assembler::vpmaxsw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6795assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :6796(vector_len == AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_avx512bw()), "");6797InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6798int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6799emit_int16((unsigned char)0xEE, (0xC0 | encode));6800}68016802void Assembler::pmaxsd(XMMRegister dst, XMMRegister src) {6803assert(VM_Version::supports_sse4_1(), "");6804InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6805int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6806emit_int16(0x3D, (0xC0 | encode));6807}68086809void Assembler::vpmaxsd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6810assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :6811(vector_len == AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_evex()), "");6812InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6813int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6814emit_int16(0x3D, (0xC0 | encode));6815}68166817void Assembler::vpmaxsq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6818assert(UseAVX > 2, "requires AVX512F");6819InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6820attributes.set_is_evex_instruction();6821int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6822emit_int16(0x3D, (0xC0 | encode));6823}68246825void Assembler::maxps(XMMRegister dst, XMMRegister src) {6826NOT_LP64(assert(VM_Version::supports_sse(), ""));6827InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6828int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6829emit_int16(0x5F, (0xC0 | encode));6830}68316832void Assembler::vmaxps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6833assert(vector_len >= AVX_512bit ? VM_Version::supports_evex() : VM_Version::supports_avx(), "");6834InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6835int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6836emit_int16(0x5F, (0xC0 | encode));6837}68386839void Assembler::maxpd(XMMRegister dst, XMMRegister src) {6840NOT_LP64(assert(VM_Version::supports_sse(), ""));6841InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6842int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6843emit_int16(0x5F, (0xC0 | encode));6844}68456846void Assembler::vmaxpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6847assert(vector_len >= AVX_512bit ? VM_Version::supports_evex() : VM_Version::supports_avx(), "");6848InstructionAttr attributes(vector_len, /* vex_w */true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6849int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6850emit_int16(0x5F, (0xC0 | encode));6851}68526853// Shift packed integers left by specified number of bits.6854void Assembler::psllw(XMMRegister dst, int shift) {6855NOT_LP64(assert(VM_Version::supports_sse2(), ""));6856InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6857// XMM6 is for /6 encoding: 66 0F 71 /6 ib6858int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6859emit_int24(0x71, (0xC0 | encode), shift & 0xFF);6860}68616862void Assembler::pslld(XMMRegister dst, int shift) {6863NOT_LP64(assert(VM_Version::supports_sse2(), ""));6864InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6865// XMM6 is for /6 encoding: 66 0F 72 /6 ib6866int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6867emit_int24(0x72, (0xC0 | encode), shift & 0xFF);6868}68696870void Assembler::psllq(XMMRegister dst, int shift) {6871NOT_LP64(assert(VM_Version::supports_sse2(), ""));6872InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6873// XMM6 is for /6 encoding: 66 0F 73 /6 ib6874int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6875emit_int24(0x73, (0xC0 | encode), shift & 0xFF);6876}68776878void Assembler::psllw(XMMRegister dst, XMMRegister shift) {6879NOT_LP64(assert(VM_Version::supports_sse2(), ""));6880InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6881int encode = simd_prefix_and_encode(dst, dst, shift, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6882emit_int16((unsigned char)0xF1, (0xC0 | encode));6883}68846885void Assembler::pslld(XMMRegister dst, XMMRegister shift) {6886NOT_LP64(assert(VM_Version::supports_sse2(), ""));6887InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6888int encode = simd_prefix_and_encode(dst, dst, shift, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6889emit_int16((unsigned char)0xF2, (0xC0 | encode));6890}68916892void Assembler::psllq(XMMRegister dst, XMMRegister shift) {6893NOT_LP64(assert(VM_Version::supports_sse2(), ""));6894InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6895attributes.set_rex_vex_w_reverted();6896int encode = simd_prefix_and_encode(dst, dst, shift, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6897emit_int16((unsigned char)0xF3, (0xC0 | encode));6898}68996900void Assembler::vpsllw(XMMRegister dst, XMMRegister src, int shift, int vector_len) {6901assert(UseAVX > 0, "requires some form of AVX");6902InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6903// XMM6 is for /6 encoding: 66 0F 71 /6 ib6904int encode = vex_prefix_and_encode(xmm6->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6905emit_int24(0x71, (0xC0 | encode), shift & 0xFF);6906}69076908void Assembler::vpslld(XMMRegister dst, XMMRegister src, int shift, int vector_len) {6909assert(UseAVX > 0, "requires some form of AVX");6910NOT_LP64(assert(VM_Version::supports_sse2(), ""));6911InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6912// XMM6 is for /6 encoding: 66 0F 72 /6 ib6913int encode = vex_prefix_and_encode(xmm6->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6914emit_int24(0x72, (0xC0 | encode), shift & 0xFF);6915}69166917void Assembler::vpsllq(XMMRegister dst, XMMRegister src, int shift, int vector_len) {6918assert(UseAVX > 0, "requires some form of AVX");6919InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6920attributes.set_rex_vex_w_reverted();6921// XMM6 is for /6 encoding: 66 0F 73 /6 ib6922int encode = vex_prefix_and_encode(xmm6->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6923emit_int24(0x73, (0xC0 | encode), shift & 0xFF);6924}69256926void Assembler::vpsllw(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {6927assert(UseAVX > 0, "requires some form of AVX");6928InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6929int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6930emit_int16((unsigned char)0xF1, (0xC0 | encode));6931}69326933void Assembler::vpslld(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {6934assert(UseAVX > 0, "requires some form of AVX");6935InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6936int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6937emit_int16((unsigned char)0xF2, (0xC0 | encode));6938}69396940void Assembler::vpsllq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {6941assert(UseAVX > 0, "requires some form of AVX");6942InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6943attributes.set_rex_vex_w_reverted();6944int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6945emit_int16((unsigned char)0xF3, (0xC0 | encode));6946}69476948// Shift packed integers logically right by specified number of bits.6949void Assembler::psrlw(XMMRegister dst, int shift) {6950NOT_LP64(assert(VM_Version::supports_sse2(), ""));6951InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6952// XMM2 is for /2 encoding: 66 0F 71 /2 ib6953int encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6954emit_int24(0x71, (0xC0 | encode), shift & 0xFF);6955}69566957void Assembler::psrld(XMMRegister dst, int shift) {6958NOT_LP64(assert(VM_Version::supports_sse2(), ""));6959InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6960// XMM2 is for /2 encoding: 66 0F 72 /2 ib6961int encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6962emit_int24(0x72, (0xC0 | encode), shift & 0xFF);6963}69646965void Assembler::psrlq(XMMRegister dst, int shift) {6966// Do not confuse it with psrldq SSE2 instruction which6967// shifts 128 bit value in xmm register by number of bytes.6968NOT_LP64(assert(VM_Version::supports_sse2(), ""));6969InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6970attributes.set_rex_vex_w_reverted();6971// XMM2 is for /2 encoding: 66 0F 73 /2 ib6972int encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6973emit_int24(0x73, (0xC0 | encode), shift & 0xFF);6974}69756976void Assembler::psrlw(XMMRegister dst, XMMRegister shift) {6977NOT_LP64(assert(VM_Version::supports_sse2(), ""));6978InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6979int encode = simd_prefix_and_encode(dst, dst, shift, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6980emit_int16((unsigned char)0xD1, (0xC0 | encode));6981}69826983void Assembler::psrld(XMMRegister dst, XMMRegister shift) {6984NOT_LP64(assert(VM_Version::supports_sse2(), ""));6985InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6986int encode = simd_prefix_and_encode(dst, dst, shift, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6987emit_int16((unsigned char)0xD2, (0xC0 | encode));6988}69896990void Assembler::psrlq(XMMRegister dst, XMMRegister shift) {6991NOT_LP64(assert(VM_Version::supports_sse2(), ""));6992InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6993attributes.set_rex_vex_w_reverted();6994int encode = simd_prefix_and_encode(dst, dst, shift, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6995emit_int16((unsigned char)0xD3, (0xC0 | encode));6996}69976998void Assembler::vpsrlw(XMMRegister dst, XMMRegister src, int shift, int vector_len) {6999assert(UseAVX > 0, "requires some form of AVX");7000InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7001// XMM2 is for /2 encoding: 66 0F 71 /2 ib7002int encode = vex_prefix_and_encode(xmm2->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7003emit_int24(0x71, (0xC0 | encode), shift & 0xFF);7004}70057006void Assembler::vpsrld(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7007assert(UseAVX > 0, "requires some form of AVX");7008InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7009// XMM2 is for /2 encoding: 66 0F 72 /2 ib7010int encode = vex_prefix_and_encode(xmm2->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7011emit_int24(0x72, (0xC0 | encode), shift & 0xFF);7012}70137014void Assembler::vpsrlq(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7015assert(UseAVX > 0, "requires some form of AVX");7016InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7017attributes.set_rex_vex_w_reverted();7018// XMM2 is for /2 encoding: 66 0F 73 /2 ib7019int encode = vex_prefix_and_encode(xmm2->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7020emit_int24(0x73, (0xC0 | encode), shift & 0xFF);7021}70227023void Assembler::vpsrlw(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7024assert(UseAVX > 0, "requires some form of AVX");7025InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7026int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7027emit_int16((unsigned char)0xD1, (0xC0 | encode));7028}70297030void Assembler::vpsrld(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7031assert(UseAVX > 0, "requires some form of AVX");7032InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7033int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7034emit_int16((unsigned char)0xD2, (0xC0 | encode));7035}70367037void Assembler::vpsrlq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7038assert(UseAVX > 0, "requires some form of AVX");7039InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7040attributes.set_rex_vex_w_reverted();7041int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7042emit_int16((unsigned char)0xD3, (0xC0 | encode));7043}70447045void Assembler::evpsrlvw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7046assert(VM_Version::supports_avx512bw(), "");7047InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7048attributes.set_is_evex_instruction();7049int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7050emit_int16(0x10, (0xC0 | encode));7051}70527053void Assembler::evpsllvw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7054assert(VM_Version::supports_avx512bw(), "");7055InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7056attributes.set_is_evex_instruction();7057int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7058emit_int16(0x12, (0xC0 | encode));7059}70607061// Shift packed integers arithmetically right by specified number of bits.7062void Assembler::psraw(XMMRegister dst, int shift) {7063NOT_LP64(assert(VM_Version::supports_sse2(), ""));7064InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7065// XMM4 is for /4 encoding: 66 0F 71 /4 ib7066int encode = simd_prefix_and_encode(xmm4, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7067emit_int24(0x71, (0xC0 | encode), shift & 0xFF);7068}70697070void Assembler::psrad(XMMRegister dst, int shift) {7071NOT_LP64(assert(VM_Version::supports_sse2(), ""));7072InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7073// XMM4 is for /4 encoding: 66 0F 72 /4 ib7074int encode = simd_prefix_and_encode(xmm4, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7075emit_int8(0x72);7076emit_int8((0xC0 | encode));7077emit_int8(shift & 0xFF);7078}70797080void Assembler::psraw(XMMRegister dst, XMMRegister shift) {7081NOT_LP64(assert(VM_Version::supports_sse2(), ""));7082InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7083int encode = simd_prefix_and_encode(dst, dst, shift, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7084emit_int16((unsigned char)0xE1, (0xC0 | encode));7085}70867087void Assembler::psrad(XMMRegister dst, XMMRegister shift) {7088NOT_LP64(assert(VM_Version::supports_sse2(), ""));7089InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7090int encode = simd_prefix_and_encode(dst, dst, shift, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7091emit_int16((unsigned char)0xE2, (0xC0 | encode));7092}70937094void Assembler::vpsraw(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7095assert(UseAVX > 0, "requires some form of AVX");7096InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7097// XMM4 is for /4 encoding: 66 0F 71 /4 ib7098int encode = vex_prefix_and_encode(xmm4->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7099emit_int24(0x71, (0xC0 | encode), shift & 0xFF);7100}71017102void Assembler::vpsrad(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7103assert(UseAVX > 0, "requires some form of AVX");7104InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7105// XMM4 is for /4 encoding: 66 0F 71 /4 ib7106int encode = vex_prefix_and_encode(xmm4->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7107emit_int24(0x72, (0xC0 | encode), shift & 0xFF);7108}71097110void Assembler::vpsraw(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7111assert(UseAVX > 0, "requires some form of AVX");7112InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7113int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7114emit_int16((unsigned char)0xE1, (0xC0 | encode));7115}71167117void Assembler::vpsrad(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7118assert(UseAVX > 0, "requires some form of AVX");7119InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7120int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7121emit_int16((unsigned char)0xE2, (0xC0 | encode));7122}71237124void Assembler::evpsraq(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7125assert(UseAVX > 2, "requires AVX512");7126assert ((VM_Version::supports_avx512vl() || vector_len == 2), "requires AVX512vl");7127InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7128attributes.set_is_evex_instruction();7129int encode = vex_prefix_and_encode(xmm4->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7130emit_int24((unsigned char)0x72, (0xC0 | encode), shift & 0xFF);7131}71327133void Assembler::evpsraq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7134assert(UseAVX > 2, "requires AVX512");7135assert ((VM_Version::supports_avx512vl() || vector_len == 2), "requires AVX512vl");7136InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7137attributes.set_is_evex_instruction();7138int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7139emit_int16((unsigned char)0xE2, (0xC0 | encode));7140}71417142// logical operations packed integers7143void Assembler::pand(XMMRegister dst, XMMRegister src) {7144NOT_LP64(assert(VM_Version::supports_sse2(), ""));7145InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7146int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7147emit_int16((unsigned char)0xDB, (0xC0 | encode));7148}71497150void Assembler::vpand(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7151assert(UseAVX > 0, "requires some form of AVX");7152InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7153int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7154emit_int16((unsigned char)0xDB, (0xC0 | encode));7155}71567157void Assembler::vpand(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {7158assert(UseAVX > 0, "requires some form of AVX");7159InstructionMark im(this);7160InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7161attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);7162vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7163emit_int8((unsigned char)0xDB);7164emit_operand(dst, src);7165}71667167void Assembler::vpandq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7168assert(VM_Version::supports_evex(), "");7169InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7170int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7171emit_int16((unsigned char)0xDB, (0xC0 | encode));7172}71737174//Variable Shift packed integers logically left.7175void Assembler::vpsllvd(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7176assert(UseAVX > 1, "requires AVX2");7177InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7178int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7179emit_int16(0x47, (0xC0 | encode));7180}71817182void Assembler::vpsllvq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7183assert(UseAVX > 1, "requires AVX2");7184InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7185int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7186emit_int16(0x47, (0xC0 | encode));7187}71887189//Variable Shift packed integers logically right.7190void Assembler::vpsrlvd(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7191assert(UseAVX > 1, "requires AVX2");7192InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7193int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7194emit_int16(0x45, (0xC0 | encode));7195}71967197void Assembler::vpsrlvq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7198assert(UseAVX > 1, "requires AVX2");7199InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7200int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7201emit_int16(0x45, (0xC0 | encode));7202}72037204//Variable right Shift arithmetic packed integers .7205void Assembler::vpsravd(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7206assert(UseAVX > 1, "requires AVX2");7207InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7208int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7209emit_int16(0x46, (0xC0 | encode));7210}72117212void Assembler::evpsravw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7213assert(VM_Version::supports_avx512bw(), "");7214InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7215attributes.set_is_evex_instruction();7216int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7217emit_int16(0x11, (0xC0 | encode));7218}72197220void Assembler::evpsravq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7221assert(UseAVX > 2, "requires AVX512");7222assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires AVX512VL");7223InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7224attributes.set_is_evex_instruction();7225int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7226emit_int16(0x46, (0xC0 | encode));7227}72287229void Assembler::vpshldvd(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7230assert(VM_Version::supports_avx512_vbmi2(), "requires vbmi2");7231InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7232attributes.set_is_evex_instruction();7233int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7234emit_int16(0x71, (0xC0 | encode));7235}72367237void Assembler::vpshrdvd(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7238assert(VM_Version::supports_avx512_vbmi2(), "requires vbmi2");7239InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7240attributes.set_is_evex_instruction();7241int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7242emit_int16(0x73, (0xC0 | encode));7243}72447245void Assembler::pandn(XMMRegister dst, XMMRegister src) {7246NOT_LP64(assert(VM_Version::supports_sse2(), ""));7247InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7248attributes.set_rex_vex_w_reverted();7249int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7250emit_int16((unsigned char)0xDF, (0xC0 | encode));7251}72527253void Assembler::vpandn(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7254assert(UseAVX > 0, "requires some form of AVX");7255InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7256int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7257emit_int16((unsigned char)0xDF, (0xC0 | encode));7258}72597260void Assembler::por(XMMRegister dst, XMMRegister src) {7261NOT_LP64(assert(VM_Version::supports_sse2(), ""));7262InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7263int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7264emit_int16((unsigned char)0xEB, (0xC0 | encode));7265}72667267void Assembler::vpor(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7268assert(UseAVX > 0, "requires some form of AVX");7269InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7270int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7271emit_int16((unsigned char)0xEB, (0xC0 | encode));7272}72737274void Assembler::vpor(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {7275assert(UseAVX > 0, "requires some form of AVX");7276InstructionMark im(this);7277InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7278attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);7279vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7280emit_int8((unsigned char)0xEB);7281emit_operand(dst, src);7282}72837284void Assembler::vporq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7285assert(VM_Version::supports_evex(), "");7286InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7287int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7288emit_int16((unsigned char)0xEB, (0xC0 | encode));7289}729072917292void Assembler::evpord(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len) {7293assert(VM_Version::supports_evex(), "");7294// Encoding: EVEX.NDS.XXX.66.0F.W0 EB /r7295InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);7296attributes.set_is_evex_instruction();7297attributes.set_embedded_opmask_register_specifier(mask);7298if (merge) {7299attributes.reset_is_clear_context();7300}7301int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7302emit_int16((unsigned char)0xEB, (0xC0 | encode));7303}73047305void Assembler::evpord(XMMRegister dst, KRegister mask, XMMRegister nds, Address src, bool merge, int vector_len) {7306assert(VM_Version::supports_evex(), "");7307// Encoding: EVEX.NDS.XXX.66.0F.W0 EB /r7308InstructionMark im(this);7309InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);7310attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_NObit);7311attributes.set_is_evex_instruction();7312attributes.set_embedded_opmask_register_specifier(mask);7313if (merge) {7314attributes.reset_is_clear_context();7315}7316vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7317emit_int8((unsigned char)0xEB);7318emit_operand(dst, src);7319}73207321void Assembler::pxor(XMMRegister dst, XMMRegister src) {7322NOT_LP64(assert(VM_Version::supports_sse2(), ""));7323InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7324int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7325emit_int16((unsigned char)0xEF, (0xC0 | encode));7326}73277328void Assembler::vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7329assert(UseAVX > 0, "requires some form of AVX");7330assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :7331vector_len == AVX_256bit ? VM_Version::supports_avx2() :7332vector_len == AVX_512bit ? VM_Version::supports_evex() : 0, "");7333InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7334int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7335emit_int16((unsigned char)0xEF, (0xC0 | encode));7336}73377338void Assembler::vpxor(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {7339assert(UseAVX > 0, "requires some form of AVX");7340assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :7341vector_len == AVX_256bit ? VM_Version::supports_avx2() :7342vector_len == AVX_512bit ? VM_Version::supports_evex() : 0, "");7343InstructionMark im(this);7344InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7345attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);7346vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7347emit_int8((unsigned char)0xEF);7348emit_operand(dst, src);7349}73507351void Assembler::vpxorq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7352assert(UseAVX > 2, "requires some form of EVEX");7353InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7354attributes.set_rex_vex_w_reverted();7355int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7356emit_int16((unsigned char)0xEF, (0xC0 | encode));7357}73587359void Assembler::evpxord(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len) {7360assert(VM_Version::supports_evex(), "");7361// Encoding: EVEX.NDS.XXX.66.0F.W0 EF /r7362InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);7363attributes.set_is_evex_instruction();7364attributes.set_embedded_opmask_register_specifier(mask);7365if (merge) {7366attributes.reset_is_clear_context();7367}7368int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7369emit_int16((unsigned char)0xEF, (0xC0 | encode));7370}73717372void Assembler::evpxorq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7373assert(VM_Version::supports_evex(), "requires EVEX support");7374InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7375attributes.set_is_evex_instruction();7376int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7377emit_int16((unsigned char)0xEF, (0xC0 | encode));7378}73797380void Assembler::evpxorq(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {7381assert(VM_Version::supports_evex(), "requires EVEX support");7382assert(dst != xnoreg, "sanity");7383InstructionMark im(this);7384InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7385attributes.set_is_evex_instruction();7386attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);7387vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7388emit_int8((unsigned char)0xEF);7389emit_operand(dst, src);7390}73917392void Assembler::evprold(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7393assert(VM_Version::supports_evex(), "requires EVEX support");7394assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7395InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7396attributes.set_is_evex_instruction();7397int encode = vex_prefix_and_encode(xmm1->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7398emit_int24(0x72, (0xC0 | encode), shift & 0xFF);7399}74007401void Assembler::evprolq(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7402assert(VM_Version::supports_evex(), "requires EVEX support");7403assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7404InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7405attributes.set_is_evex_instruction();7406int encode = vex_prefix_and_encode(xmm1->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7407emit_int24(0x72, (0xC0 | encode), shift & 0xFF);7408}74097410void Assembler::evprord(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7411assert(VM_Version::supports_evex(), "requires EVEX support");7412assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7413InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7414attributes.set_is_evex_instruction();7415int encode = vex_prefix_and_encode(xmm0->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7416emit_int24(0x72, (0xC0 | encode), shift & 0xFF);7417}74187419void Assembler::evprorq(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7420assert(VM_Version::supports_evex(), "requires EVEX support");7421assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7422InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7423attributes.set_is_evex_instruction();7424int encode = vex_prefix_and_encode(xmm0->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7425emit_int24(0x72, (0xC0 | encode), shift & 0xFF);7426}74277428void Assembler::evprolvd(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7429assert(VM_Version::supports_evex(), "requires EVEX support");7430assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7431InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7432attributes.set_is_evex_instruction();7433int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7434emit_int16(0x15, (unsigned char)(0xC0 | encode));7435}74367437void Assembler::evprolvq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7438assert(VM_Version::supports_evex(), "requires EVEX support");7439assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7440InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7441attributes.set_is_evex_instruction();7442int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7443emit_int16(0x15, (unsigned char)(0xC0 | encode));7444}74457446void Assembler::evprorvd(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7447assert(VM_Version::supports_evex(), "requires EVEX support");7448assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7449InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7450attributes.set_is_evex_instruction();7451int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7452emit_int16(0x14, (unsigned char)(0xC0 | encode));7453}74547455void Assembler::evprorvq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7456assert(VM_Version::supports_evex(), "requires EVEX support");7457assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7458InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7459attributes.set_is_evex_instruction();7460int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7461emit_int16(0x14, (unsigned char)(0xC0 | encode));7462}74637464void Assembler::vpternlogd(XMMRegister dst, int imm8, XMMRegister src2, XMMRegister src3, int vector_len) {7465assert(VM_Version::supports_evex(), "requires EVEX support");7466assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7467InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7468attributes.set_is_evex_instruction();7469int encode = vex_prefix_and_encode(dst->encoding(), src2->encoding(), src3->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7470emit_int8(0x25);7471emit_int8((unsigned char)(0xC0 | encode));7472emit_int8(imm8);7473}74747475void Assembler::vpternlogd(XMMRegister dst, int imm8, XMMRegister src2, Address src3, int vector_len) {7476assert(VM_Version::supports_evex(), "requires EVEX support");7477assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7478assert(dst != xnoreg, "sanity");7479InstructionMark im(this);7480InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7481attributes.set_is_evex_instruction();7482attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);7483vex_prefix(src3, src2->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7484emit_int8(0x25);7485emit_operand(dst, src3);7486emit_int8(imm8);7487}74887489void Assembler::vpternlogq(XMMRegister dst, int imm8, XMMRegister src2, XMMRegister src3, int vector_len) {7490assert(VM_Version::supports_evex(), "requires EVEX support");7491assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7492InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7493attributes.set_is_evex_instruction();7494int encode = vex_prefix_and_encode(dst->encoding(), src2->encoding(), src3->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7495emit_int8(0x25);7496emit_int8((unsigned char)(0xC0 | encode));7497emit_int8(imm8);7498}74997500// vinserti forms75017502void Assembler::vinserti128(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {7503assert(VM_Version::supports_avx2(), "");7504assert(imm8 <= 0x01, "imm8: %u", imm8);7505InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7506int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7507// last byte:7508// 0x00 - insert into lower 128 bits7509// 0x01 - insert into upper 128 bits7510emit_int24(0x38, (0xC0 | encode), imm8 & 0x01);7511}75127513void Assembler::vinserti128(XMMRegister dst, XMMRegister nds, Address src, uint8_t imm8) {7514assert(VM_Version::supports_avx2(), "");7515assert(dst != xnoreg, "sanity");7516assert(imm8 <= 0x01, "imm8: %u", imm8);7517InstructionMark im(this);7518InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7519attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);7520vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7521emit_int8(0x38);7522emit_operand(dst, src);7523// 0x00 - insert into lower 128 bits7524// 0x01 - insert into upper 128 bits7525emit_int8(imm8 & 0x01);7526}75277528void Assembler::vinserti32x4(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {7529assert(VM_Version::supports_evex(), "");7530assert(imm8 <= 0x03, "imm8: %u", imm8);7531InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7532attributes.set_is_evex_instruction();7533int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7534// imm8:7535// 0x00 - insert into q0 128 bits (0..127)7536// 0x01 - insert into q1 128 bits (128..255)7537// 0x02 - insert into q2 128 bits (256..383)7538// 0x03 - insert into q3 128 bits (384..511)7539emit_int24(0x38, (0xC0 | encode), imm8 & 0x03);7540}75417542void Assembler::vinserti32x4(XMMRegister dst, XMMRegister nds, Address src, uint8_t imm8) {7543assert(VM_Version::supports_avx(), "");7544assert(dst != xnoreg, "sanity");7545assert(imm8 <= 0x03, "imm8: %u", imm8);7546InstructionMark im(this);7547InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7548attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);7549attributes.set_is_evex_instruction();7550vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7551emit_int8(0x18);7552emit_operand(dst, src);7553// 0x00 - insert into q0 128 bits (0..127)7554// 0x01 - insert into q1 128 bits (128..255)7555// 0x02 - insert into q2 128 bits (256..383)7556// 0x03 - insert into q3 128 bits (384..511)7557emit_int8(imm8 & 0x03);7558}75597560void Assembler::vinserti64x4(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {7561assert(VM_Version::supports_evex(), "");7562assert(imm8 <= 0x01, "imm8: %u", imm8);7563InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7564attributes.set_is_evex_instruction();7565int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7566//imm8:7567// 0x00 - insert into lower 256 bits7568// 0x01 - insert into upper 256 bits7569emit_int24(0x3A, (0xC0 | encode), imm8 & 0x01);7570}757175727573// vinsertf forms75747575void Assembler::vinsertf128(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {7576assert(VM_Version::supports_avx(), "");7577assert(imm8 <= 0x01, "imm8: %u", imm8);7578InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7579int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7580// imm8:7581// 0x00 - insert into lower 128 bits7582// 0x01 - insert into upper 128 bits7583emit_int24(0x18, (0xC0 | encode), imm8 & 0x01);7584}75857586void Assembler::vinsertf128(XMMRegister dst, XMMRegister nds, Address src, uint8_t imm8) {7587assert(VM_Version::supports_avx(), "");7588assert(dst != xnoreg, "sanity");7589assert(imm8 <= 0x01, "imm8: %u", imm8);7590InstructionMark im(this);7591InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7592attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);7593vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7594emit_int8(0x18);7595emit_operand(dst, src);7596// 0x00 - insert into lower 128 bits7597// 0x01 - insert into upper 128 bits7598emit_int8(imm8 & 0x01);7599}76007601void Assembler::vinsertf32x4(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {7602assert(VM_Version::supports_avx2(), "");7603assert(imm8 <= 0x03, "imm8: %u", imm8);7604InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7605int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7606// imm8:7607// 0x00 - insert into q0 128 bits (0..127)7608// 0x01 - insert into q1 128 bits (128..255)7609// 0x02 - insert into q0 128 bits (256..383)7610// 0x03 - insert into q1 128 bits (384..512)7611emit_int24(0x18, (0xC0 | encode), imm8 & 0x03);7612}76137614void Assembler::vinsertf32x4(XMMRegister dst, XMMRegister nds, Address src, uint8_t imm8) {7615assert(VM_Version::supports_avx(), "");7616assert(dst != xnoreg, "sanity");7617assert(imm8 <= 0x03, "imm8: %u", imm8);7618InstructionMark im(this);7619InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7620attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);7621vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7622emit_int8(0x18);7623emit_operand(dst, src);7624// 0x00 - insert into q0 128 bits (0..127)7625// 0x01 - insert into q1 128 bits (128..255)7626// 0x02 - insert into q0 128 bits (256..383)7627// 0x03 - insert into q1 128 bits (384..512)7628emit_int8(imm8 & 0x03);7629}76307631void Assembler::vinsertf64x4(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {7632assert(VM_Version::supports_evex(), "");7633assert(imm8 <= 0x01, "imm8: %u", imm8);7634InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7635attributes.set_is_evex_instruction();7636int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7637// imm8:7638// 0x00 - insert into lower 256 bits7639// 0x01 - insert into upper 256 bits7640emit_int24(0x1A, (0xC0 | encode), imm8 & 0x01);7641}76427643void Assembler::vinsertf64x4(XMMRegister dst, XMMRegister nds, Address src, uint8_t imm8) {7644assert(VM_Version::supports_evex(), "");7645assert(dst != xnoreg, "sanity");7646assert(imm8 <= 0x01, "imm8: %u", imm8);7647InstructionMark im(this);7648InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7649attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_64bit);7650attributes.set_is_evex_instruction();7651vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7652emit_int8(0x1A);7653emit_operand(dst, src);7654// 0x00 - insert into lower 256 bits7655// 0x01 - insert into upper 256 bits7656emit_int8(imm8 & 0x01);7657}765876597660// vextracti forms76617662void Assembler::vextracti128(XMMRegister dst, XMMRegister src, uint8_t imm8) {7663assert(VM_Version::supports_avx2(), "");7664assert(imm8 <= 0x01, "imm8: %u", imm8);7665InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7666int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7667// imm8:7668// 0x00 - extract from lower 128 bits7669// 0x01 - extract from upper 128 bits7670emit_int24(0x39, (0xC0 | encode), imm8 & 0x01);7671}76727673void Assembler::vextracti128(Address dst, XMMRegister src, uint8_t imm8) {7674assert(VM_Version::supports_avx2(), "");7675assert(src != xnoreg, "sanity");7676assert(imm8 <= 0x01, "imm8: %u", imm8);7677InstructionMark im(this);7678InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7679attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);7680attributes.reset_is_clear_context();7681vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7682emit_int8(0x39);7683emit_operand(src, dst);7684// 0x00 - extract from lower 128 bits7685// 0x01 - extract from upper 128 bits7686emit_int8(imm8 & 0x01);7687}76887689void Assembler::vextracti32x4(XMMRegister dst, XMMRegister src, uint8_t imm8) {7690assert(VM_Version::supports_evex(), "");7691assert(imm8 <= 0x03, "imm8: %u", imm8);7692InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7693attributes.set_is_evex_instruction();7694int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7695// imm8:7696// 0x00 - extract from bits 127:07697// 0x01 - extract from bits 255:1287698// 0x02 - extract from bits 383:2567699// 0x03 - extract from bits 511:3847700emit_int24(0x39, (0xC0 | encode), imm8 & 0x03);7701}77027703void Assembler::vextracti32x4(Address dst, XMMRegister src, uint8_t imm8) {7704assert(VM_Version::supports_evex(), "");7705assert(src != xnoreg, "sanity");7706assert(imm8 <= 0x03, "imm8: %u", imm8);7707InstructionMark im(this);7708InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7709attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);7710attributes.reset_is_clear_context();7711attributes.set_is_evex_instruction();7712vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7713emit_int8(0x39);7714emit_operand(src, dst);7715// 0x00 - extract from bits 127:07716// 0x01 - extract from bits 255:1287717// 0x02 - extract from bits 383:2567718// 0x03 - extract from bits 511:3847719emit_int8(imm8 & 0x03);7720}77217722void Assembler::vextracti64x2(XMMRegister dst, XMMRegister src, uint8_t imm8) {7723assert(VM_Version::supports_avx512dq(), "");7724assert(imm8 <= 0x03, "imm8: %u", imm8);7725InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7726attributes.set_is_evex_instruction();7727int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7728// imm8:7729// 0x00 - extract from bits 127:07730// 0x01 - extract from bits 255:1287731// 0x02 - extract from bits 383:2567732// 0x03 - extract from bits 511:3847733emit_int24(0x39, (0xC0 | encode), imm8 & 0x03);7734}77357736void Assembler::vextracti64x4(XMMRegister dst, XMMRegister src, uint8_t imm8) {7737assert(VM_Version::supports_evex(), "");7738assert(imm8 <= 0x01, "imm8: %u", imm8);7739InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7740attributes.set_is_evex_instruction();7741int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7742// imm8:7743// 0x00 - extract from lower 256 bits7744// 0x01 - extract from upper 256 bits7745emit_int24(0x3B, (0xC0 | encode), imm8 & 0x01);7746}77477748void Assembler::vextracti64x4(Address dst, XMMRegister src, uint8_t imm8) {7749assert(VM_Version::supports_evex(), "");7750assert(src != xnoreg, "sanity");7751assert(imm8 <= 0x01, "imm8: %u", imm8);7752InstructionMark im(this);7753InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7754attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_64bit);7755attributes.reset_is_clear_context();7756attributes.set_is_evex_instruction();7757vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7758emit_int8(0x38);7759emit_operand(src, dst);7760// 0x00 - extract from lower 256 bits7761// 0x01 - extract from upper 256 bits7762emit_int8(imm8 & 0x01);7763}7764// vextractf forms77657766void Assembler::vextractf128(XMMRegister dst, XMMRegister src, uint8_t imm8) {7767assert(VM_Version::supports_avx(), "");7768assert(imm8 <= 0x01, "imm8: %u", imm8);7769InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7770int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7771// imm8:7772// 0x00 - extract from lower 128 bits7773// 0x01 - extract from upper 128 bits7774emit_int24(0x19, (0xC0 | encode), imm8 & 0x01);7775}77767777void Assembler::vextractf128(Address dst, XMMRegister src, uint8_t imm8) {7778assert(VM_Version::supports_avx(), "");7779assert(src != xnoreg, "sanity");7780assert(imm8 <= 0x01, "imm8: %u", imm8);7781InstructionMark im(this);7782InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7783attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);7784attributes.reset_is_clear_context();7785vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7786emit_int8(0x19);7787emit_operand(src, dst);7788// 0x00 - extract from lower 128 bits7789// 0x01 - extract from upper 128 bits7790emit_int8(imm8 & 0x01);7791}77927793void Assembler::vextractf32x4(XMMRegister dst, XMMRegister src, uint8_t imm8) {7794assert(VM_Version::supports_evex(), "");7795assert(imm8 <= 0x03, "imm8: %u", imm8);7796InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7797attributes.set_is_evex_instruction();7798int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7799// imm8:7800// 0x00 - extract from bits 127:07801// 0x01 - extract from bits 255:1287802// 0x02 - extract from bits 383:2567803// 0x03 - extract from bits 511:3847804emit_int24(0x19, (0xC0 | encode), imm8 & 0x03);7805}78067807void Assembler::vextractf32x4(Address dst, XMMRegister src, uint8_t imm8) {7808assert(VM_Version::supports_evex(), "");7809assert(src != xnoreg, "sanity");7810assert(imm8 <= 0x03, "imm8: %u", imm8);7811InstructionMark im(this);7812InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7813attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);7814attributes.reset_is_clear_context();7815attributes.set_is_evex_instruction();7816vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7817emit_int8(0x19);7818emit_operand(src, dst);7819// 0x00 - extract from bits 127:07820// 0x01 - extract from bits 255:1287821// 0x02 - extract from bits 383:2567822// 0x03 - extract from bits 511:3847823emit_int8(imm8 & 0x03);7824}78257826void Assembler::vextractf64x2(XMMRegister dst, XMMRegister src, uint8_t imm8) {7827assert(VM_Version::supports_avx512dq(), "");7828assert(imm8 <= 0x03, "imm8: %u", imm8);7829InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7830attributes.set_is_evex_instruction();7831int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7832// imm8:7833// 0x00 - extract from bits 127:07834// 0x01 - extract from bits 255:1287835// 0x02 - extract from bits 383:2567836// 0x03 - extract from bits 511:3847837emit_int24(0x19, (0xC0 | encode), imm8 & 0x03);7838}78397840void Assembler::vextractf64x4(XMMRegister dst, XMMRegister src, uint8_t imm8) {7841assert(VM_Version::supports_evex(), "");7842assert(imm8 <= 0x01, "imm8: %u", imm8);7843InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7844attributes.set_is_evex_instruction();7845int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7846// imm8:7847// 0x00 - extract from lower 256 bits7848// 0x01 - extract from upper 256 bits7849emit_int24(0x1B, (0xC0 | encode), imm8 & 0x01);7850}78517852void Assembler::vextractf64x4(Address dst, XMMRegister src, uint8_t imm8) {7853assert(VM_Version::supports_evex(), "");7854assert(src != xnoreg, "sanity");7855assert(imm8 <= 0x01, "imm8: %u", imm8);7856InstructionMark im(this);7857InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7858attributes.set_address_attributes(/* tuple_type */ EVEX_T4,/* input_size_in_bits */ EVEX_64bit);7859attributes.reset_is_clear_context();7860attributes.set_is_evex_instruction();7861vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7862emit_int8(0x1B);7863emit_operand(src, dst);7864// 0x00 - extract from lower 256 bits7865// 0x01 - extract from upper 256 bits7866emit_int8(imm8 & 0x01);7867}78687869// duplicate 1-byte integer data from src into programmed locations in dest : requires AVX512BW and AVX512VL7870void Assembler::vpbroadcastb(XMMRegister dst, XMMRegister src, int vector_len) {7871assert(VM_Version::supports_avx2(), "");7872InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7873int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7874emit_int16(0x78, (0xC0 | encode));7875}78767877void Assembler::vpbroadcastb(XMMRegister dst, Address src, int vector_len) {7878assert(VM_Version::supports_avx2(), "");7879assert(dst != xnoreg, "sanity");7880InstructionMark im(this);7881InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7882attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_8bit);7883// swap src<->dst for encoding7884vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7885emit_int8(0x78);7886emit_operand(dst, src);7887}78887889// duplicate 2-byte integer data from src into programmed locations in dest : requires AVX512BW and AVX512VL7890void Assembler::vpbroadcastw(XMMRegister dst, XMMRegister src, int vector_len) {7891assert(VM_Version::supports_avx2(), "");7892InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7893int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7894emit_int16(0x79, (0xC0 | encode));7895}78967897void Assembler::vpbroadcastw(XMMRegister dst, Address src, int vector_len) {7898assert(VM_Version::supports_avx2(), "");7899assert(dst != xnoreg, "sanity");7900InstructionMark im(this);7901InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7902attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_16bit);7903// swap src<->dst for encoding7904vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7905emit_int8(0x79);7906emit_operand(dst, src);7907}79087909// xmm/mem sourced byte/word/dword/qword replicate79107911// duplicate 4-byte integer data from src into programmed locations in dest : requires AVX512VL7912void Assembler::vpbroadcastd(XMMRegister dst, XMMRegister src, int vector_len) {7913assert(UseAVX >= 2, "");7914InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7915int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7916emit_int16(0x58, (0xC0 | encode));7917}79187919void Assembler::vpbroadcastd(XMMRegister dst, Address src, int vector_len) {7920assert(VM_Version::supports_avx2(), "");7921assert(dst != xnoreg, "sanity");7922InstructionMark im(this);7923InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7924attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);7925// swap src<->dst for encoding7926vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7927emit_int8(0x58);7928emit_operand(dst, src);7929}79307931// duplicate 8-byte integer data from src into programmed locations in dest : requires AVX512VL7932void Assembler::vpbroadcastq(XMMRegister dst, XMMRegister src, int vector_len) {7933assert(VM_Version::supports_avx2(), "");7934InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7935attributes.set_rex_vex_w_reverted();7936int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7937emit_int16(0x59, (0xC0 | encode));7938}79397940void Assembler::vpbroadcastq(XMMRegister dst, Address src, int vector_len) {7941assert(VM_Version::supports_avx2(), "");7942assert(dst != xnoreg, "sanity");7943InstructionMark im(this);7944InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7945attributes.set_rex_vex_w_reverted();7946attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);7947// swap src<->dst for encoding7948vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7949emit_int8(0x59);7950emit_operand(dst, src);7951}79527953void Assembler::evbroadcasti32x4(XMMRegister dst, Address src, int vector_len) {7954assert(vector_len != Assembler::AVX_128bit, "");7955assert(VM_Version::supports_evex(), "");7956assert(dst != xnoreg, "sanity");7957InstructionMark im(this);7958InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7959attributes.set_rex_vex_w_reverted();7960attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);7961// swap src<->dst for encoding7962vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7963emit_int8(0x5A);7964emit_operand(dst, src);7965}79667967void Assembler::evbroadcasti64x2(XMMRegister dst, XMMRegister src, int vector_len) {7968assert(vector_len != Assembler::AVX_128bit, "");7969assert(VM_Version::supports_avx512dq(), "");7970InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7971attributes.set_rex_vex_w_reverted();7972int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7973emit_int16(0x5A, (0xC0 | encode));7974}79757976void Assembler::evbroadcasti64x2(XMMRegister dst, Address src, int vector_len) {7977assert(vector_len != Assembler::AVX_128bit, "");7978assert(VM_Version::supports_avx512dq(), "");7979assert(dst != xnoreg, "sanity");7980InstructionMark im(this);7981InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7982attributes.set_rex_vex_w_reverted();7983attributes.set_address_attributes(/* tuple_type */ EVEX_T2, /* input_size_in_bits */ EVEX_64bit);7984// swap src<->dst for encoding7985vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7986emit_int8(0x5A);7987emit_operand(dst, src);7988}79897990// scalar single/double precision replicate79917992// duplicate single precision data from src into programmed locations in dest : requires AVX512VL7993void Assembler::vbroadcastss(XMMRegister dst, XMMRegister src, int vector_len) {7994assert(VM_Version::supports_avx2(), "");7995InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7996int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7997emit_int16(0x18, (0xC0 | encode));7998}79998000void Assembler::vbroadcastss(XMMRegister dst, Address src, int vector_len) {8001assert(VM_Version::supports_avx(), "");8002assert(dst != xnoreg, "sanity");8003InstructionMark im(this);8004InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);8005attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);8006// swap src<->dst for encoding8007vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8008emit_int8(0x18);8009emit_operand(dst, src);8010}80118012// duplicate double precision data from src into programmed locations in dest : requires AVX512VL8013void Assembler::vbroadcastsd(XMMRegister dst, XMMRegister src, int vector_len) {8014assert(VM_Version::supports_avx2(), "");8015assert(vector_len == AVX_256bit || vector_len == AVX_512bit, "");8016InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);8017attributes.set_rex_vex_w_reverted();8018int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8019emit_int16(0x19, (0xC0 | encode));8020}80218022void Assembler::vbroadcastsd(XMMRegister dst, Address src, int vector_len) {8023assert(VM_Version::supports_avx(), "");8024assert(vector_len == AVX_256bit || vector_len == AVX_512bit, "");8025assert(dst != xnoreg, "sanity");8026InstructionMark im(this);8027InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);8028attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);8029attributes.set_rex_vex_w_reverted();8030// swap src<->dst for encoding8031vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8032emit_int8(0x19);8033emit_operand(dst, src);8034}80358036void Assembler::vbroadcastf128(XMMRegister dst, Address src, int vector_len) {8037assert(VM_Version::supports_avx(), "");8038assert(vector_len == AVX_256bit, "");8039assert(dst != xnoreg, "sanity");8040InstructionMark im(this);8041InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);8042attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);8043// swap src<->dst for encoding8044vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8045emit_int8(0x1A);8046emit_operand(dst, src);8047}80488049// gpr source broadcast forms80508051// duplicate 1-byte integer data from src into programmed locations in dest : requires AVX512BW and AVX512VL8052void Assembler::evpbroadcastb(XMMRegister dst, Register src, int vector_len) {8053assert(VM_Version::supports_avx512bw(), "");8054InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);8055attributes.set_is_evex_instruction();8056int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8057emit_int16(0x7A, (0xC0 | encode));8058}80598060// duplicate 2-byte integer data from src into programmed locations in dest : requires AVX512BW and AVX512VL8061void Assembler::evpbroadcastw(XMMRegister dst, Register src, int vector_len) {8062assert(VM_Version::supports_avx512bw(), "");8063InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);8064attributes.set_is_evex_instruction();8065int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8066emit_int16(0x7B, (0xC0 | encode));8067}80688069// duplicate 4-byte integer data from src into programmed locations in dest : requires AVX512VL8070void Assembler::evpbroadcastd(XMMRegister dst, Register src, int vector_len) {8071assert(VM_Version::supports_evex(), "");8072InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);8073attributes.set_is_evex_instruction();8074int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8075emit_int16(0x7C, (0xC0 | encode));8076}80778078// duplicate 8-byte integer data from src into programmed locations in dest : requires AVX512VL8079void Assembler::evpbroadcastq(XMMRegister dst, Register src, int vector_len) {8080assert(VM_Version::supports_evex(), "");8081InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);8082attributes.set_is_evex_instruction();8083int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8084emit_int16(0x7C, (0xC0 | encode));8085}80868087void Assembler::vpgatherdd(XMMRegister dst, Address src, XMMRegister mask, int vector_len) {8088assert(VM_Version::supports_avx2(), "");8089assert(vector_len == Assembler::AVX_128bit || vector_len == Assembler::AVX_256bit, "");8090assert(dst != xnoreg, "sanity");8091assert(src.isxmmindex(),"expected to be xmm index");8092assert(dst != src.xmmindex(), "instruction will #UD if dst and index are the same");8093InstructionMark im(this);8094InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);8095vex_prefix(src, mask->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8096emit_int8((unsigned char)0x90);8097emit_operand(dst, src);8098}80998100void Assembler::vpgatherdq(XMMRegister dst, Address src, XMMRegister mask, int vector_len) {8101assert(VM_Version::supports_avx2(), "");8102assert(vector_len == Assembler::AVX_128bit || vector_len == Assembler::AVX_256bit, "");8103assert(dst != xnoreg, "sanity");8104assert(src.isxmmindex(),"expected to be xmm index");8105assert(dst != src.xmmindex(), "instruction will #UD if dst and index are the same");8106InstructionMark im(this);8107InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);8108vex_prefix(src, mask->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8109emit_int8((unsigned char)0x90);8110emit_operand(dst, src);8111}81128113void Assembler::vgatherdpd(XMMRegister dst, Address src, XMMRegister mask, int vector_len) {8114assert(VM_Version::supports_avx2(), "");8115assert(vector_len == Assembler::AVX_128bit || vector_len == Assembler::AVX_256bit, "");8116assert(dst != xnoreg, "sanity");8117assert(src.isxmmindex(),"expected to be xmm index");8118assert(dst != src.xmmindex(), "instruction will #UD if dst and index are the same");8119InstructionMark im(this);8120InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);8121vex_prefix(src, mask->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8122emit_int8((unsigned char)0x92);8123emit_operand(dst, src);8124}81258126void Assembler::vgatherdps(XMMRegister dst, Address src, XMMRegister mask, int vector_len) {8127assert(VM_Version::supports_avx2(), "");8128assert(vector_len == Assembler::AVX_128bit || vector_len == Assembler::AVX_256bit, "");8129assert(dst != xnoreg, "sanity");8130assert(src.isxmmindex(),"expected to be xmm index");8131assert(dst != src.xmmindex(), "instruction will #UD if dst and index are the same");8132InstructionMark im(this);8133InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ true);8134vex_prefix(src, mask->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8135emit_int8((unsigned char)0x92);8136emit_operand(dst, src);8137}8138void Assembler::evpgatherdd(XMMRegister dst, KRegister mask, Address src, int vector_len) {8139assert(VM_Version::supports_evex(), "");8140assert(dst != xnoreg, "sanity");8141assert(src.isxmmindex(),"expected to be xmm index");8142assert(dst != src.xmmindex(), "instruction will #UD if dst and index are the same");8143assert(mask != k0, "instruction will #UD if mask is in k0");8144InstructionMark im(this);8145InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);8146attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);8147attributes.reset_is_clear_context();8148attributes.set_embedded_opmask_register_specifier(mask);8149attributes.set_is_evex_instruction();8150// swap src<->dst for encoding8151vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8152emit_int8((unsigned char)0x90);8153emit_operand(dst, src);8154}81558156void Assembler::evpgatherdq(XMMRegister dst, KRegister mask, Address src, int vector_len) {8157assert(VM_Version::supports_evex(), "");8158assert(dst != xnoreg, "sanity");8159assert(src.isxmmindex(),"expected to be xmm index");8160assert(dst != src.xmmindex(), "instruction will #UD if dst and index are the same");8161assert(mask != k0, "instruction will #UD if mask is in k0");8162InstructionMark im(this);8163InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);8164attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);8165attributes.reset_is_clear_context();8166attributes.set_embedded_opmask_register_specifier(mask);8167attributes.set_is_evex_instruction();8168// swap src<->dst for encoding8169vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8170emit_int8((unsigned char)0x90);8171emit_operand(dst, src);8172}81738174void Assembler::evgatherdpd(XMMRegister dst, KRegister mask, Address src, int vector_len) {8175assert(VM_Version::supports_evex(), "");8176assert(dst != xnoreg, "sanity");8177assert(src.isxmmindex(),"expected to be xmm index");8178assert(dst != src.xmmindex(), "instruction will #UD if dst and index are the same");8179assert(mask != k0, "instruction will #UD if mask is in k0");8180InstructionMark im(this);8181InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);8182attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);8183attributes.reset_is_clear_context();8184attributes.set_embedded_opmask_register_specifier(mask);8185attributes.set_is_evex_instruction();8186// swap src<->dst for encoding8187vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8188emit_int8((unsigned char)0x92);8189emit_operand(dst, src);8190}81918192void Assembler::evgatherdps(XMMRegister dst, KRegister mask, Address src, int vector_len) {8193assert(VM_Version::supports_evex(), "");8194assert(dst != xnoreg, "sanity");8195assert(src.isxmmindex(),"expected to be xmm index");8196assert(dst != src.xmmindex(), "instruction will #UD if dst and index are the same");8197assert(mask != k0, "instruction will #UD if mask is in k0");8198InstructionMark im(this);8199InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);8200attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);8201attributes.reset_is_clear_context();8202attributes.set_embedded_opmask_register_specifier(mask);8203attributes.set_is_evex_instruction();8204// swap src<->dst for encoding8205vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8206emit_int8((unsigned char)0x92);8207emit_operand(dst, src);8208}82098210void Assembler::evpscatterdd(Address dst, KRegister mask, XMMRegister src, int vector_len) {8211assert(VM_Version::supports_evex(), "");8212assert(mask != k0, "instruction will #UD if mask is in k0");8213InstructionMark im(this);8214InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);8215attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);8216attributes.reset_is_clear_context();8217attributes.set_embedded_opmask_register_specifier(mask);8218attributes.set_is_evex_instruction();8219vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8220emit_int8((unsigned char)0xA0);8221emit_operand(src, dst);8222}82238224void Assembler::evpscatterdq(Address dst, KRegister mask, XMMRegister src, int vector_len) {8225assert(VM_Version::supports_evex(), "");8226assert(mask != k0, "instruction will #UD if mask is in k0");8227InstructionMark im(this);8228InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);8229attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);8230attributes.reset_is_clear_context();8231attributes.set_embedded_opmask_register_specifier(mask);8232attributes.set_is_evex_instruction();8233vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8234emit_int8((unsigned char)0xA0);8235emit_operand(src, dst);8236}82378238void Assembler::evscatterdps(Address dst, KRegister mask, XMMRegister src, int vector_len) {8239assert(VM_Version::supports_evex(), "");8240assert(mask != k0, "instruction will #UD if mask is in k0");8241InstructionMark im(this);8242InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);8243attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);8244attributes.reset_is_clear_context();8245attributes.set_embedded_opmask_register_specifier(mask);8246attributes.set_is_evex_instruction();8247vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8248emit_int8((unsigned char)0xA2);8249emit_operand(src, dst);8250}82518252void Assembler::evscatterdpd(Address dst, KRegister mask, XMMRegister src, int vector_len) {8253assert(VM_Version::supports_evex(), "");8254assert(mask != k0, "instruction will #UD if mask is in k0");8255InstructionMark im(this);8256InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);8257attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);8258attributes.reset_is_clear_context();8259attributes.set_embedded_opmask_register_specifier(mask);8260attributes.set_is_evex_instruction();8261vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8262emit_int8((unsigned char)0xA2);8263emit_operand(src, dst);8264}8265// Carry-Less Multiplication Quadword8266void Assembler::pclmulqdq(XMMRegister dst, XMMRegister src, int mask) {8267assert(VM_Version::supports_clmul(), "");8268InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);8269int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);8270emit_int24(0x44, (0xC0 | encode), (unsigned char)mask);8271}82728273// Carry-Less Multiplication Quadword8274void Assembler::vpclmulqdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int mask) {8275assert(VM_Version::supports_avx() && VM_Version::supports_clmul(), "");8276InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);8277int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);8278emit_int24(0x44, (0xC0 | encode), (unsigned char)mask);8279}82808281void Assembler::evpclmulqdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int mask, int vector_len) {8282assert(VM_Version::supports_avx512_vpclmulqdq(), "Requires vector carryless multiplication support");8283InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);8284attributes.set_is_evex_instruction();8285int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);8286emit_int24(0x44, (0xC0 | encode), (unsigned char)mask);8287}82888289void Assembler::vzeroupper_uncached() {8290if (VM_Version::supports_vzeroupper()) {8291InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);8292(void)vex_prefix_and_encode(0, 0, 0, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);8293emit_int8(0x77);8294}8295}82968297void Assembler::fld_x(Address adr) {8298InstructionMark im(this);8299emit_int8((unsigned char)0xDB);8300emit_operand32(rbp, adr);8301}83028303void Assembler::fstp_x(Address adr) {8304InstructionMark im(this);8305emit_int8((unsigned char)0xDB);8306emit_operand32(rdi, adr);8307}83088309void Assembler::emit_operand32(Register reg, Address adr) {8310assert(reg->encoding() < 8, "no extended registers");8311assert(!adr.base_needs_rex() && !adr.index_needs_rex(), "no extended registers");8312emit_operand(reg, adr._base, adr._index, adr._scale, adr._disp,8313adr._rspec);8314}83158316#ifndef _LP648317// 32bit only pieces of the assembler83188319void Assembler::emms() {8320NOT_LP64(assert(VM_Version::supports_mmx(), ""));8321emit_int16(0x0F, 0x77);8322}83238324void Assembler::vzeroupper() {8325vzeroupper_uncached();8326}83278328void Assembler::cmp_literal32(Register src1, int32_t imm32, RelocationHolder const& rspec) {8329// NO PREFIX AS NEVER 64BIT8330InstructionMark im(this);8331emit_int16((unsigned char)0x81, (0xF8 | src1->encoding()));8332emit_data(imm32, rspec, 0);8333}83348335void Assembler::cmp_literal32(Address src1, int32_t imm32, RelocationHolder const& rspec) {8336// NO PREFIX AS NEVER 64BIT (not even 32bit versions of 64bit regs8337InstructionMark im(this);8338emit_int8((unsigned char)0x81);8339emit_operand(rdi, src1);8340emit_data(imm32, rspec, 0);8341}83428343// The 64-bit (32bit platform) cmpxchg compares the value at adr with the contents of rdx:rax,8344// and stores rcx:rbx into adr if so; otherwise, the value at adr is loaded8345// into rdx:rax. The ZF is set if the compared values were equal, and cleared otherwise.8346void Assembler::cmpxchg8(Address adr) {8347InstructionMark im(this);8348emit_int16(0x0F, (unsigned char)0xC7);8349emit_operand(rcx, adr);8350}83518352void Assembler::decl(Register dst) {8353// Don't use it directly. Use MacroAssembler::decrementl() instead.8354emit_int8(0x48 | dst->encoding());8355}83568357// 64bit doesn't use the x8783588359void Assembler::emit_farith(int b1, int b2, int i) {8360assert(isByte(b1) && isByte(b2), "wrong opcode");8361assert(0 <= i && i < 8, "illegal stack offset");8362emit_int16(b1, b2 + i);8363}83648365void Assembler::fabs() {8366emit_int16((unsigned char)0xD9, (unsigned char)0xE1);8367}83688369void Assembler::fadd(int i) {8370emit_farith(0xD8, 0xC0, i);8371}83728373void Assembler::fadd_d(Address src) {8374InstructionMark im(this);8375emit_int8((unsigned char)0xDC);8376emit_operand32(rax, src);8377}83788379void Assembler::fadd_s(Address src) {8380InstructionMark im(this);8381emit_int8((unsigned char)0xD8);8382emit_operand32(rax, src);8383}83848385void Assembler::fadda(int i) {8386emit_farith(0xDC, 0xC0, i);8387}83888389void Assembler::faddp(int i) {8390emit_farith(0xDE, 0xC0, i);8391}83928393void Assembler::fchs() {8394emit_int16((unsigned char)0xD9, (unsigned char)0xE0);8395}83968397void Assembler::fcom(int i) {8398emit_farith(0xD8, 0xD0, i);8399}84008401void Assembler::fcomp(int i) {8402emit_farith(0xD8, 0xD8, i);8403}84048405void Assembler::fcomp_d(Address src) {8406InstructionMark im(this);8407emit_int8((unsigned char)0xDC);8408emit_operand32(rbx, src);8409}84108411void Assembler::fcomp_s(Address src) {8412InstructionMark im(this);8413emit_int8((unsigned char)0xD8);8414emit_operand32(rbx, src);8415}84168417void Assembler::fcompp() {8418emit_int16((unsigned char)0xDE, (unsigned char)0xD9);8419}84208421void Assembler::fcos() {8422emit_int16((unsigned char)0xD9, (unsigned char)0xFF);8423}84248425void Assembler::fdecstp() {8426emit_int16((unsigned char)0xD9, (unsigned char)0xF6);8427}84288429void Assembler::fdiv(int i) {8430emit_farith(0xD8, 0xF0, i);8431}84328433void Assembler::fdiv_d(Address src) {8434InstructionMark im(this);8435emit_int8((unsigned char)0xDC);8436emit_operand32(rsi, src);8437}84388439void Assembler::fdiv_s(Address src) {8440InstructionMark im(this);8441emit_int8((unsigned char)0xD8);8442emit_operand32(rsi, src);8443}84448445void Assembler::fdiva(int i) {8446emit_farith(0xDC, 0xF8, i);8447}84488449// Note: The Intel manual (Pentium Processor User's Manual, Vol.3, 1994)8450// is erroneous for some of the floating-point instructions below.84518452void Assembler::fdivp(int i) {8453emit_farith(0xDE, 0xF8, i); // ST(0) <- ST(0) / ST(1) and pop (Intel manual wrong)8454}84558456void Assembler::fdivr(int i) {8457emit_farith(0xD8, 0xF8, i);8458}84598460void Assembler::fdivr_d(Address src) {8461InstructionMark im(this);8462emit_int8((unsigned char)0xDC);8463emit_operand32(rdi, src);8464}84658466void Assembler::fdivr_s(Address src) {8467InstructionMark im(this);8468emit_int8((unsigned char)0xD8);8469emit_operand32(rdi, src);8470}84718472void Assembler::fdivra(int i) {8473emit_farith(0xDC, 0xF0, i);8474}84758476void Assembler::fdivrp(int i) {8477emit_farith(0xDE, 0xF0, i); // ST(0) <- ST(1) / ST(0) and pop (Intel manual wrong)8478}84798480void Assembler::ffree(int i) {8481emit_farith(0xDD, 0xC0, i);8482}84838484void Assembler::fild_d(Address adr) {8485InstructionMark im(this);8486emit_int8((unsigned char)0xDF);8487emit_operand32(rbp, adr);8488}84898490void Assembler::fild_s(Address adr) {8491InstructionMark im(this);8492emit_int8((unsigned char)0xDB);8493emit_operand32(rax, adr);8494}84958496void Assembler::fincstp() {8497emit_int16((unsigned char)0xD9, (unsigned char)0xF7);8498}84998500void Assembler::finit() {8501emit_int24((unsigned char)0x9B, (unsigned char)0xDB, (unsigned char)0xE3);8502}85038504void Assembler::fist_s(Address adr) {8505InstructionMark im(this);8506emit_int8((unsigned char)0xDB);8507emit_operand32(rdx, adr);8508}85098510void Assembler::fistp_d(Address adr) {8511InstructionMark im(this);8512emit_int8((unsigned char)0xDF);8513emit_operand32(rdi, adr);8514}85158516void Assembler::fistp_s(Address adr) {8517InstructionMark im(this);8518emit_int8((unsigned char)0xDB);8519emit_operand32(rbx, adr);8520}85218522void Assembler::fld1() {8523emit_int16((unsigned char)0xD9, (unsigned char)0xE8);8524}85258526void Assembler::fld_d(Address adr) {8527InstructionMark im(this);8528emit_int8((unsigned char)0xDD);8529emit_operand32(rax, adr);8530}85318532void Assembler::fld_s(Address adr) {8533InstructionMark im(this);8534emit_int8((unsigned char)0xD9);8535emit_operand32(rax, adr);8536}853785388539void Assembler::fld_s(int index) {8540emit_farith(0xD9, 0xC0, index);8541}85428543void Assembler::fldcw(Address src) {8544InstructionMark im(this);8545emit_int8((unsigned char)0xD9);8546emit_operand32(rbp, src);8547}85488549void Assembler::fldenv(Address src) {8550InstructionMark im(this);8551emit_int8((unsigned char)0xD9);8552emit_operand32(rsp, src);8553}85548555void Assembler::fldlg2() {8556emit_int16((unsigned char)0xD9, (unsigned char)0xEC);8557}85588559void Assembler::fldln2() {8560emit_int16((unsigned char)0xD9, (unsigned char)0xED);8561}85628563void Assembler::fldz() {8564emit_int16((unsigned char)0xD9, (unsigned char)0xEE);8565}85668567void Assembler::flog() {8568fldln2();8569fxch();8570fyl2x();8571}85728573void Assembler::flog10() {8574fldlg2();8575fxch();8576fyl2x();8577}85788579void Assembler::fmul(int i) {8580emit_farith(0xD8, 0xC8, i);8581}85828583void Assembler::fmul_d(Address src) {8584InstructionMark im(this);8585emit_int8((unsigned char)0xDC);8586emit_operand32(rcx, src);8587}85888589void Assembler::fmul_s(Address src) {8590InstructionMark im(this);8591emit_int8((unsigned char)0xD8);8592emit_operand32(rcx, src);8593}85948595void Assembler::fmula(int i) {8596emit_farith(0xDC, 0xC8, i);8597}85988599void Assembler::fmulp(int i) {8600emit_farith(0xDE, 0xC8, i);8601}86028603void Assembler::fnsave(Address dst) {8604InstructionMark im(this);8605emit_int8((unsigned char)0xDD);8606emit_operand32(rsi, dst);8607}86088609void Assembler::fnstcw(Address src) {8610InstructionMark im(this);8611emit_int16((unsigned char)0x9B, (unsigned char)0xD9);8612emit_operand32(rdi, src);8613}86148615void Assembler::fnstsw_ax() {8616emit_int16((unsigned char)0xDF, (unsigned char)0xE0);8617}86188619void Assembler::fprem() {8620emit_int16((unsigned char)0xD9, (unsigned char)0xF8);8621}86228623void Assembler::fprem1() {8624emit_int16((unsigned char)0xD9, (unsigned char)0xF5);8625}86268627void Assembler::frstor(Address src) {8628InstructionMark im(this);8629emit_int8((unsigned char)0xDD);8630emit_operand32(rsp, src);8631}86328633void Assembler::fsin() {8634emit_int16((unsigned char)0xD9, (unsigned char)0xFE);8635}86368637void Assembler::fsqrt() {8638emit_int16((unsigned char)0xD9, (unsigned char)0xFA);8639}86408641void Assembler::fst_d(Address adr) {8642InstructionMark im(this);8643emit_int8((unsigned char)0xDD);8644emit_operand32(rdx, adr);8645}86468647void Assembler::fst_s(Address adr) {8648InstructionMark im(this);8649emit_int8((unsigned char)0xD9);8650emit_operand32(rdx, adr);8651}86528653void Assembler::fstp_d(Address adr) {8654InstructionMark im(this);8655emit_int8((unsigned char)0xDD);8656emit_operand32(rbx, adr);8657}86588659void Assembler::fstp_d(int index) {8660emit_farith(0xDD, 0xD8, index);8661}86628663void Assembler::fstp_s(Address adr) {8664InstructionMark im(this);8665emit_int8((unsigned char)0xD9);8666emit_operand32(rbx, adr);8667}86688669void Assembler::fsub(int i) {8670emit_farith(0xD8, 0xE0, i);8671}86728673void Assembler::fsub_d(Address src) {8674InstructionMark im(this);8675emit_int8((unsigned char)0xDC);8676emit_operand32(rsp, src);8677}86788679void Assembler::fsub_s(Address src) {8680InstructionMark im(this);8681emit_int8((unsigned char)0xD8);8682emit_operand32(rsp, src);8683}86848685void Assembler::fsuba(int i) {8686emit_farith(0xDC, 0xE8, i);8687}86888689void Assembler::fsubp(int i) {8690emit_farith(0xDE, 0xE8, i); // ST(0) <- ST(0) - ST(1) and pop (Intel manual wrong)8691}86928693void Assembler::fsubr(int i) {8694emit_farith(0xD8, 0xE8, i);8695}86968697void Assembler::fsubr_d(Address src) {8698InstructionMark im(this);8699emit_int8((unsigned char)0xDC);8700emit_operand32(rbp, src);8701}87028703void Assembler::fsubr_s(Address src) {8704InstructionMark im(this);8705emit_int8((unsigned char)0xD8);8706emit_operand32(rbp, src);8707}87088709void Assembler::fsubra(int i) {8710emit_farith(0xDC, 0xE0, i);8711}87128713void Assembler::fsubrp(int i) {8714emit_farith(0xDE, 0xE0, i); // ST(0) <- ST(1) - ST(0) and pop (Intel manual wrong)8715}87168717void Assembler::ftan() {8718emit_int32((unsigned char)0xD9, (unsigned char)0xF2, (unsigned char)0xDD, (unsigned char)0xD8);8719}87208721void Assembler::ftst() {8722emit_int16((unsigned char)0xD9, (unsigned char)0xE4);8723}87248725void Assembler::fucomi(int i) {8726// make sure the instruction is supported (introduced for P6, together with cmov)8727guarantee(VM_Version::supports_cmov(), "illegal instruction");8728emit_farith(0xDB, 0xE8, i);8729}87308731void Assembler::fucomip(int i) {8732// make sure the instruction is supported (introduced for P6, together with cmov)8733guarantee(VM_Version::supports_cmov(), "illegal instruction");8734emit_farith(0xDF, 0xE8, i);8735}87368737void Assembler::fwait() {8738emit_int8((unsigned char)0x9B);8739}87408741void Assembler::fxch(int i) {8742emit_farith(0xD9, 0xC8, i);8743}87448745void Assembler::fyl2x() {8746emit_int16((unsigned char)0xD9, (unsigned char)0xF1);8747}87488749void Assembler::frndint() {8750emit_int16((unsigned char)0xD9, (unsigned char)0xFC);8751}87528753void Assembler::f2xm1() {8754emit_int16((unsigned char)0xD9, (unsigned char)0xF0);8755}87568757void Assembler::fldl2e() {8758emit_int16((unsigned char)0xD9, (unsigned char)0xEA);8759}8760#endif // !_LP6487618762// SSE SIMD prefix byte values corresponding to VexSimdPrefix encoding.8763static int simd_pre[4] = { 0, 0x66, 0xF3, 0xF2 };8764// SSE opcode second byte values (first is 0x0F) corresponding to VexOpcode encoding.8765static int simd_opc[4] = { 0, 0, 0x38, 0x3A };87668767// Generate SSE legacy REX prefix and SIMD opcode based on VEX encoding.8768void Assembler::rex_prefix(Address adr, XMMRegister xreg, VexSimdPrefix pre, VexOpcode opc, bool rex_w) {8769if (pre > 0) {8770emit_int8(simd_pre[pre]);8771}8772if (rex_w) {8773prefixq(adr, xreg);8774} else {8775prefix(adr, xreg);8776}8777if (opc > 0) {8778emit_int8(0x0F);8779int opc2 = simd_opc[opc];8780if (opc2 > 0) {8781emit_int8(opc2);8782}8783}8784}87858786int Assembler::rex_prefix_and_encode(int dst_enc, int src_enc, VexSimdPrefix pre, VexOpcode opc, bool rex_w) {8787if (pre > 0) {8788emit_int8(simd_pre[pre]);8789}8790int encode = (rex_w) ? prefixq_and_encode(dst_enc, src_enc) : prefix_and_encode(dst_enc, src_enc);8791if (opc > 0) {8792emit_int8(0x0F);8793int opc2 = simd_opc[opc];8794if (opc2 > 0) {8795emit_int8(opc2);8796}8797}8798return encode;8799}880088018802void Assembler::vex_prefix(bool vex_r, bool vex_b, bool vex_x, int nds_enc, VexSimdPrefix pre, VexOpcode opc) {8803int vector_len = _attributes->get_vector_len();8804bool vex_w = _attributes->is_rex_vex_w();8805if (vex_b || vex_x || vex_w || (opc == VEX_OPCODE_0F_38) || (opc == VEX_OPCODE_0F_3A)) {8806int byte1 = (vex_r ? VEX_R : 0) | (vex_x ? VEX_X : 0) | (vex_b ? VEX_B : 0);8807byte1 = (~byte1) & 0xE0;8808byte1 |= opc;88098810int byte2 = ((~nds_enc) & 0xf) << 3;8811byte2 |= (vex_w ? VEX_W : 0) | ((vector_len > 0) ? 4 : 0) | pre;88128813emit_int24((unsigned char)VEX_3bytes, byte1, byte2);8814} else {8815int byte1 = vex_r ? VEX_R : 0;8816byte1 = (~byte1) & 0x80;8817byte1 |= ((~nds_enc) & 0xf) << 3;8818byte1 |= ((vector_len > 0 ) ? 4 : 0) | pre;8819emit_int16((unsigned char)VEX_2bytes, byte1);8820}8821}88228823// This is a 4 byte encoding8824void Assembler::evex_prefix(bool vex_r, bool vex_b, bool vex_x, bool evex_r, bool evex_v, int nds_enc, VexSimdPrefix pre, VexOpcode opc){8825// EVEX 0x62 prefix8826// byte1 = EVEX_4bytes;88278828bool vex_w = _attributes->is_rex_vex_w();8829int evex_encoding = (vex_w ? VEX_W : 0);8830// EVEX.b is not currently used for broadcast of single element or data rounding modes8831_attributes->set_evex_encoding(evex_encoding);88328833// P0: byte 2, initialized to RXBR`00mm8834// instead of not'd8835int byte2 = (vex_r ? VEX_R : 0) | (vex_x ? VEX_X : 0) | (vex_b ? VEX_B : 0) | (evex_r ? EVEX_Rb : 0);8836byte2 = (~byte2) & 0xF0;8837// confine opc opcode extensions in mm bits to lower two bits8838// of form {0F, 0F_38, 0F_3A}8839byte2 |= opc;88408841// P1: byte 3 as Wvvvv1pp8842int byte3 = ((~nds_enc) & 0xf) << 3;8843// p[10] is always 18844byte3 |= EVEX_F;8845byte3 |= (vex_w & 1) << 7;8846// confine pre opcode extensions in pp bits to lower two bits8847// of form {66, F3, F2}8848byte3 |= pre;88498850// P2: byte 4 as zL'Lbv'aaa8851// kregs are implemented in the low 3 bits as aaa8852int byte4 = (_attributes->is_no_reg_mask()) ?88530 :8854_attributes->get_embedded_opmask_register_specifier();8855// EVEX.v` for extending EVEX.vvvv or VIDX8856byte4 |= (evex_v ? 0: EVEX_V);8857// third EXEC.b for broadcast actions8858byte4 |= (_attributes->is_extended_context() ? EVEX_Rb : 0);8859// fourth EVEX.L'L for vector length : 0 is 128, 1 is 256, 2 is 512, currently we do not support 10248860byte4 |= ((_attributes->get_vector_len())& 0x3) << 5;8861// last is EVEX.z for zero/merge actions8862if (_attributes->is_no_reg_mask() == false &&8863_attributes->get_embedded_opmask_register_specifier() != 0) {8864byte4 |= (_attributes->is_clear_context() ? EVEX_Z : 0);8865}88668867emit_int32(EVEX_4bytes, byte2, byte3, byte4);8868}88698870void Assembler::vex_prefix(Address adr, int nds_enc, int xreg_enc, VexSimdPrefix pre, VexOpcode opc, InstructionAttr *attributes) {8871bool vex_r = (xreg_enc & 8) == 8;8872bool vex_b = adr.base_needs_rex();8873bool vex_x;8874if (adr.isxmmindex()) {8875vex_x = adr.xmmindex_needs_rex();8876} else {8877vex_x = adr.index_needs_rex();8878}8879set_attributes(attributes);8880attributes->set_current_assembler(this);88818882// For EVEX instruction (which is not marked as pure EVEX instruction) check and see if this instruction8883// is allowed in legacy mode and has resources which will fit in it.8884// Pure EVEX instructions will have is_evex_instruction set in their definition.8885if (!attributes->is_legacy_mode()) {8886if (UseAVX > 2 && !attributes->is_evex_instruction() && !is_managed()) {8887if ((attributes->get_vector_len() != AVX_512bit) && (nds_enc < 16) && (xreg_enc < 16)) {8888attributes->set_is_legacy_mode();8889}8890}8891}88928893if (UseAVX > 2) {8894assert(((!attributes->uses_vl()) ||8895(attributes->get_vector_len() == AVX_512bit) ||8896(!_legacy_mode_vl) ||8897(attributes->is_legacy_mode())),"XMM register should be 0-15");8898assert(((nds_enc < 16 && xreg_enc < 16) || (!attributes->is_legacy_mode())),"XMM register should be 0-15");8899}89008901clear_managed();8902if (UseAVX > 2 && !attributes->is_legacy_mode())8903{8904bool evex_r = (xreg_enc >= 16);8905bool evex_v;8906// EVEX.V' is set to true when VSIB is used as we may need to use higher order XMM registers (16-31)8907if (adr.isxmmindex()) {8908evex_v = ((adr._xmmindex->encoding() > 15) ? true : false);8909} else {8910evex_v = (nds_enc >= 16);8911}8912attributes->set_is_evex_instruction();8913evex_prefix(vex_r, vex_b, vex_x, evex_r, evex_v, nds_enc, pre, opc);8914} else {8915if (UseAVX > 2 && attributes->is_rex_vex_w_reverted()) {8916attributes->set_rex_vex_w(false);8917}8918vex_prefix(vex_r, vex_b, vex_x, nds_enc, pre, opc);8919}8920}89218922int Assembler::vex_prefix_and_encode(int dst_enc, int nds_enc, int src_enc, VexSimdPrefix pre, VexOpcode opc, InstructionAttr *attributes) {8923bool vex_r = (dst_enc & 8) == 8;8924bool vex_b = (src_enc & 8) == 8;8925bool vex_x = false;8926set_attributes(attributes);8927attributes->set_current_assembler(this);89288929// For EVEX instruction (which is not marked as pure EVEX instruction) check and see if this instruction8930// is allowed in legacy mode and has resources which will fit in it.8931// Pure EVEX instructions will have is_evex_instruction set in their definition.8932if (!attributes->is_legacy_mode()) {8933if (UseAVX > 2 && !attributes->is_evex_instruction() && !is_managed()) {8934if ((!attributes->uses_vl() || (attributes->get_vector_len() != AVX_512bit)) &&8935(dst_enc < 16) && (nds_enc < 16) && (src_enc < 16)) {8936attributes->set_is_legacy_mode();8937}8938}8939}89408941if (UseAVX > 2) {8942// All the scalar fp instructions (with uses_vl as false) can have legacy_mode as false8943// Instruction with uses_vl true are vector instructions8944// All the vector instructions with AVX_512bit length can have legacy_mode as false8945// All the vector instructions with < AVX_512bit length can have legacy_mode as false if AVX512vl() is supported8946// Rest all should have legacy_mode set as true8947assert(((!attributes->uses_vl()) ||8948(attributes->get_vector_len() == AVX_512bit) ||8949(!_legacy_mode_vl) ||8950(attributes->is_legacy_mode())),"XMM register should be 0-15");8951// Instruction with legacy_mode true should have dst, nds and src < 158952assert(((dst_enc < 16 && nds_enc < 16 && src_enc < 16) || (!attributes->is_legacy_mode())),"XMM register should be 0-15");8953}89548955clear_managed();8956if (UseAVX > 2 && !attributes->is_legacy_mode())8957{8958bool evex_r = (dst_enc >= 16);8959bool evex_v = (nds_enc >= 16);8960// can use vex_x as bank extender on rm encoding8961vex_x = (src_enc >= 16);8962attributes->set_is_evex_instruction();8963evex_prefix(vex_r, vex_b, vex_x, evex_r, evex_v, nds_enc, pre, opc);8964} else {8965if (UseAVX > 2 && attributes->is_rex_vex_w_reverted()) {8966attributes->set_rex_vex_w(false);8967}8968vex_prefix(vex_r, vex_b, vex_x, nds_enc, pre, opc);8969}89708971// return modrm byte components for operands8972return (((dst_enc & 7) << 3) | (src_enc & 7));8973}897489758976void Assembler::simd_prefix(XMMRegister xreg, XMMRegister nds, Address adr, VexSimdPrefix pre,8977VexOpcode opc, InstructionAttr *attributes) {8978if (UseAVX > 0) {8979int xreg_enc = xreg->encoding();8980int nds_enc = nds->is_valid() ? nds->encoding() : 0;8981vex_prefix(adr, nds_enc, xreg_enc, pre, opc, attributes);8982} else {8983assert((nds == xreg) || (nds == xnoreg), "wrong sse encoding");8984rex_prefix(adr, xreg, pre, opc, attributes->is_rex_vex_w());8985}8986}89878988int Assembler::simd_prefix_and_encode(XMMRegister dst, XMMRegister nds, XMMRegister src, VexSimdPrefix pre,8989VexOpcode opc, InstructionAttr *attributes) {8990int dst_enc = dst->encoding();8991int src_enc = src->encoding();8992if (UseAVX > 0) {8993int nds_enc = nds->is_valid() ? nds->encoding() : 0;8994return vex_prefix_and_encode(dst_enc, nds_enc, src_enc, pre, opc, attributes);8995} else {8996assert((nds == dst) || (nds == src) || (nds == xnoreg), "wrong sse encoding");8997return rex_prefix_and_encode(dst_enc, src_enc, pre, opc, attributes->is_rex_vex_w());8998}8999}90009001void Assembler::vmaxss(XMMRegister dst, XMMRegister nds, XMMRegister src) {9002assert(VM_Version::supports_avx(), "");9003InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);9004int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);9005emit_int16(0x5F, (0xC0 | encode));9006}90079008void Assembler::vmaxsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {9009assert(VM_Version::supports_avx(), "");9010InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);9011attributes.set_rex_vex_w_reverted();9012int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);9013emit_int16(0x5F, (0xC0 | encode));9014}90159016void Assembler::vminss(XMMRegister dst, XMMRegister nds, XMMRegister src) {9017assert(VM_Version::supports_avx(), "");9018InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);9019int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);9020emit_int16(0x5D, (0xC0 | encode));9021}90229023void Assembler::vminsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {9024assert(VM_Version::supports_avx(), "");9025InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);9026attributes.set_rex_vex_w_reverted();9027int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);9028emit_int16(0x5D, (0xC0 | encode));9029}90309031void Assembler::vcmppd(XMMRegister dst, XMMRegister nds, XMMRegister src, int cop, int vector_len) {9032assert(VM_Version::supports_avx(), "");9033assert(vector_len <= AVX_256bit, "");9034InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);9035int encode = simd_prefix_and_encode(dst, nds, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);9036emit_int24((unsigned char)0xC2, (0xC0 | encode), (0xF & cop));9037}90389039void Assembler::blendvpb(XMMRegister dst, XMMRegister nds, XMMRegister src1, XMMRegister src2, int vector_len) {9040assert(VM_Version::supports_avx(), "");9041assert(vector_len <= AVX_256bit, "");9042InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);9043int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src1->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9044int src2_enc = src2->encoding();9045emit_int24(0x4C, (0xC0 | encode), (0xF0 & src2_enc << 4));9046}90479048void Assembler::vblendvpd(XMMRegister dst, XMMRegister nds, XMMRegister src1, XMMRegister src2, int vector_len) {9049assert(UseAVX > 0 && (vector_len == AVX_128bit || vector_len == AVX_256bit), "");9050assert(vector_len <= AVX_256bit, "");9051InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);9052int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src1->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9053int src2_enc = src2->encoding();9054emit_int24(0x4B, (0xC0 | encode), (0xF0 & src2_enc << 4));9055}90569057void Assembler::vpblendd(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8, int vector_len) {9058assert(VM_Version::supports_avx2(), "");9059assert(vector_len <= AVX_256bit, "");9060InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);9061int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9062emit_int24(0x02, (0xC0 | encode), (unsigned char)imm8);9063}90649065void Assembler::vcmpps(XMMRegister dst, XMMRegister nds, XMMRegister src, int comparison, int vector_len) {9066assert(VM_Version::supports_avx(), "");9067assert(vector_len <= AVX_256bit, "");9068InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);9069int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);9070emit_int24((unsigned char)0xC2, (0xC0 | encode), (unsigned char)comparison);9071}90729073void Assembler::evcmpps(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src,9074ComparisonPredicateFP comparison, int vector_len) {9075assert(VM_Version::supports_evex(), "");9076// Encoding: EVEX.NDS.XXX.0F.W0 C2 /r ib9077InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);9078attributes.set_is_evex_instruction();9079attributes.set_embedded_opmask_register_specifier(mask);9080attributes.reset_is_clear_context();9081int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);9082emit_int24((unsigned char)0xC2, (0xC0 | encode), comparison);9083}90849085void Assembler::evcmppd(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src,9086ComparisonPredicateFP comparison, int vector_len) {9087assert(VM_Version::supports_evex(), "");9088// Encoding: EVEX.NDS.XXX.66.0F.W1 C2 /r ib9089InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);9090attributes.set_is_evex_instruction();9091attributes.set_embedded_opmask_register_specifier(mask);9092attributes.reset_is_clear_context();9093int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);9094emit_int24((unsigned char)0xC2, (0xC0 | encode), comparison);9095}90969097void Assembler::blendvps(XMMRegister dst, XMMRegister src) {9098assert(VM_Version::supports_sse4_1(), "");9099assert(UseAVX <= 0, "sse encoding is inconsistent with avx encoding");9100InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9101int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9102emit_int16(0x14, (0xC0 | encode));9103}91049105void Assembler::blendvpd(XMMRegister dst, XMMRegister src) {9106assert(VM_Version::supports_sse4_1(), "");9107assert(UseAVX <= 0, "sse encoding is inconsistent with avx encoding");9108InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9109int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9110emit_int16(0x15, (0xC0 | encode));9111}91129113void Assembler::pblendvb(XMMRegister dst, XMMRegister src) {9114assert(VM_Version::supports_sse4_1(), "");9115assert(UseAVX <= 0, "sse encoding is inconsistent with avx encoding");9116InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9117int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9118emit_int16(0x10, (0xC0 | encode));9119}91209121void Assembler::vblendvps(XMMRegister dst, XMMRegister nds, XMMRegister src1, XMMRegister src2, int vector_len) {9122assert(UseAVX > 0 && (vector_len == AVX_128bit || vector_len == AVX_256bit), "");9123InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9124int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src1->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9125int src2_enc = src2->encoding();9126emit_int24(0x4A, (0xC0 | encode), (0xF0 & src2_enc << 4));9127}91289129void Assembler::vblendps(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8, int vector_len) {9130InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9131int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9132emit_int24(0x0C, (0xC0 | encode), imm8);9133}91349135void Assembler::vpcmpgtb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {9136assert(vector_len == AVX_128bit ? VM_Version::supports_avx() : VM_Version::supports_avx2(), "");9137assert(vector_len <= AVX_256bit, "evex encoding is different - has k register as dest");9138InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9139int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);9140emit_int16(0x64, (0xC0 | encode));9141}91429143void Assembler::vpcmpgtw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {9144assert(vector_len == AVX_128bit ? VM_Version::supports_avx() : VM_Version::supports_avx2(), "");9145assert(vector_len <= AVX_256bit, "evex encoding is different - has k register as dest");9146InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9147int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);9148emit_int16(0x65, (0xC0 | encode));9149}91509151void Assembler::vpcmpgtd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {9152assert(vector_len == AVX_128bit ? VM_Version::supports_avx() : VM_Version::supports_avx2(), "");9153assert(vector_len <= AVX_256bit, "evex encoding is different - has k register as dest");9154InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9155int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);9156emit_int16(0x66, (0xC0 | encode));9157}91589159void Assembler::vpcmpgtq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {9160assert(vector_len == AVX_128bit ? VM_Version::supports_avx() : VM_Version::supports_avx2(), "");9161assert(vector_len <= AVX_256bit, "evex encoding is different - has k register as dest");9162InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9163int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9164emit_int16(0x37, (0xC0 | encode));9165}91669167void Assembler::evpcmpd(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src,9168int comparison, bool is_signed, int vector_len) {9169assert(VM_Version::supports_evex(), "");9170assert(comparison >= Assembler::eq && comparison <= Assembler::_true, "");9171// Encoding: EVEX.NDS.XXX.66.0F3A.W0 1F /r ib9172InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);9173attributes.set_is_evex_instruction();9174attributes.set_embedded_opmask_register_specifier(mask);9175attributes.reset_is_clear_context();9176int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9177int opcode = is_signed ? 0x1F : 0x1E;9178emit_int24(opcode, (0xC0 | encode), comparison);9179}91809181void Assembler::evpcmpd(KRegister kdst, KRegister mask, XMMRegister nds, Address src,9182int comparison, bool is_signed, int vector_len) {9183assert(VM_Version::supports_evex(), "");9184assert(comparison >= Assembler::eq && comparison <= Assembler::_true, "");9185// Encoding: EVEX.NDS.XXX.66.0F3A.W0 1F /r ib9186InstructionMark im(this);9187InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);9188attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_NObit);9189attributes.set_is_evex_instruction();9190attributes.set_embedded_opmask_register_specifier(mask);9191attributes.reset_is_clear_context();9192int dst_enc = kdst->encoding();9193vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9194int opcode = is_signed ? 0x1F : 0x1E;9195emit_int8((unsigned char)opcode);9196emit_operand(as_Register(dst_enc), src);9197emit_int8((unsigned char)comparison);9198}91999200void Assembler::evpcmpq(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src,9201int comparison, bool is_signed, int vector_len) {9202assert(VM_Version::supports_evex(), "");9203assert(comparison >= Assembler::eq && comparison <= Assembler::_true, "");9204// Encoding: EVEX.NDS.XXX.66.0F3A.W1 1F /r ib9205InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);9206attributes.set_is_evex_instruction();9207attributes.set_embedded_opmask_register_specifier(mask);9208attributes.reset_is_clear_context();9209int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9210int opcode = is_signed ? 0x1F : 0x1E;9211emit_int24(opcode, (0xC0 | encode), comparison);9212}92139214void Assembler::evpcmpq(KRegister kdst, KRegister mask, XMMRegister nds, Address src,9215int comparison, bool is_signed, int vector_len) {9216assert(VM_Version::supports_evex(), "");9217assert(comparison >= Assembler::eq && comparison <= Assembler::_true, "");9218// Encoding: EVEX.NDS.XXX.66.0F3A.W1 1F /r ib9219InstructionMark im(this);9220InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);9221attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_NObit);9222attributes.set_is_evex_instruction();9223attributes.set_embedded_opmask_register_specifier(mask);9224attributes.reset_is_clear_context();9225int dst_enc = kdst->encoding();9226vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9227int opcode = is_signed ? 0x1F : 0x1E;9228emit_int8((unsigned char)opcode);9229emit_operand(as_Register(dst_enc), src);9230emit_int8((unsigned char)comparison);9231}92329233void Assembler::evpcmpb(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src,9234int comparison, bool is_signed, int vector_len) {9235assert(VM_Version::supports_evex(), "");9236assert(VM_Version::supports_avx512bw(), "");9237assert(comparison >= Assembler::eq && comparison <= Assembler::_true, "");9238// Encoding: EVEX.NDS.XXX.66.0F3A.W0 3F /r ib9239InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);9240attributes.set_is_evex_instruction();9241attributes.set_embedded_opmask_register_specifier(mask);9242attributes.reset_is_clear_context();9243int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9244int opcode = is_signed ? 0x3F : 0x3E;9245emit_int24(opcode, (0xC0 | encode), comparison);9246}92479248void Assembler::evpcmpb(KRegister kdst, KRegister mask, XMMRegister nds, Address src,9249int comparison, bool is_signed, int vector_len) {9250assert(VM_Version::supports_evex(), "");9251assert(VM_Version::supports_avx512bw(), "");9252assert(comparison >= Assembler::eq && comparison <= Assembler::_true, "");9253// Encoding: EVEX.NDS.XXX.66.0F3A.W0 3F /r ib9254InstructionMark im(this);9255InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);9256attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);9257attributes.set_is_evex_instruction();9258attributes.set_embedded_opmask_register_specifier(mask);9259attributes.reset_is_clear_context();9260int dst_enc = kdst->encoding();9261vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9262int opcode = is_signed ? 0x3F : 0x3E;9263emit_int8((unsigned char)opcode);9264emit_operand(as_Register(dst_enc), src);9265emit_int8((unsigned char)comparison);9266}92679268void Assembler::evpcmpw(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src,9269int comparison, bool is_signed, int vector_len) {9270assert(VM_Version::supports_evex(), "");9271assert(VM_Version::supports_avx512bw(), "");9272assert(comparison >= Assembler::eq && comparison <= Assembler::_true, "");9273// Encoding: EVEX.NDS.XXX.66.0F3A.W1 3F /r ib9274InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);9275attributes.set_is_evex_instruction();9276attributes.set_embedded_opmask_register_specifier(mask);9277attributes.reset_is_clear_context();9278int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9279int opcode = is_signed ? 0x3F : 0x3E;9280emit_int24(opcode, (0xC0 | encode), comparison);9281}92829283void Assembler::evpcmpw(KRegister kdst, KRegister mask, XMMRegister nds, Address src,9284int comparison, bool is_signed, int vector_len) {9285assert(VM_Version::supports_evex(), "");9286assert(VM_Version::supports_avx512bw(), "");9287assert(comparison >= Assembler::eq && comparison <= Assembler::_true, "");9288// Encoding: EVEX.NDS.XXX.66.0F3A.W1 3F /r ib9289InstructionMark im(this);9290InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);9291attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);9292attributes.set_is_evex_instruction();9293attributes.set_embedded_opmask_register_specifier(mask);9294attributes.reset_is_clear_context();9295int dst_enc = kdst->encoding();9296vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9297int opcode = is_signed ? 0x3F : 0x3E;9298emit_int8((unsigned char)opcode);9299emit_operand(as_Register(dst_enc), src);9300emit_int8((unsigned char)comparison);9301}93029303void Assembler::vpblendvb(XMMRegister dst, XMMRegister nds, XMMRegister src, XMMRegister mask, int vector_len) {9304assert(VM_Version::supports_avx(), "");9305InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9306int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9307int mask_enc = mask->encoding();9308emit_int24(0x4C, (0xC0 | encode), 0xF0 & mask_enc << 4);9309}93109311void Assembler::evblendmpd(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len) {9312assert(VM_Version::supports_evex(), "");9313// Encoding: EVEX.NDS.XXX.66.0F38.W1 65 /r9314InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);9315attributes.set_is_evex_instruction();9316attributes.set_embedded_opmask_register_specifier(mask);9317if (merge) {9318attributes.reset_is_clear_context();9319}9320int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9321emit_int16(0x65, (0xC0 | encode));9322}93239324void Assembler::evblendmps(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len) {9325assert(VM_Version::supports_evex(), "");9326// Encoding: EVEX.NDS.XXX.66.0F38.W0 65 /r9327InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);9328attributes.set_is_evex_instruction();9329attributes.set_embedded_opmask_register_specifier(mask);9330if (merge) {9331attributes.reset_is_clear_context();9332}9333int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9334emit_int16(0x65, (0xC0 | encode));9335}93369337void Assembler::evpblendmb (XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len) {9338assert(VM_Version::supports_evex(), "");9339assert(VM_Version::supports_avx512bw(), "");9340// Encoding: EVEX.NDS.512.66.0F38.W0 66 /r9341InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);9342attributes.set_is_evex_instruction();9343attributes.set_embedded_opmask_register_specifier(mask);9344if (merge) {9345attributes.reset_is_clear_context();9346}9347int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9348emit_int16(0x66, (0xC0 | encode));9349}93509351void Assembler::evpblendmw (XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len) {9352assert(VM_Version::supports_evex(), "");9353assert(VM_Version::supports_avx512bw(), "");9354// Encoding: EVEX.NDS.512.66.0F38.W1 66 /r9355InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);9356attributes.set_is_evex_instruction();9357attributes.set_embedded_opmask_register_specifier(mask);9358if (merge) {9359attributes.reset_is_clear_context();9360}9361int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9362emit_int16(0x66, (0xC0 | encode));9363}93649365void Assembler::evpblendmd (XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len) {9366assert(VM_Version::supports_evex(), "");9367//Encoding: EVEX.NDS.512.66.0F38.W0 64 /r9368InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);9369attributes.set_is_evex_instruction();9370attributes.set_embedded_opmask_register_specifier(mask);9371if (merge) {9372attributes.reset_is_clear_context();9373}9374int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9375emit_int16(0x64, (0xC0 | encode));9376}93779378void Assembler::evpblendmq (XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len) {9379assert(VM_Version::supports_evex(), "");9380//Encoding: EVEX.NDS.512.66.0F38.W1 64 /r9381InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);9382attributes.set_is_evex_instruction();9383attributes.set_embedded_opmask_register_specifier(mask);9384if (merge) {9385attributes.reset_is_clear_context();9386}9387int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9388emit_int16(0x64, (0xC0 | encode));9389}93909391void Assembler::bzhiq(Register dst, Register src1, Register src2) {9392assert(VM_Version::supports_bmi2(), "bit manipulation instructions not supported");9393InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9394int encode = vex_prefix_and_encode(dst->encoding(), src2->encoding(), src1->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);9395emit_int16((unsigned char)0xF5, (0xC0 | encode));9396}93979398void Assembler::shlxl(Register dst, Register src1, Register src2) {9399assert(VM_Version::supports_bmi2(), "");9400InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);9401int encode = vex_prefix_and_encode(dst->encoding(), src2->encoding(), src1->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9402emit_int16((unsigned char)0xF7, (0xC0 | encode));9403}94049405void Assembler::shlxq(Register dst, Register src1, Register src2) {9406assert(VM_Version::supports_bmi2(), "");9407InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);9408int encode = vex_prefix_and_encode(dst->encoding(), src2->encoding(), src1->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9409emit_int16((unsigned char)0xF7, (0xC0 | encode));9410}94119412void Assembler::shrxq(Register dst, Register src1, Register src2) {9413assert(VM_Version::supports_bmi2(), "");9414InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);9415int encode = vex_prefix_and_encode(dst->encoding(), src2->encoding(), src1->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F_38, &attributes);9416emit_int16((unsigned char)0xF7, (0xC0 | encode));9417}94189419void Assembler::evpmovb2m(KRegister dst, XMMRegister src, int vector_len) {9420assert(VM_Version::supports_avx512vlbw(), "");9421InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);9422attributes.set_is_evex_instruction();9423int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);9424emit_int16(0x29, (0xC0 | encode));9425}94269427#ifndef _LP6494289429void Assembler::incl(Register dst) {9430// Don't use it directly. Use MacroAssembler::incrementl() instead.9431emit_int8(0x40 | dst->encoding());9432}94339434void Assembler::lea(Register dst, Address src) {9435leal(dst, src);9436}94379438void Assembler::mov_literal32(Address dst, int32_t imm32, RelocationHolder const& rspec) {9439InstructionMark im(this);9440emit_int8((unsigned char)0xC7);9441emit_operand(rax, dst);9442emit_data((int)imm32, rspec, 0);9443}94449445void Assembler::mov_literal32(Register dst, int32_t imm32, RelocationHolder const& rspec) {9446InstructionMark im(this);9447int encode = prefix_and_encode(dst->encoding());9448emit_int8((0xB8 | encode));9449emit_data((int)imm32, rspec, 0);9450}94519452void Assembler::popa() { // 32bit9453emit_int8(0x61);9454}94559456void Assembler::push_literal32(int32_t imm32, RelocationHolder const& rspec) {9457InstructionMark im(this);9458emit_int8(0x68);9459emit_data(imm32, rspec, 0);9460}94619462void Assembler::pusha() { // 32bit9463emit_int8(0x60);9464}94659466void Assembler::set_byte_if_not_zero(Register dst) {9467emit_int24(0x0F, (unsigned char)0x95, (0xC0 | dst->encoding()));9468}94699470#else // LP6494719472void Assembler::set_byte_if_not_zero(Register dst) {9473int enc = prefix_and_encode(dst->encoding(), true);9474emit_int24(0x0F, (unsigned char)0x95, (0xC0 | enc));9475}94769477// 64bit only pieces of the assembler9478// This should only be used by 64bit instructions that can use rip-relative9479// it cannot be used by instructions that want an immediate value.94809481bool Assembler::reachable(AddressLiteral adr) {9482int64_t disp;9483relocInfo::relocType relocType = adr.reloc();94849485// None will force a 64bit literal to the code stream. Likely a placeholder9486// for something that will be patched later and we need to certain it will9487// always be reachable.9488if (relocType == relocInfo::none) {9489return false;9490}9491if (relocType == relocInfo::internal_word_type) {9492// This should be rip relative and easily reachable.9493return true;9494}9495if (relocType == relocInfo::virtual_call_type ||9496relocType == relocInfo::opt_virtual_call_type ||9497relocType == relocInfo::static_call_type ||9498relocType == relocInfo::static_stub_type ) {9499// This should be rip relative within the code cache and easily9500// reachable until we get huge code caches. (At which point9501// ic code is going to have issues).9502return true;9503}9504if (relocType != relocInfo::external_word_type &&9505relocType != relocInfo::poll_return_type && // these are really external_word but need special9506relocType != relocInfo::poll_type && // relocs to identify them9507relocType != relocInfo::runtime_call_type ) {9508return false;9509}95109511// Stress the correction code9512if (ForceUnreachable) {9513// Must be runtimecall reloc, see if it is in the codecache9514// Flipping stuff in the codecache to be unreachable causes issues9515// with things like inline caches where the additional instructions9516// are not handled.9517if (CodeCache::find_blob(adr._target) == NULL) {9518return false;9519}9520}9521// For external_word_type/runtime_call_type if it is reachable from where we9522// are now (possibly a temp buffer) and where we might end up9523// anywhere in the codeCache then we are always reachable.9524// This would have to change if we ever save/restore shared code9525// to be more pessimistic.9526disp = (int64_t)adr._target - ((int64_t)CodeCache::low_bound() + sizeof(int));9527if (!is_simm32(disp)) return false;9528disp = (int64_t)adr._target - ((int64_t)CodeCache::high_bound() + sizeof(int));9529if (!is_simm32(disp)) return false;95309531disp = (int64_t)adr._target - ((int64_t)pc() + sizeof(int));95329533// Because rip relative is a disp + address_of_next_instruction and we9534// don't know the value of address_of_next_instruction we apply a fudge factor9535// to make sure we will be ok no matter the size of the instruction we get placed into.9536// We don't have to fudge the checks above here because they are already worst case.95379538// 12 == override/rex byte, opcode byte, rm byte, sib byte, a 4-byte disp , 4-byte literal9539// + 4 because better safe than sorry.9540const int fudge = 12 + 4;9541if (disp < 0) {9542disp -= fudge;9543} else {9544disp += fudge;9545}9546return is_simm32(disp);9547}95489549void Assembler::emit_data64(jlong data,9550relocInfo::relocType rtype,9551int format) {9552if (rtype == relocInfo::none) {9553emit_int64(data);9554} else {9555emit_data64(data, Relocation::spec_simple(rtype), format);9556}9557}95589559void Assembler::emit_data64(jlong data,9560RelocationHolder const& rspec,9561int format) {9562assert(imm_operand == 0, "default format must be immediate in this file");9563assert(imm_operand == format, "must be immediate");9564assert(inst_mark() != NULL, "must be inside InstructionMark");9565// Do not use AbstractAssembler::relocate, which is not intended for9566// embedded words. Instead, relocate to the enclosing instruction.9567code_section()->relocate(inst_mark(), rspec, format);9568#ifdef ASSERT9569check_relocation(rspec, format);9570#endif9571emit_int64(data);9572}95739574void Assembler::prefix(Register reg) {9575if (reg->encoding() >= 8) {9576prefix(REX_B);9577}9578}95799580void Assembler::prefix(Register dst, Register src, Prefix p) {9581if (src->encoding() >= 8) {9582p = (Prefix)(p | REX_B);9583}9584if (dst->encoding() >= 8) {9585p = (Prefix)(p | REX_R);9586}9587if (p != Prefix_EMPTY) {9588// do not generate an empty prefix9589prefix(p);9590}9591}95929593void Assembler::prefix(Register dst, Address adr, Prefix p) {9594if (adr.base_needs_rex()) {9595if (adr.index_needs_rex()) {9596assert(false, "prefix(Register dst, Address adr, Prefix p) does not support handling of an X");9597} else {9598prefix(REX_B);9599}9600} else {9601if (adr.index_needs_rex()) {9602assert(false, "prefix(Register dst, Address adr, Prefix p) does not support handling of an X");9603}9604}9605if (dst->encoding() >= 8) {9606p = (Prefix)(p | REX_R);9607}9608if (p != Prefix_EMPTY) {9609// do not generate an empty prefix9610prefix(p);9611}9612}96139614void Assembler::prefix(Address adr) {9615if (adr.base_needs_rex()) {9616if (adr.index_needs_rex()) {9617prefix(REX_XB);9618} else {9619prefix(REX_B);9620}9621} else {9622if (adr.index_needs_rex()) {9623prefix(REX_X);9624}9625}9626}96279628void Assembler::prefix(Address adr, Register reg, bool byteinst) {9629if (reg->encoding() < 8) {9630if (adr.base_needs_rex()) {9631if (adr.index_needs_rex()) {9632prefix(REX_XB);9633} else {9634prefix(REX_B);9635}9636} else {9637if (adr.index_needs_rex()) {9638prefix(REX_X);9639} else if (byteinst && reg->encoding() >= 4) {9640prefix(REX);9641}9642}9643} else {9644if (adr.base_needs_rex()) {9645if (adr.index_needs_rex()) {9646prefix(REX_RXB);9647} else {9648prefix(REX_RB);9649}9650} else {9651if (adr.index_needs_rex()) {9652prefix(REX_RX);9653} else {9654prefix(REX_R);9655}9656}9657}9658}96599660void Assembler::prefix(Address adr, XMMRegister reg) {9661if (reg->encoding() < 8) {9662if (adr.base_needs_rex()) {9663if (adr.index_needs_rex()) {9664prefix(REX_XB);9665} else {9666prefix(REX_B);9667}9668} else {9669if (adr.index_needs_rex()) {9670prefix(REX_X);9671}9672}9673} else {9674if (adr.base_needs_rex()) {9675if (adr.index_needs_rex()) {9676prefix(REX_RXB);9677} else {9678prefix(REX_RB);9679}9680} else {9681if (adr.index_needs_rex()) {9682prefix(REX_RX);9683} else {9684prefix(REX_R);9685}9686}9687}9688}96899690int Assembler::prefix_and_encode(int reg_enc, bool byteinst) {9691if (reg_enc >= 8) {9692prefix(REX_B);9693reg_enc -= 8;9694} else if (byteinst && reg_enc >= 4) {9695prefix(REX);9696}9697return reg_enc;9698}96999700int Assembler::prefix_and_encode(int dst_enc, bool dst_is_byte, int src_enc, bool src_is_byte) {9701if (dst_enc < 8) {9702if (src_enc >= 8) {9703prefix(REX_B);9704src_enc -= 8;9705} else if ((src_is_byte && src_enc >= 4) || (dst_is_byte && dst_enc >= 4)) {9706prefix(REX);9707}9708} else {9709if (src_enc < 8) {9710prefix(REX_R);9711} else {9712prefix(REX_RB);9713src_enc -= 8;9714}9715dst_enc -= 8;9716}9717return dst_enc << 3 | src_enc;9718}97199720int8_t Assembler::get_prefixq(Address adr) {9721int8_t prfx = get_prefixq(adr, rax);9722assert(REX_W <= prfx && prfx <= REX_WXB, "must be");9723return prfx;9724}97259726int8_t Assembler::get_prefixq(Address adr, Register src) {9727int8_t prfx = (int8_t)(REX_W +9728((int)adr.base_needs_rex()) +9729((int)adr.index_needs_rex() << 1) +9730((int)(src->encoding() >= 8) << 2));9731#ifdef ASSERT9732if (src->encoding() < 8) {9733if (adr.base_needs_rex()) {9734if (adr.index_needs_rex()) {9735assert(prfx == REX_WXB, "must be");9736} else {9737assert(prfx == REX_WB, "must be");9738}9739} else {9740if (adr.index_needs_rex()) {9741assert(prfx == REX_WX, "must be");9742} else {9743assert(prfx == REX_W, "must be");9744}9745}9746} else {9747if (adr.base_needs_rex()) {9748if (adr.index_needs_rex()) {9749assert(prfx == REX_WRXB, "must be");9750} else {9751assert(prfx == REX_WRB, "must be");9752}9753} else {9754if (adr.index_needs_rex()) {9755assert(prfx == REX_WRX, "must be");9756} else {9757assert(prfx == REX_WR, "must be");9758}9759}9760}9761#endif9762return prfx;9763}97649765void Assembler::prefixq(Address adr) {9766emit_int8(get_prefixq(adr));9767}97689769void Assembler::prefixq(Address adr, Register src) {9770emit_int8(get_prefixq(adr, src));9771}97729773void Assembler::prefixq(Address adr, XMMRegister src) {9774if (src->encoding() < 8) {9775if (adr.base_needs_rex()) {9776if (adr.index_needs_rex()) {9777prefix(REX_WXB);9778} else {9779prefix(REX_WB);9780}9781} else {9782if (adr.index_needs_rex()) {9783prefix(REX_WX);9784} else {9785prefix(REX_W);9786}9787}9788} else {9789if (adr.base_needs_rex()) {9790if (adr.index_needs_rex()) {9791prefix(REX_WRXB);9792} else {9793prefix(REX_WRB);9794}9795} else {9796if (adr.index_needs_rex()) {9797prefix(REX_WRX);9798} else {9799prefix(REX_WR);9800}9801}9802}9803}98049805int Assembler::prefixq_and_encode(int reg_enc) {9806if (reg_enc < 8) {9807prefix(REX_W);9808} else {9809prefix(REX_WB);9810reg_enc -= 8;9811}9812return reg_enc;9813}98149815int Assembler::prefixq_and_encode(int dst_enc, int src_enc) {9816if (dst_enc < 8) {9817if (src_enc < 8) {9818prefix(REX_W);9819} else {9820prefix(REX_WB);9821src_enc -= 8;9822}9823} else {9824if (src_enc < 8) {9825prefix(REX_WR);9826} else {9827prefix(REX_WRB);9828src_enc -= 8;9829}9830dst_enc -= 8;9831}9832return dst_enc << 3 | src_enc;9833}98349835void Assembler::adcq(Register dst, int32_t imm32) {9836(void) prefixq_and_encode(dst->encoding());9837emit_arith(0x81, 0xD0, dst, imm32);9838}98399840void Assembler::adcq(Register dst, Address src) {9841InstructionMark im(this);9842emit_int16(get_prefixq(src, dst), 0x13);9843emit_operand(dst, src);9844}98459846void Assembler::adcq(Register dst, Register src) {9847(void) prefixq_and_encode(dst->encoding(), src->encoding());9848emit_arith(0x13, 0xC0, dst, src);9849}98509851void Assembler::addq(Address dst, int32_t imm32) {9852InstructionMark im(this);9853prefixq(dst);9854emit_arith_operand(0x81, rax, dst, imm32);9855}98569857void Assembler::addq(Address dst, Register src) {9858InstructionMark im(this);9859emit_int16(get_prefixq(dst, src), 0x01);9860emit_operand(src, dst);9861}98629863void Assembler::addq(Register dst, int32_t imm32) {9864(void) prefixq_and_encode(dst->encoding());9865emit_arith(0x81, 0xC0, dst, imm32);9866}98679868void Assembler::addq(Register dst, Address src) {9869InstructionMark im(this);9870emit_int16(get_prefixq(src, dst), 0x03);9871emit_operand(dst, src);9872}98739874void Assembler::addq(Register dst, Register src) {9875(void) prefixq_and_encode(dst->encoding(), src->encoding());9876emit_arith(0x03, 0xC0, dst, src);9877}98789879void Assembler::adcxq(Register dst, Register src) {9880//assert(VM_Version::supports_adx(), "adx instructions not supported");9881emit_int8(0x66);9882int encode = prefixq_and_encode(dst->encoding(), src->encoding());9883emit_int32(0x0F,98840x38,9885(unsigned char)0xF6,9886(0xC0 | encode));9887}98889889void Assembler::adoxq(Register dst, Register src) {9890//assert(VM_Version::supports_adx(), "adx instructions not supported");9891emit_int8((unsigned char)0xF3);9892int encode = prefixq_and_encode(dst->encoding(), src->encoding());9893emit_int32(0x0F,98940x38,9895(unsigned char)0xF6,9896(0xC0 | encode));9897}98989899void Assembler::andq(Address dst, int32_t imm32) {9900InstructionMark im(this);9901prefixq(dst);9902emit_arith_operand(0x81, as_Register(4), dst, imm32);9903}99049905void Assembler::andq(Register dst, int32_t imm32) {9906(void) prefixq_and_encode(dst->encoding());9907emit_arith(0x81, 0xE0, dst, imm32);9908}99099910void Assembler::andq(Register dst, Address src) {9911InstructionMark im(this);9912emit_int16(get_prefixq(src, dst), 0x23);9913emit_operand(dst, src);9914}99159916void Assembler::andq(Register dst, Register src) {9917(void) prefixq_and_encode(dst->encoding(), src->encoding());9918emit_arith(0x23, 0xC0, dst, src);9919}99209921void Assembler::andq(Address dst, Register src) {9922InstructionMark im(this);9923emit_int16(get_prefixq(dst, src), 0x21);9924emit_operand(src, dst);9925}99269927void Assembler::andnq(Register dst, Register src1, Register src2) {9928assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");9929InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9930int encode = vex_prefix_and_encode(dst->encoding(), src1->encoding(), src2->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);9931emit_int16((unsigned char)0xF2, (0xC0 | encode));9932}99339934void Assembler::andnq(Register dst, Register src1, Address src2) {9935assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");9936InstructionMark im(this);9937InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9938vex_prefix(src2, src1->encoding(), dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);9939emit_int8((unsigned char)0xF2);9940emit_operand(dst, src2);9941}99429943void Assembler::bsfq(Register dst, Register src) {9944int encode = prefixq_and_encode(dst->encoding(), src->encoding());9945emit_int24(0x0F, (unsigned char)0xBC, (0xC0 | encode));9946}99479948void Assembler::bsrq(Register dst, Register src) {9949int encode = prefixq_and_encode(dst->encoding(), src->encoding());9950emit_int24(0x0F, (unsigned char)0xBD, (0xC0 | encode));9951}99529953void Assembler::bswapq(Register reg) {9954int encode = prefixq_and_encode(reg->encoding());9955emit_int16(0x0F, (0xC8 | encode));9956}99579958void Assembler::blsiq(Register dst, Register src) {9959assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");9960InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9961int encode = vex_prefix_and_encode(rbx->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);9962emit_int16((unsigned char)0xF3, (0xC0 | encode));9963}99649965void Assembler::blsiq(Register dst, Address src) {9966assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");9967InstructionMark im(this);9968InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9969vex_prefix(src, dst->encoding(), rbx->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);9970emit_int8((unsigned char)0xF3);9971emit_operand(rbx, src);9972}99739974void Assembler::blsmskq(Register dst, Register src) {9975assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");9976InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9977int encode = vex_prefix_and_encode(rdx->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);9978emit_int16((unsigned char)0xF3, (0xC0 | encode));9979}99809981void Assembler::blsmskq(Register dst, Address src) {9982assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");9983InstructionMark im(this);9984InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9985vex_prefix(src, dst->encoding(), rdx->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);9986emit_int8((unsigned char)0xF3);9987emit_operand(rdx, src);9988}99899990void Assembler::blsrq(Register dst, Register src) {9991assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");9992InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9993int encode = vex_prefix_and_encode(rcx->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);9994emit_int16((unsigned char)0xF3, (0xC0 | encode));9995}99969997void Assembler::blsrq(Register dst, Address src) {9998assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");9999InstructionMark im(this);10000InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);10001vex_prefix(src, dst->encoding(), rcx->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);10002emit_int8((unsigned char)0xF3);10003emit_operand(rcx, src);10004}1000510006void Assembler::cdqq() {10007emit_int16(REX_W, (unsigned char)0x99);10008}1000910010void Assembler::clflush(Address adr) {10011assert(VM_Version::supports_clflush(), "should do");10012prefix(adr);10013emit_int16(0x0F, (unsigned char)0xAE);10014emit_operand(rdi, adr);10015}1001610017void Assembler::clflushopt(Address adr) {10018assert(VM_Version::supports_clflushopt(), "should do!");10019// adr should be base reg only with no index or offset10020assert(adr.index() == noreg, "index should be noreg");10021assert(adr.scale() == Address::no_scale, "scale should be no_scale");10022assert(adr.disp() == 0, "displacement should be 0");10023// instruction prefix is 0x6610024emit_int8(0x66);10025prefix(adr);10026// opcode family is 0x0F 0xAE10027emit_int16(0x0F, (unsigned char)0xAE);10028// extended opcode byte is 7 == rdi10029emit_operand(rdi, adr);10030}1003110032void Assembler::clwb(Address adr) {10033assert(VM_Version::supports_clwb(), "should do!");10034// adr should be base reg only with no index or offset10035assert(adr.index() == noreg, "index should be noreg");10036assert(adr.scale() == Address::no_scale, "scale should be no_scale");10037assert(adr.disp() == 0, "displacement should be 0");10038// instruction prefix is 0x6610039emit_int8(0x66);10040prefix(adr);10041// opcode family is 0x0f 0xAE10042emit_int16(0x0F, (unsigned char)0xAE);10043// extended opcode byte is 6 == rsi10044emit_operand(rsi, adr);10045}1004610047void Assembler::cmovq(Condition cc, Register dst, Register src) {10048int encode = prefixq_and_encode(dst->encoding(), src->encoding());10049emit_int24(0x0F, (0x40 | cc), (0xC0 | encode));10050}1005110052void Assembler::cmovq(Condition cc, Register dst, Address src) {10053InstructionMark im(this);10054emit_int24(get_prefixq(src, dst), 0x0F, (0x40 | cc));10055emit_operand(dst, src);10056}1005710058void Assembler::cmpq(Address dst, int32_t imm32) {10059InstructionMark im(this);10060emit_int16(get_prefixq(dst), (unsigned char)0x81);10061emit_operand(rdi, dst, 4);10062emit_int32(imm32);10063}1006410065void Assembler::cmpq(Register dst, int32_t imm32) {10066(void) prefixq_and_encode(dst->encoding());10067emit_arith(0x81, 0xF8, dst, imm32);10068}1006910070void Assembler::cmpq(Address dst, Register src) {10071InstructionMark im(this);10072emit_int16(get_prefixq(dst, src), 0x39);10073emit_operand(src, dst);10074}1007510076void Assembler::cmpq(Register dst, Register src) {10077(void) prefixq_and_encode(dst->encoding(), src->encoding());10078emit_arith(0x3B, 0xC0, dst, src);10079}1008010081void Assembler::cmpq(Register dst, Address src) {10082InstructionMark im(this);10083emit_int16(get_prefixq(src, dst), 0x3B);10084emit_operand(dst, src);10085}1008610087void Assembler::cmpxchgq(Register reg, Address adr) {10088InstructionMark im(this);10089emit_int24(get_prefixq(adr, reg), 0x0F, (unsigned char)0xB1);10090emit_operand(reg, adr);10091}1009210093void Assembler::cvtsi2sdq(XMMRegister dst, Register src) {10094NOT_LP64(assert(VM_Version::supports_sse2(), ""));10095InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);10096int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);10097emit_int16(0x2A, (0xC0 | encode));10098}1009910100void Assembler::cvtsi2sdq(XMMRegister dst, Address src) {10101NOT_LP64(assert(VM_Version::supports_sse2(), ""));10102InstructionMark im(this);10103InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);10104attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);10105simd_prefix(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);10106emit_int8(0x2A);10107emit_operand(dst, src);10108}1010910110void Assembler::cvtsi2ssq(XMMRegister dst, Address src) {10111NOT_LP64(assert(VM_Version::supports_sse(), ""));10112InstructionMark im(this);10113InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);10114attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);10115simd_prefix(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);10116emit_int8(0x2A);10117emit_operand(dst, src);10118}1011910120void Assembler::cvttsd2siq(Register dst, Address src) {10121NOT_LP64(assert(VM_Version::supports_sse2(), ""));10122// F2 REX.W 0F 2C /r10123// CVTTSD2SI r64, xmm1/m6410124InstructionMark im(this);10125emit_int32((unsigned char)0xF2, REX_W, 0x0F, 0x2C);10126emit_operand(dst, src);10127}1012810129void Assembler::cvttsd2siq(Register dst, XMMRegister src) {10130NOT_LP64(assert(VM_Version::supports_sse2(), ""));10131InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);10132int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);10133emit_int16(0x2C, (0xC0 | encode));10134}1013510136void Assembler::cvttss2siq(Register dst, XMMRegister src) {10137NOT_LP64(assert(VM_Version::supports_sse(), ""));10138InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);10139int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);10140emit_int16(0x2C, (0xC0 | encode));10141}1014210143void Assembler::decl(Register dst) {10144// Don't use it directly. Use MacroAssembler::decrementl() instead.10145// Use two-byte form (one-byte form is a REX prefix in 64-bit mode)10146int encode = prefix_and_encode(dst->encoding());10147emit_int16((unsigned char)0xFF, (0xC8 | encode));10148}1014910150void Assembler::decq(Register dst) {10151// Don't use it directly. Use MacroAssembler::decrementq() instead.10152// Use two-byte form (one-byte from is a REX prefix in 64-bit mode)10153int encode = prefixq_and_encode(dst->encoding());10154emit_int16((unsigned char)0xFF, 0xC8 | encode);10155}1015610157void Assembler::decq(Address dst) {10158// Don't use it directly. Use MacroAssembler::decrementq() instead.10159InstructionMark im(this);10160emit_int16(get_prefixq(dst), (unsigned char)0xFF);10161emit_operand(rcx, dst);10162}1016310164void Assembler::fxrstor(Address src) {10165emit_int24(get_prefixq(src), 0x0F, (unsigned char)0xAE);10166emit_operand(as_Register(1), src);10167}1016810169void Assembler::xrstor(Address src) {10170emit_int24(get_prefixq(src), 0x0F, (unsigned char)0xAE);10171emit_operand(as_Register(5), src);10172}1017310174void Assembler::fxsave(Address dst) {10175emit_int24(get_prefixq(dst), 0x0F, (unsigned char)0xAE);10176emit_operand(as_Register(0), dst);10177}1017810179void Assembler::xsave(Address dst) {10180emit_int24(get_prefixq(dst), 0x0F, (unsigned char)0xAE);10181emit_operand(as_Register(4), dst);10182}1018310184void Assembler::idivq(Register src) {10185int encode = prefixq_and_encode(src->encoding());10186emit_int16((unsigned char)0xF7, (0xF8 | encode));10187}1018810189void Assembler::imulq(Register dst, Register src) {10190int encode = prefixq_and_encode(dst->encoding(), src->encoding());10191emit_int24(0x0F, (unsigned char)0xAF, (0xC0 | encode));10192}1019310194void Assembler::imulq(Register src) {10195int encode = prefixq_and_encode(src->encoding());10196emit_int16((unsigned char)0xF7, (0xE8 | encode));10197}1019810199void Assembler::imulq(Register dst, Address src, int32_t value) {10200InstructionMark im(this);10201prefixq(src, dst);10202if (is8bit(value)) {10203emit_int8((unsigned char)0x6B);10204emit_operand(dst, src);10205emit_int8(value);10206} else {10207emit_int8((unsigned char)0x69);10208emit_operand(dst, src);10209emit_int32(value);10210}10211}1021210213void Assembler::imulq(Register dst, Register src, int value) {10214int encode = prefixq_and_encode(dst->encoding(), src->encoding());10215if (is8bit(value)) {10216emit_int24(0x6B, (0xC0 | encode), (value & 0xFF));10217} else {10218emit_int16(0x69, (0xC0 | encode));10219emit_int32(value);10220}10221}1022210223void Assembler::imulq(Register dst, Address src) {10224InstructionMark im(this);10225emit_int24(get_prefixq(src, dst), 0x0F, (unsigned char)0xAF);10226emit_operand(dst, src);10227}1022810229void Assembler::incl(Register dst) {10230// Don't use it directly. Use MacroAssembler::incrementl() instead.10231// Use two-byte form (one-byte from is a REX prefix in 64-bit mode)10232int encode = prefix_and_encode(dst->encoding());10233emit_int16((unsigned char)0xFF, (0xC0 | encode));10234}1023510236void Assembler::incq(Register dst) {10237// Don't use it directly. Use MacroAssembler::incrementq() instead.10238// Use two-byte form (one-byte from is a REX prefix in 64-bit mode)10239int encode = prefixq_and_encode(dst->encoding());10240emit_int16((unsigned char)0xFF, (0xC0 | encode));10241}1024210243void Assembler::incq(Address dst) {10244// Don't use it directly. Use MacroAssembler::incrementq() instead.10245InstructionMark im(this);10246emit_int16(get_prefixq(dst), (unsigned char)0xFF);10247emit_operand(rax, dst);10248}1024910250void Assembler::lea(Register dst, Address src) {10251leaq(dst, src);10252}1025310254void Assembler::leaq(Register dst, Address src) {10255InstructionMark im(this);10256emit_int16(get_prefixq(src, dst), (unsigned char)0x8D);10257emit_operand(dst, src);10258}1025910260void Assembler::mov64(Register dst, int64_t imm64) {10261InstructionMark im(this);10262int encode = prefixq_and_encode(dst->encoding());10263emit_int8(0xB8 | encode);10264emit_int64(imm64);10265}1026610267void Assembler::mov64(Register dst, int64_t imm64, relocInfo::relocType rtype, int format) {10268InstructionMark im(this);10269int encode = prefixq_and_encode(dst->encoding());10270emit_int8(0xB8 | encode);10271emit_data64(imm64, rtype, format);10272}1027310274void Assembler::mov_literal64(Register dst, intptr_t imm64, RelocationHolder const& rspec) {10275InstructionMark im(this);10276int encode = prefixq_and_encode(dst->encoding());10277emit_int8(0xB8 | encode);10278emit_data64(imm64, rspec);10279}1028010281void Assembler::mov_narrow_oop(Register dst, int32_t imm32, RelocationHolder const& rspec) {10282InstructionMark im(this);10283int encode = prefix_and_encode(dst->encoding());10284emit_int8(0xB8 | encode);10285emit_data((int)imm32, rspec, narrow_oop_operand);10286}1028710288void Assembler::mov_narrow_oop(Address dst, int32_t imm32, RelocationHolder const& rspec) {10289InstructionMark im(this);10290prefix(dst);10291emit_int8((unsigned char)0xC7);10292emit_operand(rax, dst, 4);10293emit_data((int)imm32, rspec, narrow_oop_operand);10294}1029510296void Assembler::cmp_narrow_oop(Register src1, int32_t imm32, RelocationHolder const& rspec) {10297InstructionMark im(this);10298int encode = prefix_and_encode(src1->encoding());10299emit_int16((unsigned char)0x81, (0xF8 | encode));10300emit_data((int)imm32, rspec, narrow_oop_operand);10301}1030210303void Assembler::cmp_narrow_oop(Address src1, int32_t imm32, RelocationHolder const& rspec) {10304InstructionMark im(this);10305prefix(src1);10306emit_int8((unsigned char)0x81);10307emit_operand(rax, src1, 4);10308emit_data((int)imm32, rspec, narrow_oop_operand);10309}1031010311void Assembler::lzcntq(Register dst, Register src) {10312assert(VM_Version::supports_lzcnt(), "encoding is treated as BSR");10313emit_int8((unsigned char)0xF3);10314int encode = prefixq_and_encode(dst->encoding(), src->encoding());10315emit_int24(0x0F, (unsigned char)0xBD, (0xC0 | encode));10316}1031710318void Assembler::movdq(XMMRegister dst, Register src) {10319// table D-1 says MMX/SSE210320NOT_LP64(assert(VM_Version::supports_sse2(), ""));10321InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);10322int encode = simd_prefix_and_encode(dst, xnoreg, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);10323emit_int16(0x6E, (0xC0 | encode));10324}1032510326void Assembler::movdq(Register dst, XMMRegister src) {10327// table D-1 says MMX/SSE210328NOT_LP64(assert(VM_Version::supports_sse2(), ""));10329InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);10330// swap src/dst to get correct prefix10331int encode = simd_prefix_and_encode(src, xnoreg, as_XMMRegister(dst->encoding()), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);10332emit_int16(0x7E,10333(0xC0 | encode));10334}1033510336void Assembler::movq(Register dst, Register src) {10337int encode = prefixq_and_encode(dst->encoding(), src->encoding());10338emit_int16((unsigned char)0x8B,10339(0xC0 | encode));10340}1034110342void Assembler::movq(Register dst, Address src) {10343InstructionMark im(this);10344emit_int16(get_prefixq(src, dst), (unsigned char)0x8B);10345emit_operand(dst, src);10346}1034710348void Assembler::movq(Address dst, Register src) {10349InstructionMark im(this);10350emit_int16(get_prefixq(dst, src), (unsigned char)0x89);10351emit_operand(src, dst);10352}1035310354void Assembler::movq(Address dst, int32_t imm32) {10355InstructionMark im(this);10356emit_int16(get_prefixq(dst), (unsigned char)0xC7);10357emit_operand(as_Register(0), dst);10358emit_int32(imm32);10359}1036010361void Assembler::movq(Register dst, int32_t imm32) {10362int encode = prefixq_and_encode(dst->encoding());10363emit_int16((unsigned char)0xC7, (0xC0 | encode));10364emit_int32(imm32);10365}1036610367void Assembler::movsbq(Register dst, Address src) {10368InstructionMark im(this);10369emit_int24(get_prefixq(src, dst),103700x0F,10371(unsigned char)0xBE);10372emit_operand(dst, src);10373}1037410375void Assembler::movsbq(Register dst, Register src) {10376int encode = prefixq_and_encode(dst->encoding(), src->encoding());10377emit_int24(0x0F, (unsigned char)0xBE, (0xC0 | encode));10378}1037910380void Assembler::movslq(Register dst, int32_t imm32) {10381// dbx shows movslq(rcx, 3) as movq $0x0000000049000000,(%rbx)10382// and movslq(r8, 3); as movl $0x0000000048000000,(%rbx)10383// as a result we shouldn't use until tested at runtime...10384ShouldNotReachHere();10385InstructionMark im(this);10386int encode = prefixq_and_encode(dst->encoding());10387emit_int8(0xC7 | encode);10388emit_int32(imm32);10389}1039010391void Assembler::movslq(Address dst, int32_t imm32) {10392assert(is_simm32(imm32), "lost bits");10393InstructionMark im(this);10394emit_int16(get_prefixq(dst), (unsigned char)0xC7);10395emit_operand(rax, dst, 4);10396emit_int32(imm32);10397}1039810399void Assembler::movslq(Register dst, Address src) {10400InstructionMark im(this);10401emit_int16(get_prefixq(src, dst), 0x63);10402emit_operand(dst, src);10403}1040410405void Assembler::movslq(Register dst, Register src) {10406int encode = prefixq_and_encode(dst->encoding(), src->encoding());10407emit_int16(0x63, (0xC0 | encode));10408}1040910410void Assembler::movswq(Register dst, Address src) {10411InstructionMark im(this);10412emit_int24(get_prefixq(src, dst),104130x0F,10414(unsigned char)0xBF);10415emit_operand(dst, src);10416}1041710418void Assembler::movswq(Register dst, Register src) {10419int encode = prefixq_and_encode(dst->encoding(), src->encoding());10420emit_int24(0x0F, (unsigned char)0xBF, (0xC0 | encode));10421}1042210423void Assembler::movzbq(Register dst, Address src) {10424InstructionMark im(this);10425emit_int24(get_prefixq(src, dst),104260x0F,10427(unsigned char)0xB6);10428emit_operand(dst, src);10429}1043010431void Assembler::movzbq(Register dst, Register src) {10432int encode = prefixq_and_encode(dst->encoding(), src->encoding());10433emit_int24(0x0F, (unsigned char)0xB6, (0xC0 | encode));10434}1043510436void Assembler::movzwq(Register dst, Address src) {10437InstructionMark im(this);10438emit_int24(get_prefixq(src, dst),104390x0F,10440(unsigned char)0xB7);10441emit_operand(dst, src);10442}1044310444void Assembler::movzwq(Register dst, Register src) {10445int encode = prefixq_and_encode(dst->encoding(), src->encoding());10446emit_int24(0x0F, (unsigned char)0xB7, (0xC0 | encode));10447}1044810449void Assembler::mulq(Address src) {10450InstructionMark im(this);10451emit_int16(get_prefixq(src), (unsigned char)0xF7);10452emit_operand(rsp, src);10453}1045410455void Assembler::mulq(Register src) {10456int encode = prefixq_and_encode(src->encoding());10457emit_int16((unsigned char)0xF7, (0xE0 | encode));10458}1045910460void Assembler::mulxq(Register dst1, Register dst2, Register src) {10461assert(VM_Version::supports_bmi2(), "bit manipulation instructions not supported");10462InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);10463int encode = vex_prefix_and_encode(dst1->encoding(), dst2->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F_38, &attributes);10464emit_int16((unsigned char)0xF6, (0xC0 | encode));10465}1046610467void Assembler::negq(Register dst) {10468int encode = prefixq_and_encode(dst->encoding());10469emit_int16((unsigned char)0xF7, (0xD8 | encode));10470}1047110472void Assembler::negq(Address dst) {10473InstructionMark im(this);10474emit_int16(get_prefixq(dst), (unsigned char)0xF7);10475emit_operand(as_Register(3), dst);10476}1047710478void Assembler::notq(Register dst) {10479int encode = prefixq_and_encode(dst->encoding());10480emit_int16((unsigned char)0xF7, (0xD0 | encode));10481}1048210483void Assembler::btsq(Address dst, int imm8) {10484assert(isByte(imm8), "not a byte");10485InstructionMark im(this);10486emit_int24(get_prefixq(dst),104870x0F,10488(unsigned char)0xBA);10489emit_operand(rbp /* 5 */, dst, 1);10490emit_int8(imm8);10491}1049210493void Assembler::btrq(Address dst, int imm8) {10494assert(isByte(imm8), "not a byte");10495InstructionMark im(this);10496emit_int24(get_prefixq(dst),104970x0F,10498(unsigned char)0xBA);10499emit_operand(rsi /* 6 */, dst, 1);10500emit_int8(imm8);10501}1050210503void Assembler::orq(Address dst, int32_t imm32) {10504InstructionMark im(this);10505prefixq(dst);10506emit_arith_operand(0x81, as_Register(1), dst, imm32);10507}1050810509void Assembler::orq(Address dst, Register src) {10510InstructionMark im(this);10511emit_int16(get_prefixq(dst, src), (unsigned char)0x09);10512emit_operand(src, dst);10513}1051410515void Assembler::orq(Register dst, int32_t imm32) {10516(void) prefixq_and_encode(dst->encoding());10517emit_arith(0x81, 0xC8, dst, imm32);10518}1051910520void Assembler::orq(Register dst, Address src) {10521InstructionMark im(this);10522emit_int16(get_prefixq(src, dst), 0x0B);10523emit_operand(dst, src);10524}1052510526void Assembler::orq(Register dst, Register src) {10527(void) prefixq_and_encode(dst->encoding(), src->encoding());10528emit_arith(0x0B, 0xC0, dst, src);10529}1053010531void Assembler::popcntq(Register dst, Address src) {10532assert(VM_Version::supports_popcnt(), "must support");10533InstructionMark im(this);10534emit_int32((unsigned char)0xF3,10535get_prefixq(src, dst),105360x0F,10537(unsigned char)0xB8);10538emit_operand(dst, src);10539}1054010541void Assembler::popcntq(Register dst, Register src) {10542assert(VM_Version::supports_popcnt(), "must support");10543emit_int8((unsigned char)0xF3);10544int encode = prefixq_and_encode(dst->encoding(), src->encoding());10545emit_int24(0x0F, (unsigned char)0xB8, (0xC0 | encode));10546}1054710548void Assembler::popq(Address dst) {10549InstructionMark im(this);10550emit_int16(get_prefixq(dst), (unsigned char)0x8F);10551emit_operand(rax, dst);10552}1055310554void Assembler::popq(Register dst) {10555emit_int8((unsigned char)0x58 | dst->encoding());10556}1055710558// Precomputable: popa, pusha, vzeroupper1055910560// The result of these routines are invariant from one invocation to another10561// invocation for the duration of a run. Caching the result on bootstrap10562// and copying it out on subsequent invocations can thus be beneficial10563static bool precomputed = false;1056410565static u_char* popa_code = NULL;10566static int popa_len = 0;1056710568static u_char* pusha_code = NULL;10569static int pusha_len = 0;1057010571static u_char* vzup_code = NULL;10572static int vzup_len = 0;1057310574void Assembler::precompute_instructions() {10575assert(!Universe::is_fully_initialized(), "must still be single threaded");10576guarantee(!precomputed, "only once");10577precomputed = true;10578ResourceMark rm;1057910580// Make a temporary buffer big enough for the routines we're capturing10581int size = 256;10582char* tmp_code = NEW_RESOURCE_ARRAY(char, size);10583CodeBuffer buffer((address)tmp_code, size);10584MacroAssembler masm(&buffer);1058510586address begin_popa = masm.code_section()->end();10587masm.popa_uncached();10588address end_popa = masm.code_section()->end();10589masm.pusha_uncached();10590address end_pusha = masm.code_section()->end();10591masm.vzeroupper_uncached();10592address end_vzup = masm.code_section()->end();1059310594// Save the instructions to permanent buffers.10595popa_len = (int)(end_popa - begin_popa);10596popa_code = NEW_C_HEAP_ARRAY(u_char, popa_len, mtInternal);10597memcpy(popa_code, begin_popa, popa_len);1059810599pusha_len = (int)(end_pusha - end_popa);10600pusha_code = NEW_C_HEAP_ARRAY(u_char, pusha_len, mtInternal);10601memcpy(pusha_code, end_popa, pusha_len);1060210603vzup_len = (int)(end_vzup - end_pusha);10604if (vzup_len > 0) {10605vzup_code = NEW_C_HEAP_ARRAY(u_char, vzup_len, mtInternal);10606memcpy(vzup_code, end_pusha, vzup_len);10607} else {10608vzup_code = pusha_code; // dummy10609}1061010611assert(masm.code()->total_oop_size() == 0 &&10612masm.code()->total_metadata_size() == 0 &&10613masm.code()->total_relocation_size() == 0,10614"pre-computed code can't reference oops, metadata or contain relocations");10615}1061610617static void emit_copy(CodeSection* code_section, u_char* src, int src_len) {10618assert(src != NULL, "code to copy must have been pre-computed");10619assert(code_section->limit() - code_section->end() > src_len, "code buffer not large enough");10620address end = code_section->end();10621memcpy(end, src, src_len);10622code_section->set_end(end + src_len);10623}1062410625void Assembler::popa() { // 64bit10626emit_copy(code_section(), popa_code, popa_len);10627}1062810629void Assembler::popa_uncached() { // 64bit10630movq(r15, Address(rsp, 0));10631movq(r14, Address(rsp, wordSize));10632movq(r13, Address(rsp, 2 * wordSize));10633movq(r12, Address(rsp, 3 * wordSize));10634movq(r11, Address(rsp, 4 * wordSize));10635movq(r10, Address(rsp, 5 * wordSize));10636movq(r9, Address(rsp, 6 * wordSize));10637movq(r8, Address(rsp, 7 * wordSize));10638movq(rdi, Address(rsp, 8 * wordSize));10639movq(rsi, Address(rsp, 9 * wordSize));10640movq(rbp, Address(rsp, 10 * wordSize));10641// Skip rsp as it is restored automatically to the value10642// before the corresponding pusha when popa is done.10643movq(rbx, Address(rsp, 12 * wordSize));10644movq(rdx, Address(rsp, 13 * wordSize));10645movq(rcx, Address(rsp, 14 * wordSize));10646movq(rax, Address(rsp, 15 * wordSize));1064710648addq(rsp, 16 * wordSize);10649}1065010651// Does not actually store the value of rsp on the stack.10652// The slot for rsp just contains an arbitrary value.10653void Assembler::pusha() { // 64bit10654emit_copy(code_section(), pusha_code, pusha_len);10655}1065610657// Does not actually store the value of rsp on the stack.10658// The slot for rsp just contains an arbitrary value.10659void Assembler::pusha_uncached() { // 64bit10660subq(rsp, 16 * wordSize);1066110662movq(Address(rsp, 15 * wordSize), rax);10663movq(Address(rsp, 14 * wordSize), rcx);10664movq(Address(rsp, 13 * wordSize), rdx);10665movq(Address(rsp, 12 * wordSize), rbx);10666// Skip rsp as the value is normally not used. There are a few places where10667// the original value of rsp needs to be known but that can be computed10668// from the value of rsp immediately after pusha (rsp + 16 * wordSize).10669movq(Address(rsp, 10 * wordSize), rbp);10670movq(Address(rsp, 9 * wordSize), rsi);10671movq(Address(rsp, 8 * wordSize), rdi);10672movq(Address(rsp, 7 * wordSize), r8);10673movq(Address(rsp, 6 * wordSize), r9);10674movq(Address(rsp, 5 * wordSize), r10);10675movq(Address(rsp, 4 * wordSize), r11);10676movq(Address(rsp, 3 * wordSize), r12);10677movq(Address(rsp, 2 * wordSize), r13);10678movq(Address(rsp, wordSize), r14);10679movq(Address(rsp, 0), r15);10680}1068110682void Assembler::vzeroupper() {10683emit_copy(code_section(), vzup_code, vzup_len);10684}1068510686void Assembler::pushq(Address src) {10687InstructionMark im(this);10688emit_int16(get_prefixq(src), (unsigned char)0xFF);10689emit_operand(rsi, src);10690}1069110692void Assembler::rclq(Register dst, int imm8) {10693assert(isShiftCount(imm8 >> 1), "illegal shift count");10694int encode = prefixq_and_encode(dst->encoding());10695if (imm8 == 1) {10696emit_int16((unsigned char)0xD1, (0xD0 | encode));10697} else {10698emit_int24((unsigned char)0xC1, (0xD0 | encode), imm8);10699}10700}1070110702void Assembler::rcrq(Register dst, int imm8) {10703assert(isShiftCount(imm8 >> 1), "illegal shift count");10704int encode = prefixq_and_encode(dst->encoding());10705if (imm8 == 1) {10706emit_int16((unsigned char)0xD1, (0xD8 | encode));10707} else {10708emit_int24((unsigned char)0xC1, (0xD8 | encode), imm8);10709}10710}107111071210713void Assembler::rorxq(Register dst, Register src, int imm8) {10714assert(VM_Version::supports_bmi2(), "bit manipulation instructions not supported");10715InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);10716int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F_3A, &attributes);10717emit_int24((unsigned char)0xF0, (0xC0 | encode), imm8);10718}1071910720void Assembler::rorxd(Register dst, Register src, int imm8) {10721assert(VM_Version::supports_bmi2(), "bit manipulation instructions not supported");10722InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);10723int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F_3A, &attributes);10724emit_int24((unsigned char)0xF0, (0xC0 | encode), imm8);10725}1072610727#ifdef _LP6410728void Assembler::salq(Address dst, int imm8) {10729InstructionMark im(this);10730assert(isShiftCount(imm8 >> 1), "illegal shift count");10731if (imm8 == 1) {10732emit_int16(get_prefixq(dst), (unsigned char)0xD1);10733emit_operand(as_Register(4), dst);10734}10735else {10736emit_int16(get_prefixq(dst), (unsigned char)0xC1);10737emit_operand(as_Register(4), dst);10738emit_int8(imm8);10739}10740}1074110742void Assembler::salq(Address dst) {10743InstructionMark im(this);10744emit_int16(get_prefixq(dst), (unsigned char)0xD3);10745emit_operand(as_Register(4), dst);10746}1074710748void Assembler::salq(Register dst, int imm8) {10749assert(isShiftCount(imm8 >> 1), "illegal shift count");10750int encode = prefixq_and_encode(dst->encoding());10751if (imm8 == 1) {10752emit_int16((unsigned char)0xD1, (0xE0 | encode));10753} else {10754emit_int24((unsigned char)0xC1, (0xE0 | encode), imm8);10755}10756}1075710758void Assembler::salq(Register dst) {10759int encode = prefixq_and_encode(dst->encoding());10760emit_int16((unsigned char)0xD3, (0xE0 | encode));10761}1076210763void Assembler::sarq(Address dst, int imm8) {10764InstructionMark im(this);10765assert(isShiftCount(imm8 >> 1), "illegal shift count");10766if (imm8 == 1) {10767emit_int16(get_prefixq(dst), (unsigned char)0xD1);10768emit_operand(as_Register(7), dst);10769}10770else {10771emit_int16(get_prefixq(dst), (unsigned char)0xC1);10772emit_operand(as_Register(7), dst);10773emit_int8(imm8);10774}10775}1077610777void Assembler::sarq(Address dst) {10778InstructionMark im(this);10779emit_int16(get_prefixq(dst), (unsigned char)0xD3);10780emit_operand(as_Register(7), dst);10781}1078210783void Assembler::sarq(Register dst, int imm8) {10784assert(isShiftCount(imm8 >> 1), "illegal shift count");10785int encode = prefixq_and_encode(dst->encoding());10786if (imm8 == 1) {10787emit_int16((unsigned char)0xD1, (0xF8 | encode));10788} else {10789emit_int24((unsigned char)0xC1, (0xF8 | encode), imm8);10790}10791}1079210793void Assembler::sarq(Register dst) {10794int encode = prefixq_and_encode(dst->encoding());10795emit_int16((unsigned char)0xD3, (0xF8 | encode));10796}10797#endif1079810799void Assembler::sbbq(Address dst, int32_t imm32) {10800InstructionMark im(this);10801prefixq(dst);10802emit_arith_operand(0x81, rbx, dst, imm32);10803}1080410805void Assembler::sbbq(Register dst, int32_t imm32) {10806(void) prefixq_and_encode(dst->encoding());10807emit_arith(0x81, 0xD8, dst, imm32);10808}1080910810void Assembler::sbbq(Register dst, Address src) {10811InstructionMark im(this);10812emit_int16(get_prefixq(src, dst), 0x1B);10813emit_operand(dst, src);10814}1081510816void Assembler::sbbq(Register dst, Register src) {10817(void) prefixq_and_encode(dst->encoding(), src->encoding());10818emit_arith(0x1B, 0xC0, dst, src);10819}1082010821void Assembler::shlq(Register dst, int imm8) {10822assert(isShiftCount(imm8 >> 1), "illegal shift count");10823int encode = prefixq_and_encode(dst->encoding());10824if (imm8 == 1) {10825emit_int16((unsigned char)0xD1, (0xE0 | encode));10826} else {10827emit_int24((unsigned char)0xC1, (0xE0 | encode), imm8);10828}10829}1083010831void Assembler::shlq(Register dst) {10832int encode = prefixq_and_encode(dst->encoding());10833emit_int16((unsigned char)0xD3, (0xE0 | encode));10834}1083510836void Assembler::shrq(Register dst, int imm8) {10837assert(isShiftCount(imm8 >> 1), "illegal shift count");10838int encode = prefixq_and_encode(dst->encoding());10839if (imm8 == 1) {10840emit_int16((unsigned char)0xD1, (0xE8 | encode));10841}10842else {10843emit_int24((unsigned char)0xC1, (0xE8 | encode), imm8);10844}10845}1084610847void Assembler::shrq(Register dst) {10848int encode = prefixq_and_encode(dst->encoding());10849emit_int16((unsigned char)0xD3, 0xE8 | encode);10850}1085110852void Assembler::shrq(Address dst) {10853InstructionMark im(this);10854emit_int16(get_prefixq(dst), (unsigned char)0xD3);10855emit_operand(as_Register(5), dst);10856}1085710858void Assembler::shrq(Address dst, int imm8) {10859InstructionMark im(this);10860assert(isShiftCount(imm8 >> 1), "illegal shift count");10861if (imm8 == 1) {10862emit_int16(get_prefixq(dst), (unsigned char)0xD1);10863emit_operand(as_Register(5), dst);10864}10865else {10866emit_int16(get_prefixq(dst), (unsigned char)0xC1);10867emit_operand(as_Register(5), dst);10868emit_int8(imm8);10869}10870}1087110872void Assembler::subq(Address dst, int32_t imm32) {10873InstructionMark im(this);10874prefixq(dst);10875emit_arith_operand(0x81, rbp, dst, imm32);10876}1087710878void Assembler::subq(Address dst, Register src) {10879InstructionMark im(this);10880emit_int16(get_prefixq(dst, src), 0x29);10881emit_operand(src, dst);10882}1088310884void Assembler::subq(Register dst, int32_t imm32) {10885(void) prefixq_and_encode(dst->encoding());10886emit_arith(0x81, 0xE8, dst, imm32);10887}1088810889// Force generation of a 4 byte immediate value even if it fits into 8bit10890void Assembler::subq_imm32(Register dst, int32_t imm32) {10891(void) prefixq_and_encode(dst->encoding());10892emit_arith_imm32(0x81, 0xE8, dst, imm32);10893}1089410895void Assembler::subq(Register dst, Address src) {10896InstructionMark im(this);10897emit_int16(get_prefixq(src, dst), 0x2B);10898emit_operand(dst, src);10899}1090010901void Assembler::subq(Register dst, Register src) {10902(void) prefixq_and_encode(dst->encoding(), src->encoding());10903emit_arith(0x2B, 0xC0, dst, src);10904}1090510906void Assembler::testq(Address dst, int32_t imm32) {10907InstructionMark im(this);10908emit_int16(get_prefixq(dst), (unsigned char)0xF7);10909emit_operand(as_Register(0), dst);10910emit_int32(imm32);10911}1091210913void Assembler::testq(Register dst, int32_t imm32) {10914// not using emit_arith because test10915// doesn't support sign-extension of10916// 8bit operands10917int encode = dst->encoding();10918encode = prefixq_and_encode(encode);10919emit_int16((unsigned char)0xF7, (0xC0 | encode));10920emit_int32(imm32);10921}1092210923void Assembler::testq(Register dst, Register src) {10924(void) prefixq_and_encode(dst->encoding(), src->encoding());10925emit_arith(0x85, 0xC0, dst, src);10926}1092710928void Assembler::testq(Register dst, Address src) {10929InstructionMark im(this);10930emit_int16(get_prefixq(src, dst), (unsigned char)0x85);10931emit_operand(dst, src);10932}1093310934void Assembler::xaddq(Address dst, Register src) {10935InstructionMark im(this);10936emit_int24(get_prefixq(dst, src), 0x0F, (unsigned char)0xC1);10937emit_operand(src, dst);10938}1093910940void Assembler::xchgq(Register dst, Address src) {10941InstructionMark im(this);10942emit_int16(get_prefixq(src, dst), (unsigned char)0x87);10943emit_operand(dst, src);10944}1094510946void Assembler::xchgq(Register dst, Register src) {10947int encode = prefixq_and_encode(dst->encoding(), src->encoding());10948emit_int16((unsigned char)0x87, (0xc0 | encode));10949}1095010951void Assembler::xorq(Register dst, Register src) {10952(void) prefixq_and_encode(dst->encoding(), src->encoding());10953emit_arith(0x33, 0xC0, dst, src);10954}1095510956void Assembler::xorq(Register dst, Address src) {10957InstructionMark im(this);10958emit_int16(get_prefixq(src, dst), 0x33);10959emit_operand(dst, src);10960}1096110962void Assembler::xorq(Register dst, int32_t imm32) {10963(void) prefixq_and_encode(dst->encoding());10964emit_arith(0x81, 0xF0, dst, imm32);10965}1096610967void Assembler::xorq(Address dst, int32_t imm32) {10968InstructionMark im(this);10969prefixq(dst);10970emit_arith_operand(0x81, as_Register(6), dst, imm32);10971}1097210973void Assembler::xorq(Address dst, Register src) {10974InstructionMark im(this);10975emit_int16(get_prefixq(dst, src), 0x31);10976emit_operand(src, dst);10977}1097810979#endif // !LP641098010981void InstructionAttr::set_address_attributes(int tuple_type, int input_size_in_bits) {10982if (VM_Version::supports_evex()) {10983_tuple_type = tuple_type;10984_input_size_in_bits = input_size_in_bits;10985}10986}109871098810989