Path: blob/master/src/hotspot/cpu/x86/assembler_x86.cpp
41145 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;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}25732574// This instruction produces ZF or CF flags2575void Assembler::kortestbl(KRegister src1, KRegister src2) {2576assert(VM_Version::supports_avx512dq(), "");2577InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2578int encode = vex_prefix_and_encode(src1->encoding(), 0, src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2579emit_int16((unsigned char)0x98, (0xC0 | encode));2580}25812582// This instruction produces ZF or CF flags2583void Assembler::kortestwl(KRegister src1, KRegister src2) {2584assert(VM_Version::supports_evex(), "");2585InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2586int encode = vex_prefix_and_encode(src1->encoding(), 0, src2->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2587emit_int16((unsigned char)0x98, (0xC0 | encode));2588}25892590// This instruction produces ZF or CF flags2591void Assembler::kortestdl(KRegister src1, KRegister src2) {2592assert(VM_Version::supports_avx512bw(), "");2593InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2594int encode = vex_prefix_and_encode(src1->encoding(), 0, src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2595emit_int16((unsigned char)0x98, (0xC0 | encode));2596}25972598// This instruction produces ZF or CF flags2599void Assembler::kortestql(KRegister src1, KRegister src2) {2600assert(VM_Version::supports_avx512bw(), "");2601InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2602int encode = vex_prefix_and_encode(src1->encoding(), 0, src2->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2603emit_int16((unsigned char)0x98, (0xC0 | encode));2604}26052606// This instruction produces ZF or CF flags2607void Assembler::ktestql(KRegister src1, KRegister src2) {2608assert(VM_Version::supports_avx512bw(), "");2609InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);2610int encode = vex_prefix_and_encode(src1->encoding(), 0, src2->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);2611emit_int16((unsigned char)0x99, (0xC0 | encode));2612}26132614void Assembler::ktestq(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::ktestd(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_66, VEX_OPCODE_0F, &attributes);2625emit_int16((unsigned char)0x99, (0xC0 | encode));2626}26272628void Assembler::movb(Address dst, int imm8) {2629InstructionMark im(this);2630prefix(dst);2631emit_int8((unsigned char)0xC6);2632emit_operand(rax, dst, 1);2633emit_int8(imm8);2634}263526362637void Assembler::movb(Address dst, Register src) {2638assert(src->has_byte_register(), "must have byte register");2639InstructionMark im(this);2640prefix(dst, src, true);2641emit_int8((unsigned char)0x88);2642emit_operand(src, dst);2643}26442645void Assembler::movdl(XMMRegister dst, Register src) {2646NOT_LP64(assert(VM_Version::supports_sse2(), ""));2647InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);2648int encode = simd_prefix_and_encode(dst, xnoreg, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2649emit_int16(0x6E, (0xC0 | encode));2650}26512652void Assembler::movdl(Register dst, XMMRegister 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);2655// swap src/dst to get correct prefix2656int encode = simd_prefix_and_encode(src, xnoreg, as_XMMRegister(dst->encoding()), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2657emit_int16(0x7E, (0xC0 | encode));2658}26592660void Assembler::movdl(XMMRegister dst, Address src) {2661NOT_LP64(assert(VM_Version::supports_sse2(), ""));2662InstructionMark im(this);2663InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);2664attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);2665simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2666emit_int8(0x6E);2667emit_operand(dst, src);2668}26692670void Assembler::movdl(Address dst, XMMRegister src) {2671NOT_LP64(assert(VM_Version::supports_sse2(), ""));2672InstructionMark im(this);2673InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);2674attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);2675simd_prefix(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2676emit_int8(0x7E);2677emit_operand(src, dst);2678}26792680void Assembler::movdqa(XMMRegister dst, XMMRegister src) {2681NOT_LP64(assert(VM_Version::supports_sse2(), ""));2682InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2683int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2684emit_int16(0x6F, (0xC0 | encode));2685}26862687void Assembler::movdqa(XMMRegister dst, Address src) {2688NOT_LP64(assert(VM_Version::supports_sse2(), ""));2689InstructionMark im(this);2690InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2691attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2692simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);2693emit_int8(0x6F);2694emit_operand(dst, src);2695}26962697void Assembler::movdqu(XMMRegister dst, Address src) {2698NOT_LP64(assert(VM_Version::supports_sse2(), ""));2699InstructionMark im(this);2700InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2701attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2702simd_prefix(dst, xnoreg, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2703emit_int8(0x6F);2704emit_operand(dst, src);2705}27062707void Assembler::movdqu(XMMRegister dst, XMMRegister src) {2708NOT_LP64(assert(VM_Version::supports_sse2(), ""));2709InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2710int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2711emit_int16(0x6F, (0xC0 | encode));2712}27132714void Assembler::movdqu(Address dst, XMMRegister src) {2715NOT_LP64(assert(VM_Version::supports_sse2(), ""));2716InstructionMark im(this);2717InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2718attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2719attributes.reset_is_clear_context();2720simd_prefix(src, xnoreg, dst, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2721emit_int8(0x7F);2722emit_operand(src, dst);2723}27242725// Move Unaligned 256bit Vector2726void Assembler::vmovdqu(XMMRegister dst, XMMRegister src) {2727assert(UseAVX > 0, "");2728InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2729int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2730emit_int16(0x6F, (0xC0 | encode));2731}27322733void Assembler::vmovdqu(XMMRegister dst, Address src) {2734assert(UseAVX > 0, "");2735InstructionMark im(this);2736InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2737attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2738vex_prefix(src, 0, dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2739emit_int8(0x6F);2740emit_operand(dst, src);2741}27422743void Assembler::vmovdqu(Address dst, XMMRegister src) {2744assert(UseAVX > 0, "");2745InstructionMark im(this);2746InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);2747attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2748attributes.reset_is_clear_context();2749// swap src<->dst for encoding2750assert(src != xnoreg, "sanity");2751vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2752emit_int8(0x7F);2753emit_operand(src, dst);2754}27552756// Move Unaligned EVEX enabled Vector (programmable : 8,16,32,64)2757void Assembler::evmovdqub(XMMRegister dst, XMMRegister src, bool merge, int vector_len) {2758assert(VM_Version::supports_evex(), "");2759InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);2760attributes.set_is_evex_instruction();2761if (merge) {2762attributes.reset_is_clear_context();2763}2764int prefix = (_legacy_mode_bw) ? VEX_SIMD_F2 : VEX_SIMD_F3;2765int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), (Assembler::VexSimdPrefix)prefix, VEX_OPCODE_0F, &attributes);2766emit_int16(0x6F, (0xC0 | encode));2767}27682769void Assembler::evmovdqub(XMMRegister dst, Address src, bool merge, int vector_len) {2770assert(VM_Version::supports_evex(), "");2771InstructionMark im(this);2772InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);2773int prefix = (_legacy_mode_bw) ? VEX_SIMD_F2 : VEX_SIMD_F3;2774attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2775attributes.set_is_evex_instruction();2776if (merge) {2777attributes.reset_is_clear_context();2778}2779vex_prefix(src, 0, dst->encoding(), (Assembler::VexSimdPrefix)prefix, VEX_OPCODE_0F, &attributes);2780emit_int8(0x6F);2781emit_operand(dst, src);2782}27832784void Assembler::evmovdqub(Address dst, XMMRegister src, bool merge, int vector_len) {2785assert(VM_Version::supports_evex(), "");2786assert(src != xnoreg, "sanity");2787InstructionMark im(this);2788InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);2789int prefix = (_legacy_mode_bw) ? VEX_SIMD_F2 : VEX_SIMD_F3;2790attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2791attributes.set_is_evex_instruction();2792if (merge) {2793attributes.reset_is_clear_context();2794}2795vex_prefix(dst, 0, src->encoding(), (Assembler::VexSimdPrefix)prefix, VEX_OPCODE_0F, &attributes);2796emit_int8(0x7F);2797emit_operand(src, dst);2798}27992800void Assembler::evmovdqub(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) {2801assert(VM_Version::supports_avx512vlbw(), "");2802InstructionMark im(this);2803InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);2804attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2805attributes.set_embedded_opmask_register_specifier(mask);2806attributes.set_is_evex_instruction();2807if (merge) {2808attributes.reset_is_clear_context();2809}2810vex_prefix(src, 0, dst->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);2811emit_int8(0x6F);2812emit_operand(dst, src);2813}28142815void Assembler::evmovdqub(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {2816assert(VM_Version::supports_avx512vlbw(), "");2817assert(src != xnoreg, "sanity");2818InstructionMark im(this);2819InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);2820attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2821attributes.set_embedded_opmask_register_specifier(mask);2822attributes.set_is_evex_instruction();2823if (merge) {2824attributes.reset_is_clear_context();2825}2826vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);2827emit_int8(0x7F);2828emit_operand(src, dst);2829}28302831void Assembler::evmovdquw(XMMRegister dst, Address src, bool merge, int vector_len) {2832assert(VM_Version::supports_evex(), "");2833InstructionMark im(this);2834InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);2835attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2836attributes.set_is_evex_instruction();2837if (merge) {2838attributes.reset_is_clear_context();2839}2840int prefix = (_legacy_mode_bw) ? VEX_SIMD_F2 : VEX_SIMD_F3;2841vex_prefix(src, 0, dst->encoding(), (Assembler::VexSimdPrefix)prefix, VEX_OPCODE_0F, &attributes);2842emit_int8(0x6F);2843emit_operand(dst, src);2844}28452846void Assembler::evmovdquw(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) {2847assert(VM_Version::supports_avx512vlbw(), "");2848InstructionMark im(this);2849InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);2850attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2851attributes.set_embedded_opmask_register_specifier(mask);2852attributes.set_is_evex_instruction();2853if (merge) {2854attributes.reset_is_clear_context();2855}2856vex_prefix(src, 0, dst->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);2857emit_int8(0x6F);2858emit_operand(dst, src);2859}28602861void Assembler::evmovdquw(Address dst, XMMRegister src, bool merge, int vector_len) {2862assert(VM_Version::supports_evex(), "");2863assert(src != xnoreg, "sanity");2864InstructionMark im(this);2865InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);2866attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2867attributes.set_is_evex_instruction();2868if (merge) {2869attributes.reset_is_clear_context();2870}2871int prefix = (_legacy_mode_bw) ? VEX_SIMD_F2 : VEX_SIMD_F3;2872vex_prefix(dst, 0, src->encoding(), (Assembler::VexSimdPrefix)prefix, VEX_OPCODE_0F, &attributes);2873emit_int8(0x7F);2874emit_operand(src, dst);2875}28762877void Assembler::evmovdquw(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {2878assert(VM_Version::supports_avx512vlbw(), "");2879assert(src != xnoreg, "sanity");2880InstructionMark im(this);2881InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);2882attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2883attributes.set_embedded_opmask_register_specifier(mask);2884attributes.set_is_evex_instruction();2885if (merge) {2886attributes.reset_is_clear_context();2887}2888vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);2889emit_int8(0x7F);2890emit_operand(src, dst);2891}28922893void Assembler::evmovdqul(XMMRegister dst, XMMRegister src, int vector_len) {2894// Unmasked instruction2895evmovdqul(dst, k0, src, /*merge*/ false, vector_len);2896}28972898void Assembler::evmovdqul(XMMRegister dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {2899assert(VM_Version::supports_evex(), "");2900InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);2901attributes.set_embedded_opmask_register_specifier(mask);2902attributes.set_is_evex_instruction();2903if (merge) {2904attributes.reset_is_clear_context();2905}2906int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2907emit_int16(0x6F, (0xC0 | encode));2908}29092910void Assembler::evmovdqul(XMMRegister dst, Address src, int vector_len) {2911// Unmasked instruction2912evmovdqul(dst, k0, src, /*merge*/ false, vector_len);2913}29142915void Assembler::evmovdqul(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) {2916assert(VM_Version::supports_evex(), "");2917InstructionMark im(this);2918InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false , /* uses_vl */ true);2919attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2920attributes.set_embedded_opmask_register_specifier(mask);2921attributes.set_is_evex_instruction();2922if (merge) {2923attributes.reset_is_clear_context();2924}2925vex_prefix(src, 0, dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2926emit_int8(0x6F);2927emit_operand(dst, src);2928}29292930void Assembler::evmovdqul(Address dst, XMMRegister src, int vector_len) {2931// Unmasked isntruction2932evmovdqul(dst, k0, src, /*merge*/ true, vector_len);2933}29342935void Assembler::evmovdqul(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {2936assert(VM_Version::supports_evex(), "");2937assert(src != xnoreg, "sanity");2938InstructionMark im(this);2939InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);2940attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2941attributes.set_embedded_opmask_register_specifier(mask);2942attributes.set_is_evex_instruction();2943if (merge) {2944attributes.reset_is_clear_context();2945}2946vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2947emit_int8(0x7F);2948emit_operand(src, dst);2949}29502951void Assembler::evmovdquq(XMMRegister dst, XMMRegister src, int vector_len) {2952// Unmasked instruction2953if (dst->encoding() == src->encoding()) return;2954evmovdquq(dst, k0, src, /*merge*/ false, vector_len);2955}29562957void Assembler::evmovdquq(XMMRegister dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {2958assert(VM_Version::supports_evex(), "");2959InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);2960attributes.set_embedded_opmask_register_specifier(mask);2961attributes.set_is_evex_instruction();2962if (merge) {2963attributes.reset_is_clear_context();2964}2965int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2966emit_int16(0x6F, (0xC0 | encode));2967}29682969void Assembler::evmovdquq(XMMRegister dst, Address src, int vector_len) {2970// Unmasked instruction2971evmovdquq(dst, k0, src, /*merge*/ false, vector_len);2972}29732974void Assembler::evmovdquq(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) {2975assert(VM_Version::supports_evex(), "");2976InstructionMark im(this);2977InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);2978attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);2979attributes.set_embedded_opmask_register_specifier(mask);2980attributes.set_is_evex_instruction();2981if (merge) {2982attributes.reset_is_clear_context();2983}2984vex_prefix(src, 0, dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);2985emit_int8(0x6F);2986emit_operand(dst, src);2987}29882989void Assembler::evmovdquq(Address dst, XMMRegister src, int vector_len) {2990// Unmasked instruction2991evmovdquq(dst, k0, src, /*merge*/ true, vector_len);2992}29932994void Assembler::evmovdquq(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {2995assert(VM_Version::supports_evex(), "");2996assert(src != xnoreg, "sanity");2997InstructionMark im(this);2998InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);2999attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);3000attributes.set_embedded_opmask_register_specifier(mask);3001if (merge) {3002attributes.reset_is_clear_context();3003}3004attributes.set_is_evex_instruction();3005vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);3006emit_int8(0x7F);3007emit_operand(src, dst);3008}30093010// Uses zero extension on 64bit30113012void Assembler::movl(Register dst, int32_t imm32) {3013int encode = prefix_and_encode(dst->encoding());3014emit_int8(0xB8 | encode);3015emit_int32(imm32);3016}30173018void Assembler::movl(Register dst, Register src) {3019int encode = prefix_and_encode(dst->encoding(), src->encoding());3020emit_int16((unsigned char)0x8B, (0xC0 | encode));3021}30223023void Assembler::movl(Register dst, Address src) {3024InstructionMark im(this);3025prefix(src, dst);3026emit_int8((unsigned char)0x8B);3027emit_operand(dst, src);3028}30293030void Assembler::movl(Address dst, int32_t imm32) {3031InstructionMark im(this);3032prefix(dst);3033emit_int8((unsigned char)0xC7);3034emit_operand(rax, dst, 4);3035emit_int32(imm32);3036}30373038void Assembler::movl(Address dst, Register src) {3039InstructionMark im(this);3040prefix(dst, src);3041emit_int8((unsigned char)0x89);3042emit_operand(src, dst);3043}30443045// New cpus require to use movsd and movss to avoid partial register stall3046// when loading from memory. But for old Opteron use movlpd instead of movsd.3047// The selection is done in MacroAssembler::movdbl() and movflt().3048void Assembler::movlpd(XMMRegister dst, Address src) {3049NOT_LP64(assert(VM_Version::supports_sse2(), ""));3050InstructionMark im(this);3051InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3052attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);3053attributes.set_rex_vex_w_reverted();3054simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3055emit_int8(0x12);3056emit_operand(dst, src);3057}30583059void Assembler::movq(XMMRegister dst, Address src) {3060NOT_LP64(assert(VM_Version::supports_sse2(), ""));3061InstructionMark im(this);3062InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3063attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);3064attributes.set_rex_vex_w_reverted();3065simd_prefix(dst, xnoreg, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);3066emit_int8(0x7E);3067emit_operand(dst, src);3068}30693070void Assembler::movq(Address dst, XMMRegister src) {3071NOT_LP64(assert(VM_Version::supports_sse2(), ""));3072InstructionMark im(this);3073InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3074attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);3075attributes.set_rex_vex_w_reverted();3076simd_prefix(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3077emit_int8((unsigned char)0xD6);3078emit_operand(src, dst);3079}30803081void Assembler::movq(XMMRegister dst, XMMRegister src) {3082NOT_LP64(assert(VM_Version::supports_sse2(), ""));3083InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3084attributes.set_rex_vex_w_reverted();3085int encode = simd_prefix_and_encode(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3086emit_int16((unsigned char)0xD6, (0xC0 | encode));3087}30883089void Assembler::movq(Register dst, XMMRegister src) {3090NOT_LP64(assert(VM_Version::supports_sse2(), ""));3091InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3092// swap src/dst to get correct prefix3093int encode = simd_prefix_and_encode(src, xnoreg, as_XMMRegister(dst->encoding()), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3094emit_int16(0x7E, (0xC0 | encode));3095}30963097void Assembler::movq(XMMRegister dst, Register src) {3098NOT_LP64(assert(VM_Version::supports_sse2(), ""));3099InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3100int encode = simd_prefix_and_encode(dst, xnoreg, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3101emit_int16(0x6E, (0xC0 | encode));3102}31033104void Assembler::movsbl(Register dst, Address src) { // movsxb3105InstructionMark im(this);3106prefix(src, dst);3107emit_int16(0x0F, (unsigned char)0xBE);3108emit_operand(dst, src);3109}31103111void Assembler::movsbl(Register dst, Register src) { // movsxb3112NOT_LP64(assert(src->has_byte_register(), "must have byte register"));3113int encode = prefix_and_encode(dst->encoding(), false, src->encoding(), true);3114emit_int24(0x0F, (unsigned char)0xBE, (0xC0 | encode));3115}31163117void Assembler::movsd(XMMRegister dst, XMMRegister src) {3118NOT_LP64(assert(VM_Version::supports_sse2(), ""));3119InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3120attributes.set_rex_vex_w_reverted();3121int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);3122emit_int16(0x10, (0xC0 | encode));3123}31243125void Assembler::movsd(XMMRegister dst, Address src) {3126NOT_LP64(assert(VM_Version::supports_sse2(), ""));3127InstructionMark im(this);3128InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3129attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);3130attributes.set_rex_vex_w_reverted();3131simd_prefix(dst, xnoreg, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);3132emit_int8(0x10);3133emit_operand(dst, src);3134}31353136void Assembler::movsd(Address dst, XMMRegister src) {3137NOT_LP64(assert(VM_Version::supports_sse2(), ""));3138InstructionMark im(this);3139InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3140attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);3141attributes.reset_is_clear_context();3142attributes.set_rex_vex_w_reverted();3143simd_prefix(src, xnoreg, dst, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);3144emit_int8(0x11);3145emit_operand(src, dst);3146}31473148void Assembler::movss(XMMRegister dst, XMMRegister src) {3149NOT_LP64(assert(VM_Version::supports_sse(), ""));3150InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3151int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);3152emit_int16(0x10, (0xC0 | encode));3153}31543155void Assembler::movss(XMMRegister dst, Address src) {3156NOT_LP64(assert(VM_Version::supports_sse(), ""));3157InstructionMark im(this);3158InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3159attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);3160simd_prefix(dst, xnoreg, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);3161emit_int8(0x10);3162emit_operand(dst, src);3163}31643165void Assembler::movss(Address dst, XMMRegister src) {3166NOT_LP64(assert(VM_Version::supports_sse(), ""));3167InstructionMark im(this);3168InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3169attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);3170attributes.reset_is_clear_context();3171simd_prefix(src, xnoreg, dst, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);3172emit_int8(0x11);3173emit_operand(src, dst);3174}31753176void Assembler::movswl(Register dst, Address src) { // movsxw3177InstructionMark im(this);3178prefix(src, dst);3179emit_int16(0x0F, (unsigned char)0xBF);3180emit_operand(dst, src);3181}31823183void Assembler::movswl(Register dst, Register src) { // movsxw3184int encode = prefix_and_encode(dst->encoding(), src->encoding());3185emit_int24(0x0F, (unsigned char)0xBF, (0xC0 | encode));3186}31873188void Assembler::movw(Address dst, int imm16) {3189InstructionMark im(this);31903191emit_int8(0x66); // switch to 16-bit mode3192prefix(dst);3193emit_int8((unsigned char)0xC7);3194emit_operand(rax, dst, 2);3195emit_int16(imm16);3196}31973198void Assembler::movw(Register dst, Address src) {3199InstructionMark im(this);3200emit_int8(0x66);3201prefix(src, dst);3202emit_int8((unsigned char)0x8B);3203emit_operand(dst, src);3204}32053206void Assembler::movw(Address dst, Register src) {3207InstructionMark im(this);3208emit_int8(0x66);3209prefix(dst, src);3210emit_int8((unsigned char)0x89);3211emit_operand(src, dst);3212}32133214void Assembler::movzbl(Register dst, Address src) { // movzxb3215InstructionMark im(this);3216prefix(src, dst);3217emit_int16(0x0F, (unsigned char)0xB6);3218emit_operand(dst, src);3219}32203221void Assembler::movzbl(Register dst, Register src) { // movzxb3222NOT_LP64(assert(src->has_byte_register(), "must have byte register"));3223int encode = prefix_and_encode(dst->encoding(), false, src->encoding(), true);3224emit_int24(0x0F, (unsigned char)0xB6, 0xC0 | encode);3225}32263227void Assembler::movzwl(Register dst, Address src) { // movzxw3228InstructionMark im(this);3229prefix(src, dst);3230emit_int16(0x0F, (unsigned char)0xB7);3231emit_operand(dst, src);3232}32333234void Assembler::movzwl(Register dst, Register src) { // movzxw3235int encode = prefix_and_encode(dst->encoding(), src->encoding());3236emit_int24(0x0F, (unsigned char)0xB7, 0xC0 | encode);3237}32383239void Assembler::mull(Address src) {3240InstructionMark im(this);3241prefix(src);3242emit_int8((unsigned char)0xF7);3243emit_operand(rsp, src);3244}32453246void Assembler::mull(Register src) {3247int encode = prefix_and_encode(src->encoding());3248emit_int16((unsigned char)0xF7, (0xE0 | encode));3249}32503251void Assembler::mulsd(XMMRegister dst, Address src) {3252NOT_LP64(assert(VM_Version::supports_sse2(), ""));3253InstructionMark im(this);3254InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3255attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);3256attributes.set_rex_vex_w_reverted();3257simd_prefix(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);3258emit_int8(0x59);3259emit_operand(dst, src);3260}32613262void Assembler::mulsd(XMMRegister dst, XMMRegister src) {3263NOT_LP64(assert(VM_Version::supports_sse2(), ""));3264InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3265attributes.set_rex_vex_w_reverted();3266int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);3267emit_int16(0x59, (0xC0 | encode));3268}32693270void Assembler::mulss(XMMRegister dst, Address src) {3271NOT_LP64(assert(VM_Version::supports_sse(), ""));3272InstructionMark im(this);3273InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3274attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);3275simd_prefix(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);3276emit_int8(0x59);3277emit_operand(dst, src);3278}32793280void Assembler::mulss(XMMRegister dst, XMMRegister src) {3281NOT_LP64(assert(VM_Version::supports_sse(), ""));3282InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3283int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);3284emit_int16(0x59, (0xC0 | encode));3285}32863287void Assembler::negl(Register dst) {3288int encode = prefix_and_encode(dst->encoding());3289emit_int16((unsigned char)0xF7, (0xD8 | encode));3290}32913292void Assembler::negl(Address dst) {3293InstructionMark im(this);3294prefix(dst);3295emit_int8((unsigned char)0xF7);3296emit_operand(as_Register(3), dst);3297}32983299void Assembler::nop(int i) {3300#ifdef ASSERT3301assert(i > 0, " ");3302// The fancy nops aren't currently recognized by debuggers making it a3303// pain to disassemble code while debugging. If asserts are on clearly3304// speed is not an issue so simply use the single byte traditional nop3305// to do alignment.33063307for (; i > 0 ; i--) emit_int8((unsigned char)0x90);3308return;33093310#endif // ASSERT33113312if (UseAddressNop && VM_Version::is_intel()) {3313//3314// Using multi-bytes nops "0x0F 0x1F [address]" for Intel3315// 1: 0x903316// 2: 0x66 0x903317// 3: 0x66 0x66 0x90 (don't use "0x0F 0x1F 0x00" - need patching safe padding)3318// 4: 0x0F 0x1F 0x40 0x003319// 5: 0x0F 0x1F 0x44 0x00 0x003320// 6: 0x66 0x0F 0x1F 0x44 0x00 0x003321// 7: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x003322// 8: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003323// 9: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003324// 10: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003325// 11: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x0033263327// The rest coding is Intel specific - don't use consecutive address nops33283329// 12: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x903330// 13: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x903331// 14: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x903332// 15: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x9033333334while(i >= 15) {3335// For Intel don't generate consecutive addess nops (mix with regular nops)3336i -= 15;3337emit_int24(0x66, 0x66, 0x66);3338addr_nop_8();3339emit_int32(0x66, 0x66, 0x66, (unsigned char)0x90);3340}3341switch (i) {3342case 14:3343emit_int8(0x66); // size prefix3344case 13:3345emit_int8(0x66); // size prefix3346case 12:3347addr_nop_8();3348emit_int32(0x66, 0x66, 0x66, (unsigned char)0x90);3349break;3350case 11:3351emit_int8(0x66); // size prefix3352case 10:3353emit_int8(0x66); // size prefix3354case 9:3355emit_int8(0x66); // size prefix3356case 8:3357addr_nop_8();3358break;3359case 7:3360addr_nop_7();3361break;3362case 6:3363emit_int8(0x66); // size prefix3364case 5:3365addr_nop_5();3366break;3367case 4:3368addr_nop_4();3369break;3370case 3:3371// Don't use "0x0F 0x1F 0x00" - need patching safe padding3372emit_int8(0x66); // size prefix3373case 2:3374emit_int8(0x66); // size prefix3375case 1:3376emit_int8((unsigned char)0x90);3377// nop3378break;3379default:3380assert(i == 0, " ");3381}3382return;3383}3384if (UseAddressNop && VM_Version::is_amd_family()) {3385//3386// Using multi-bytes nops "0x0F 0x1F [address]" for AMD.3387// 1: 0x903388// 2: 0x66 0x903389// 3: 0x66 0x66 0x90 (don't use "0x0F 0x1F 0x00" - need patching safe padding)3390// 4: 0x0F 0x1F 0x40 0x003391// 5: 0x0F 0x1F 0x44 0x00 0x003392// 6: 0x66 0x0F 0x1F 0x44 0x00 0x003393// 7: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x003394// 8: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003395// 9: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003396// 10: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003397// 11: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x0033983399// The rest coding is AMD specific - use consecutive address nops34003401// 12: 0x66 0x0F 0x1F 0x44 0x00 0x00 0x66 0x0F 0x1F 0x44 0x00 0x003402// 13: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00 0x66 0x0F 0x1F 0x44 0x00 0x003403// 14: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00 0x0F 0x1F 0x80 0x00 0x00 0x00 0x003404// 15: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x0F 0x1F 0x80 0x00 0x00 0x00 0x003405// 16: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003406// Size prefixes (0x66) are added for larger sizes34073408while(i >= 22) {3409i -= 11;3410emit_int24(0x66, 0x66, 0x66);3411addr_nop_8();3412}3413// Generate first nop for size between 21-123414switch (i) {3415case 21:3416i -= 1;3417emit_int8(0x66); // size prefix3418case 20:3419case 19:3420i -= 1;3421emit_int8(0x66); // size prefix3422case 18:3423case 17:3424i -= 1;3425emit_int8(0x66); // size prefix3426case 16:3427case 15:3428i -= 8;3429addr_nop_8();3430break;3431case 14:3432case 13:3433i -= 7;3434addr_nop_7();3435break;3436case 12:3437i -= 6;3438emit_int8(0x66); // size prefix3439addr_nop_5();3440break;3441default:3442assert(i < 12, " ");3443}34443445// Generate second nop for size between 11-13446switch (i) {3447case 11:3448emit_int8(0x66); // size prefix3449case 10:3450emit_int8(0x66); // size prefix3451case 9:3452emit_int8(0x66); // size prefix3453case 8:3454addr_nop_8();3455break;3456case 7:3457addr_nop_7();3458break;3459case 6:3460emit_int8(0x66); // size prefix3461case 5:3462addr_nop_5();3463break;3464case 4:3465addr_nop_4();3466break;3467case 3:3468// Don't use "0x0F 0x1F 0x00" - need patching safe padding3469emit_int8(0x66); // size prefix3470case 2:3471emit_int8(0x66); // size prefix3472case 1:3473emit_int8((unsigned char)0x90);3474// nop3475break;3476default:3477assert(i == 0, " ");3478}3479return;3480}34813482if (UseAddressNop && VM_Version::is_zx()) {3483//3484// Using multi-bytes nops "0x0F 0x1F [address]" for ZX3485// 1: 0x903486// 2: 0x66 0x903487// 3: 0x66 0x66 0x90 (don't use "0x0F 0x1F 0x00" - need patching safe padding)3488// 4: 0x0F 0x1F 0x40 0x003489// 5: 0x0F 0x1F 0x44 0x00 0x003490// 6: 0x66 0x0F 0x1F 0x44 0x00 0x003491// 7: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x003492// 8: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003493// 9: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003494// 10: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x003495// 11: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x0034963497// The rest coding is ZX specific - don't use consecutive address nops34983499// 12: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x903500// 13: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x903501// 14: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x903502// 15: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x9035033504while (i >= 15) {3505// For ZX don't generate consecutive addess nops (mix with regular nops)3506i -= 15;3507emit_int24(0x66, 0x66, 0x66);3508addr_nop_8();3509emit_int32(0x66, 0x66, 0x66, (unsigned char)0x90);3510}3511switch (i) {3512case 14:3513emit_int8(0x66); // size prefix3514case 13:3515emit_int8(0x66); // size prefix3516case 12:3517addr_nop_8();3518emit_int32(0x66, 0x66, 0x66, (unsigned char)0x90);3519break;3520case 11:3521emit_int8(0x66); // size prefix3522case 10:3523emit_int8(0x66); // size prefix3524case 9:3525emit_int8(0x66); // size prefix3526case 8:3527addr_nop_8();3528break;3529case 7:3530addr_nop_7();3531break;3532case 6:3533emit_int8(0x66); // size prefix3534case 5:3535addr_nop_5();3536break;3537case 4:3538addr_nop_4();3539break;3540case 3:3541// Don't use "0x0F 0x1F 0x00" - need patching safe padding3542emit_int8(0x66); // size prefix3543case 2:3544emit_int8(0x66); // size prefix3545case 1:3546emit_int8((unsigned char)0x90);3547// nop3548break;3549default:3550assert(i == 0, " ");3551}3552return;3553}35543555// Using nops with size prefixes "0x66 0x90".3556// From AMD Optimization Guide:3557// 1: 0x903558// 2: 0x66 0x903559// 3: 0x66 0x66 0x903560// 4: 0x66 0x66 0x66 0x903561// 5: 0x66 0x66 0x90 0x66 0x903562// 6: 0x66 0x66 0x90 0x66 0x66 0x903563// 7: 0x66 0x66 0x66 0x90 0x66 0x66 0x903564// 8: 0x66 0x66 0x66 0x90 0x66 0x66 0x66 0x903565// 9: 0x66 0x66 0x90 0x66 0x66 0x90 0x66 0x66 0x903566// 10: 0x66 0x66 0x66 0x90 0x66 0x66 0x90 0x66 0x66 0x903567//3568while (i > 12) {3569i -= 4;3570emit_int32(0x66, 0x66, 0x66, (unsigned char)0x90);3571}3572// 1 - 12 nops3573if (i > 8) {3574if (i > 9) {3575i -= 1;3576emit_int8(0x66);3577}3578i -= 3;3579emit_int24(0x66, 0x66, (unsigned char)0x90);3580}3581// 1 - 8 nops3582if (i > 4) {3583if (i > 6) {3584i -= 1;3585emit_int8(0x66);3586}3587i -= 3;3588emit_int24(0x66, 0x66, (unsigned char)0x90);3589}3590switch (i) {3591case 4:3592emit_int8(0x66);3593case 3:3594emit_int8(0x66);3595case 2:3596emit_int8(0x66);3597case 1:3598emit_int8((unsigned char)0x90);3599break;3600default:3601assert(i == 0, " ");3602}3603}36043605void Assembler::notl(Register dst) {3606int encode = prefix_and_encode(dst->encoding());3607emit_int16((unsigned char)0xF7, (0xD0 | encode));3608}36093610void Assembler::orw(Register dst, Register src) {3611(void)prefix_and_encode(dst->encoding(), src->encoding());3612emit_arith(0x0B, 0xC0, dst, src);3613}36143615void Assembler::orl(Address dst, int32_t imm32) {3616InstructionMark im(this);3617prefix(dst);3618emit_arith_operand(0x81, rcx, dst, imm32);3619}36203621void Assembler::orl(Register dst, int32_t imm32) {3622prefix(dst);3623emit_arith(0x81, 0xC8, dst, imm32);3624}36253626void Assembler::orl(Register dst, Address src) {3627InstructionMark im(this);3628prefix(src, dst);3629emit_int8(0x0B);3630emit_operand(dst, src);3631}36323633void Assembler::orl(Register dst, Register src) {3634(void) prefix_and_encode(dst->encoding(), src->encoding());3635emit_arith(0x0B, 0xC0, dst, src);3636}36373638void Assembler::orl(Address dst, Register src) {3639InstructionMark im(this);3640prefix(dst, src);3641emit_int8(0x09);3642emit_operand(src, dst);3643}36443645void Assembler::orb(Address dst, int imm8) {3646InstructionMark im(this);3647prefix(dst);3648emit_int8((unsigned char)0x80);3649emit_operand(rcx, dst, 1);3650emit_int8(imm8);3651}36523653void Assembler::orb(Address dst, Register src) {3654InstructionMark im(this);3655prefix(dst, src, true);3656emit_int8(0x08);3657emit_operand(src, dst);3658}36593660void Assembler::packsswb(XMMRegister dst, XMMRegister src) {3661NOT_LP64(assert(VM_Version::supports_sse2(), ""));3662InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3663int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3664emit_int16(0x63, (0xC0 | encode));3665}36663667void Assembler::vpacksswb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3668assert(UseAVX > 0, "some form of AVX must be enabled");3669InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3670int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3671emit_int16(0x63, (0xC0 | encode));3672}36733674void Assembler::packssdw(XMMRegister dst, XMMRegister src) {3675assert(VM_Version::supports_sse2(), "");3676InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3677int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3678emit_int16(0x6B, (0xC0 | encode));3679}36803681void Assembler::vpackssdw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3682assert(UseAVX > 0, "some form of AVX must be enabled");3683InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3684int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3685emit_int16(0x6B, (0xC0 | encode));3686}36873688void Assembler::packuswb(XMMRegister dst, Address src) {3689NOT_LP64(assert(VM_Version::supports_sse2(), ""));3690assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");3691InstructionMark im(this);3692InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3693attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);3694simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3695emit_int8(0x67);3696emit_operand(dst, src);3697}36983699void Assembler::packuswb(XMMRegister dst, XMMRegister src) {3700NOT_LP64(assert(VM_Version::supports_sse2(), ""));3701InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3702int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3703emit_int16(0x67, (0xC0 | encode));3704}37053706void Assembler::vpackuswb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3707assert(UseAVX > 0, "some form of AVX must be enabled");3708InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3709int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3710emit_int16(0x67, (0xC0 | encode));3711}37123713void Assembler::packusdw(XMMRegister dst, XMMRegister src) {3714assert(VM_Version::supports_sse4_1(), "");3715InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3716int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);3717emit_int16(0x2B, (0xC0 | encode));3718}37193720void Assembler::vpackusdw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3721assert(UseAVX > 0, "some form of AVX must be enabled");3722InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3723int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);3724emit_int16(0x2B, (0xC0 | encode));3725}37263727void Assembler::vpermq(XMMRegister dst, XMMRegister src, int imm8, int vector_len) {3728assert(VM_Version::supports_avx2(), "");3729assert(vector_len != AVX_128bit, "");3730// VEX.256.66.0F3A.W1 00 /r ib3731InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3732int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3733emit_int24(0x00, (0xC0 | encode), imm8);3734}37353736void Assembler::vpermq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3737assert(vector_len == AVX_256bit ? VM_Version::supports_avx512vl() :3738vector_len == AVX_512bit ? VM_Version::supports_evex() : false, "not supported");3739InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3740attributes.set_is_evex_instruction();3741int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);3742emit_int16(0x36, (0xC0 | encode));3743}37443745void Assembler::vpermb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3746assert(VM_Version::supports_avx512_vbmi(), "");3747InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3748attributes.set_is_evex_instruction();3749int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);3750emit_int16((unsigned char)0x8D, (0xC0 | encode));3751}37523753void Assembler::vpermw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3754assert(vector_len == AVX_128bit ? VM_Version::supports_avx512vlbw() :3755vector_len == AVX_256bit ? VM_Version::supports_avx512vlbw() :3756vector_len == AVX_512bit ? VM_Version::supports_avx512bw() : false, "not supported");3757InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);3758attributes.set_is_evex_instruction();3759int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);3760emit_int16((unsigned char)0x8D, (0xC0 | encode));3761}37623763void Assembler::vpermd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3764assert(vector_len <= AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_evex(), "");3765// VEX.NDS.256.66.0F38.W0 36 /r3766InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3767int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);3768emit_int16(0x36, (0xC0 | encode));3769}37703771void Assembler::vpermd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {3772assert(vector_len <= AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_evex(), "");3773// VEX.NDS.256.66.0F38.W0 36 /r3774InstructionMark im(this);3775InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3776vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);3777emit_int8(0x36);3778emit_operand(dst, src);3779}37803781void Assembler::vperm2i128(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8) {3782assert(VM_Version::supports_avx2(), "");3783InstructionAttr attributes(AVX_256bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3784int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3785emit_int24(0x46, (0xC0 | encode), imm8);3786}37873788void Assembler::vperm2f128(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8) {3789assert(VM_Version::supports_avx(), "");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(0x06, (0xC0 | encode), imm8);3793}37943795void Assembler::vpermilps(XMMRegister dst, XMMRegister src, int imm8, int vector_len) {3796assert(vector_len <= AVX_256bit ? VM_Version::supports_avx() : VM_Version::supports_evex(), "");3797InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);3798int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3799emit_int24(0x04, (0xC0 | encode), imm8);3800}38013802void Assembler::vpermilpd(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 */ VM_Version::supports_evex(),/* legacy_mode */ false,/* no_mask_reg */ true, /* uses_vl */ false);3805attributes.set_rex_vex_w_reverted();3806int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3807emit_int24(0x05, (0xC0 | encode), imm8);3808}38093810void Assembler::vpermpd(XMMRegister dst, XMMRegister src, int imm8, int vector_len) {3811assert(vector_len <= AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_evex(), "");3812InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */false, /* no_mask_reg */ true, /* uses_vl */ false);3813int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3814emit_int24(0x01, (0xC0 | encode), imm8);3815}38163817void Assembler::evpermi2q(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3818assert(VM_Version::supports_evex(), "");3819InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3820attributes.set_is_evex_instruction();3821int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);3822emit_int16(0x76, (0xC0 | encode));3823}38243825void Assembler::pause() {3826emit_int16((unsigned char)0xF3, (unsigned char)0x90);3827}38283829void Assembler::ud2() {3830emit_int16(0x0F, 0x0B);3831}38323833void Assembler::pcmpestri(XMMRegister dst, Address src, int imm8) {3834assert(VM_Version::supports_sse4_2(), "");3835InstructionMark im(this);3836InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3837simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3838emit_int8(0x61);3839emit_operand(dst, src);3840emit_int8(imm8);3841}38423843void Assembler::pcmpestri(XMMRegister dst, XMMRegister src, int imm8) {3844assert(VM_Version::supports_sse4_2(), "");3845InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3846int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3847emit_int24(0x61, (0xC0 | encode), imm8);3848}38493850// In this context, the dst vector contains the components that are equal, non equal components are zeroed in dst3851void Assembler::pcmpeqb(XMMRegister dst, XMMRegister src) {3852assert(VM_Version::supports_sse2(), "");3853InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3854int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3855emit_int16(0x74, (0xC0 | encode));3856}38573858void Assembler::vpcmpCCbwd(XMMRegister dst, XMMRegister nds, XMMRegister src, int cond_encoding, int vector_len) {3859assert(vector_len == AVX_128bit ? VM_Version::supports_avx() : VM_Version::supports_avx2(), "");3860assert(vector_len <= AVX_256bit, "evex encoding is different - has k register as dest");3861InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3862int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3863emit_int16(cond_encoding, (0xC0 | encode));3864}38653866// In this context, the dst vector contains the components that are equal, non equal components are zeroed in dst3867void Assembler::vpcmpeqb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3868assert(vector_len == AVX_128bit ? VM_Version::supports_avx() : VM_Version::supports_avx2(), "");3869assert(vector_len <= AVX_256bit, "evex encoding is different - has k register as dest");3870InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3871int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3872emit_int16(0x74, (0xC0 | encode));3873}38743875// In this context, kdst is written the mask used to process the equal components3876void Assembler::evpcmpeqb(KRegister kdst, XMMRegister nds, XMMRegister src, int vector_len) {3877assert(VM_Version::supports_avx512bw(), "");3878InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3879attributes.set_is_evex_instruction();3880int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3881emit_int16(0x74, (0xC0 | encode));3882}38833884void Assembler::evpcmpgtb(KRegister kdst, XMMRegister nds, Address src, int vector_len) {3885assert(VM_Version::supports_avx512vlbw(), "");3886InstructionMark im(this);3887InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3888attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);3889attributes.set_is_evex_instruction();3890int dst_enc = kdst->encoding();3891vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3892emit_int8(0x64);3893emit_operand(as_Register(dst_enc), src);3894}38953896void Assembler::evpcmpgtb(KRegister kdst, KRegister mask, XMMRegister nds, Address src, int vector_len) {3897assert(VM_Version::supports_avx512vlbw(), "");3898InstructionMark im(this);3899InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);3900attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);3901attributes.reset_is_clear_context();3902attributes.set_embedded_opmask_register_specifier(mask);3903attributes.set_is_evex_instruction();3904int dst_enc = kdst->encoding();3905vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3906emit_int8(0x64);3907emit_operand(as_Register(dst_enc), src);3908}39093910void Assembler::evpcmpuw(KRegister kdst, XMMRegister nds, XMMRegister src, ComparisonPredicate vcc, int vector_len) {3911assert(VM_Version::supports_avx512vlbw(), "");3912InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3913attributes.set_is_evex_instruction();3914int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3915emit_int24(0x3E, (0xC0 | encode), vcc);3916}39173918void Assembler::evpcmpuw(KRegister kdst, XMMRegister nds, Address src, ComparisonPredicate vcc, int vector_len) {3919assert(VM_Version::supports_avx512vlbw(), "");3920InstructionMark im(this);3921InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3922attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);3923attributes.set_is_evex_instruction();3924int dst_enc = kdst->encoding();3925vex_prefix(src, nds->encoding(), kdst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);3926emit_int8(0x3E);3927emit_operand(as_Register(dst_enc), src);3928emit_int8(vcc);3929}39303931void Assembler::evpcmpeqb(KRegister kdst, XMMRegister nds, Address src, int vector_len) {3932assert(VM_Version::supports_avx512bw(), "");3933InstructionMark im(this);3934InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3935attributes.set_is_evex_instruction();3936attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);3937int dst_enc = kdst->encoding();3938vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3939emit_int8(0x74);3940emit_operand(as_Register(dst_enc), src);3941}39423943void Assembler::evpcmpeqb(KRegister kdst, KRegister mask, XMMRegister nds, Address src, int vector_len) {3944assert(VM_Version::supports_avx512vlbw(), "");3945InstructionMark im(this);3946InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);3947attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);3948attributes.reset_is_clear_context();3949attributes.set_embedded_opmask_register_specifier(mask);3950attributes.set_is_evex_instruction();3951vex_prefix(src, nds->encoding(), kdst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3952emit_int8(0x74);3953emit_operand(as_Register(kdst->encoding()), src);3954}39553956// In this context, the dst vector contains the components that are equal, non equal components are zeroed in dst3957void Assembler::pcmpeqw(XMMRegister dst, XMMRegister src) {3958assert(VM_Version::supports_sse2(), "");3959InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3960int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3961emit_int16(0x75, (0xC0 | encode));3962}39633964// In this context, the dst vector contains the components that are equal, non equal components are zeroed in dst3965void Assembler::vpcmpeqw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {3966assert(vector_len == AVX_128bit ? VM_Version::supports_avx() : VM_Version::supports_avx2(), "");3967assert(vector_len <= AVX_256bit, "evex encoding is different - has k register as dest");3968InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3969int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3970emit_int16(0x75, (0xC0 | encode));3971}39723973// In this context, kdst is written the mask used to process the equal components3974void Assembler::evpcmpeqw(KRegister kdst, XMMRegister nds, XMMRegister src, int vector_len) {3975assert(VM_Version::supports_avx512bw(), "");3976InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3977attributes.set_is_evex_instruction();3978int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3979emit_int16(0x75, (0xC0 | encode));3980}39813982void Assembler::evpcmpeqw(KRegister kdst, XMMRegister nds, Address src, int vector_len) {3983assert(VM_Version::supports_avx512bw(), "");3984InstructionMark im(this);3985InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);3986attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);3987attributes.set_is_evex_instruction();3988int dst_enc = kdst->encoding();3989vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3990emit_int8(0x75);3991emit_operand(as_Register(dst_enc), src);3992}39933994// In this context, the dst vector contains the components that are equal, non equal components are zeroed in dst3995void Assembler::pcmpeqd(XMMRegister dst, XMMRegister src) {3996assert(VM_Version::supports_sse2(), "");3997InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);3998int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);3999emit_int16(0x76, (0xC0 | encode));4000}40014002// In this context, the dst vector contains the components that are equal, non equal components are zeroed in dst4003void Assembler::vpcmpeqd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {4004assert(vector_len == AVX_128bit ? VM_Version::supports_avx() : VM_Version::supports_avx2(), "");4005assert(vector_len <= AVX_256bit, "evex encoding is different - has k register as dest");4006InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4007int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4008emit_int16(0x76, (0xC0 | encode));4009}40104011// In this context, kdst is written the mask used to process the equal components4012void Assembler::evpcmpeqd(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src, int vector_len) {4013assert(VM_Version::supports_evex(), "");4014InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);4015attributes.set_is_evex_instruction();4016attributes.reset_is_clear_context();4017attributes.set_embedded_opmask_register_specifier(mask);4018int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4019emit_int16(0x76, (0xC0 | encode));4020}40214022void Assembler::evpcmpeqd(KRegister kdst, KRegister mask, XMMRegister nds, Address src, int vector_len) {4023assert(VM_Version::supports_evex(), "");4024InstructionMark im(this);4025InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);4026attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);4027attributes.set_is_evex_instruction();4028attributes.reset_is_clear_context();4029attributes.set_embedded_opmask_register_specifier(mask);4030int dst_enc = kdst->encoding();4031vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4032emit_int8(0x76);4033emit_operand(as_Register(dst_enc), src);4034}40354036// In this context, the dst vector contains the components that are equal, non equal components are zeroed in dst4037void Assembler::pcmpeqq(XMMRegister dst, XMMRegister src) {4038assert(VM_Version::supports_sse4_1(), "");4039InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4040int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4041emit_int16(0x29, (0xC0 | encode));4042}40434044void Assembler::vpcmpCCq(XMMRegister dst, XMMRegister nds, XMMRegister src, int cond_encoding, int vector_len) {4045assert(VM_Version::supports_avx(), "");4046InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4047int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4048emit_int16(cond_encoding, (0xC0 | encode));4049}40504051// In this context, the dst vector contains the components that are equal, non equal components are zeroed in dst4052void Assembler::vpcmpeqq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {4053assert(VM_Version::supports_avx(), "");4054InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4055int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4056emit_int16(0x29, (0xC0 | encode));4057}40584059// In this context, kdst is written the mask used to process the equal components4060void Assembler::evpcmpeqq(KRegister kdst, XMMRegister nds, XMMRegister src, int vector_len) {4061assert(VM_Version::supports_evex(), "");4062InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4063attributes.reset_is_clear_context();4064attributes.set_is_evex_instruction();4065int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4066emit_int16(0x29, (0xC0 | encode));4067}40684069// In this context, kdst is written the mask used to process the equal components4070void Assembler::evpcmpeqq(KRegister kdst, XMMRegister nds, Address src, int vector_len) {4071assert(VM_Version::supports_evex(), "");4072InstructionMark im(this);4073InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4074attributes.reset_is_clear_context();4075attributes.set_is_evex_instruction();4076attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);4077int dst_enc = kdst->encoding();4078vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4079emit_int8(0x29);4080emit_operand(as_Register(dst_enc), src);4081}40824083void Assembler::evpmovd2m(KRegister kdst, XMMRegister src, int vector_len) {4084assert(UseAVX > 2 && VM_Version::supports_avx512dq(), "");4085assert(vector_len == AVX_512bit || VM_Version::supports_avx512vl(), "");4086InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4087attributes.set_is_evex_instruction();4088int encode = vex_prefix_and_encode(kdst->encoding(), 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);4089emit_int16(0x39, (0xC0 | encode));4090}40914092void Assembler::evpmovq2m(KRegister kdst, XMMRegister src, int vector_len) {4093assert(UseAVX > 2 && VM_Version::supports_avx512dq(), "");4094assert(vector_len == AVX_512bit || VM_Version::supports_avx512vl(), "");4095InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4096attributes.set_is_evex_instruction();4097int encode = vex_prefix_and_encode(kdst->encoding(), 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);4098emit_int16(0x39, (0xC0 | encode));4099}41004101void Assembler::pcmpgtq(XMMRegister dst, XMMRegister src) {4102assert(VM_Version::supports_sse4_1(), "");4103InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4104int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4105emit_int16(0x37, (0xC0 | encode));4106}41074108void Assembler::pmovmskb(Register dst, XMMRegister src) {4109assert(VM_Version::supports_sse2(), "");4110InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4111int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4112emit_int16((unsigned char)0xD7, (0xC0 | encode));4113}41144115void Assembler::vpmovmskb(Register dst, XMMRegister src, int vec_enc) {4116assert((VM_Version::supports_avx() && vec_enc == AVX_128bit) ||4117(VM_Version::supports_avx2() && vec_enc == AVX_256bit), "");4118InstructionAttr attributes(vec_enc, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4119int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4120emit_int16((unsigned char)0xD7, (0xC0 | encode));4121}41224123void Assembler::pextrd(Register dst, XMMRegister src, int imm8) {4124assert(VM_Version::supports_sse4_1(), "");4125InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);4126int encode = simd_prefix_and_encode(src, xnoreg, as_XMMRegister(dst->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4127emit_int24(0x16, (0xC0 | encode), imm8);4128}41294130void Assembler::pextrd(Address 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);4133attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);4134simd_prefix(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4135emit_int8(0x16);4136emit_operand(src, dst);4137emit_int8(imm8);4138}41394140void Assembler::pextrq(Register dst, XMMRegister src, int imm8) {4141assert(VM_Version::supports_sse4_1(), "");4142InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);4143int encode = simd_prefix_and_encode(src, xnoreg, as_XMMRegister(dst->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4144emit_int24(0x16, (0xC0 | encode), imm8);4145}41464147void Assembler::pextrq(Address 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);4150attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);4151simd_prefix(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4152emit_int8(0x16);4153emit_operand(src, dst);4154emit_int8(imm8);4155}41564157void Assembler::pextrw(Register dst, XMMRegister src, int imm8) {4158assert(VM_Version::supports_sse2(), "");4159InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4160int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4161emit_int24((unsigned char)0xC5, (0xC0 | encode), imm8);4162}41634164void Assembler::pextrw(Address dst, XMMRegister src, int imm8) {4165assert(VM_Version::supports_sse4_1(), "");4166InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4167attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_16bit);4168simd_prefix(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4169emit_int8(0x15);4170emit_operand(src, dst);4171emit_int8(imm8);4172}41734174void Assembler::pextrb(Register dst, XMMRegister src, int imm8) {4175assert(VM_Version::supports_sse4_1(), "");4176InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4177int encode = simd_prefix_and_encode(src, xnoreg, as_XMMRegister(dst->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4178emit_int24(0x14, (0xC0 | encode), imm8);4179}41804181void Assembler::pextrb(Address 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);4184attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_8bit);4185simd_prefix(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4186emit_int8(0x14);4187emit_operand(src, dst);4188emit_int8(imm8);4189}41904191void Assembler::pinsrd(XMMRegister dst, Register src, int imm8) {4192assert(VM_Version::supports_sse4_1(), "");4193InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);4194int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4195emit_int24(0x22, (0xC0 | encode), imm8);4196}41974198void Assembler::pinsrd(XMMRegister dst, Address 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);4201attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);4202simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4203emit_int8(0x22);4204emit_operand(dst,src);4205emit_int8(imm8);4206}42074208void Assembler::vpinsrd(XMMRegister dst, XMMRegister nds, Register src, int imm8) {4209assert(VM_Version::supports_avx(), "");4210InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);4211int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4212emit_int24(0x22, (0xC0 | encode), imm8);4213}42144215void Assembler::pinsrq(XMMRegister dst, Register src, int imm8) {4216assert(VM_Version::supports_sse4_1(), "");4217InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);4218int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4219emit_int24(0x22, (0xC0 | encode), imm8);4220}42214222void Assembler::pinsrq(XMMRegister dst, Address 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);4225attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);4226simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4227emit_int8(0x22);4228emit_operand(dst, src);4229emit_int8(imm8);4230}42314232void Assembler::vpinsrq(XMMRegister dst, XMMRegister nds, Register src, int imm8) {4233assert(VM_Version::supports_avx(), "");4234InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);4235int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4236emit_int24(0x22, (0xC0 | encode), imm8);4237}42384239void Assembler::pinsrw(XMMRegister dst, Register src, int imm8) {4240assert(VM_Version::supports_sse2(), "");4241InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4242int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4243emit_int24((unsigned char)0xC4, (0xC0 | encode), imm8);4244}42454246void Assembler::pinsrw(XMMRegister dst, Address 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);4249attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_16bit);4250simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4251emit_int8((unsigned char)0xC4);4252emit_operand(dst, src);4253emit_int8(imm8);4254}42554256void Assembler::vpinsrw(XMMRegister dst, XMMRegister nds, Register src, int imm8) {4257assert(VM_Version::supports_avx(), "");4258InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4259int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4260emit_int24((unsigned char)0xC4, (0xC0 | encode), imm8);4261}42624263void Assembler::pinsrb(XMMRegister dst, Address src, int imm8) {4264assert(VM_Version::supports_sse4_1(), "");4265InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4266attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_8bit);4267simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4268emit_int8(0x20);4269emit_operand(dst, src);4270emit_int8(imm8);4271}42724273void Assembler::pinsrb(XMMRegister dst, Register src, int imm8) {4274assert(VM_Version::supports_sse4_1(), "");4275InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4276int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4277emit_int24(0x20, (0xC0 | encode), imm8);4278}42794280void Assembler::vpinsrb(XMMRegister dst, XMMRegister nds, Register src, int imm8) {4281assert(VM_Version::supports_avx(), "");4282InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);4283int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4284emit_int24(0x20, (0xC0 | encode), imm8);4285}42864287void Assembler::insertps(XMMRegister dst, XMMRegister src, int imm8) {4288assert(VM_Version::supports_sse4_1(), "");4289InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);4290int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4291emit_int24(0x21, (0xC0 | encode), imm8);4292}42934294void Assembler::vinsertps(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8) {4295assert(VM_Version::supports_avx(), "");4296InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);4297int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4298emit_int24(0x21, (0xC0 | encode), imm8);4299}43004301void Assembler::pmovzxbw(XMMRegister dst, Address src) {4302assert(VM_Version::supports_sse4_1(), "");4303InstructionMark im(this);4304InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4305attributes.set_address_attributes(/* tuple_type */ EVEX_HVM, /* input_size_in_bits */ EVEX_NObit);4306simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4307emit_int8(0x30);4308emit_operand(dst, src);4309}43104311void Assembler::pmovzxbw(XMMRegister dst, XMMRegister src) {4312assert(VM_Version::supports_sse4_1(), "");4313InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4314int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4315emit_int16(0x30, (0xC0 | encode));4316}43174318void Assembler::pmovsxbw(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(0x20, (0xC0 | encode));4323}43244325void Assembler::pmovzxdq(XMMRegister dst, XMMRegister src) {4326assert(VM_Version::supports_sse4_1(), "");4327InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* 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(0x35, (0xC0 | encode));4330}43314332void Assembler::pmovsxbd(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(0x21, (0xC0 | encode));4337}43384339void Assembler::pmovzxbd(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(0x31, (0xC0 | encode));4344}43454346void Assembler::pmovsxbq(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(0x22, (0xC0 | encode));4351}43524353void Assembler::pmovsxwd(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(0x23, (0xC0 | encode));4358}43594360void Assembler::vpmovzxbw(XMMRegister dst, Address src, int vector_len) {4361assert(VM_Version::supports_avx(), "");4362InstructionMark im(this);4363assert(dst != xnoreg, "sanity");4364InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4365attributes.set_address_attributes(/* tuple_type */ EVEX_HVM, /* input_size_in_bits */ EVEX_NObit);4366vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4367emit_int8(0x30);4368emit_operand(dst, src);4369}43704371void Assembler::vpmovzxbw(XMMRegister dst, XMMRegister src, int vector_len) {4372assert(vector_len == AVX_128bit? VM_Version::supports_avx() :4373vector_len == AVX_256bit? VM_Version::supports_avx2() :4374vector_len == AVX_512bit? VM_Version::supports_avx512bw() : 0, "");4375InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4376int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4377emit_int16(0x30, (unsigned char) (0xC0 | encode));4378}43794380void Assembler::vpmovsxbw(XMMRegister dst, XMMRegister src, int vector_len) {4381assert(vector_len == AVX_128bit? VM_Version::supports_avx() :4382vector_len == AVX_256bit? VM_Version::supports_avx2() :4383vector_len == AVX_512bit? VM_Version::supports_avx512bw() : 0, "");4384InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4385int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4386emit_int16(0x20, (0xC0 | encode));4387}43884389void Assembler::evpmovzxbw(XMMRegister dst, KRegister mask, Address src, int vector_len) {4390assert(VM_Version::supports_avx512vlbw(), "");4391assert(dst != xnoreg, "sanity");4392InstructionMark im(this);4393InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);4394attributes.set_address_attributes(/* tuple_type */ EVEX_HVM, /* input_size_in_bits */ EVEX_NObit);4395attributes.set_embedded_opmask_register_specifier(mask);4396attributes.set_is_evex_instruction();4397vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4398emit_int8(0x30);4399emit_operand(dst, src);4400}44014402void Assembler::evpandd(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len) {4403assert(VM_Version::supports_evex(), "");4404// Encoding: EVEX.NDS.XXX.66.0F.W0 DB /r4405InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);4406attributes.set_is_evex_instruction();4407attributes.set_embedded_opmask_register_specifier(mask);4408if (merge) {4409attributes.reset_is_clear_context();4410}4411int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4412emit_int16((unsigned char)0xDB, (0xC0 | encode));4413}44144415void Assembler::vpmovzxdq(XMMRegister dst, XMMRegister src, int vector_len) {4416assert(vector_len > AVX_128bit ? VM_Version::supports_avx2() : VM_Version::supports_avx(), "");4417InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4418int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4419emit_int16(0x35, (0xC0 | encode));4420}44214422void Assembler::vpmovzxbd(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(0x31, (0xC0 | encode));4427}44284429void Assembler::vpmovzxbq(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(0x32, (0xC0 | encode));4434}44354436void Assembler::vpmovsxbd(XMMRegister dst, XMMRegister src, int vector_len) {4437assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :4438vector_len == AVX_256bit ? VM_Version::supports_avx2() :4439VM_Version::supports_evex(), "");4440InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4441int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4442emit_int16(0x21, (0xC0 | encode));4443}44444445void Assembler::vpmovsxbq(XMMRegister dst, XMMRegister src, int vector_len) {4446assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :4447vector_len == AVX_256bit ? VM_Version::supports_avx2() :4448VM_Version::supports_evex(), "");4449InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4450int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4451emit_int16(0x22, (0xC0 | encode));4452}44534454void Assembler::vpmovsxwd(XMMRegister dst, XMMRegister src, int vector_len) {4455assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :4456vector_len == AVX_256bit ? VM_Version::supports_avx2() :4457VM_Version::supports_evex(), "");4458InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4459int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4460emit_int16(0x23, (0xC0 | encode));4461}44624463void Assembler::vpmovsxwq(XMMRegister dst, XMMRegister src, int vector_len) {4464assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :4465vector_len == AVX_256bit ? VM_Version::supports_avx2() :4466VM_Version::supports_evex(), "");4467InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4468int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4469emit_int16(0x24, (0xC0 | encode));4470}44714472void Assembler::vpmovsxdq(XMMRegister dst, XMMRegister src, int vector_len) {4473assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :4474vector_len == AVX_256bit ? VM_Version::supports_avx2() :4475VM_Version::supports_evex(), "");4476InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4477int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4478emit_int16(0x25, (0xC0 | encode));4479}44804481void Assembler::evpmovwb(Address dst, XMMRegister src, int vector_len) {4482assert(VM_Version::supports_avx512vlbw(), "");4483assert(src != xnoreg, "sanity");4484InstructionMark im(this);4485InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4486attributes.set_address_attributes(/* tuple_type */ EVEX_HVM, /* input_size_in_bits */ EVEX_NObit);4487attributes.set_is_evex_instruction();4488vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);4489emit_int8(0x30);4490emit_operand(src, dst);4491}44924493void Assembler::evpmovwb(Address dst, KRegister mask, XMMRegister src, int vector_len) {4494assert(VM_Version::supports_avx512vlbw(), "");4495assert(src != xnoreg, "sanity");4496InstructionMark im(this);4497InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);4498attributes.set_address_attributes(/* tuple_type */ EVEX_HVM, /* input_size_in_bits */ EVEX_NObit);4499attributes.reset_is_clear_context();4500attributes.set_embedded_opmask_register_specifier(mask);4501attributes.set_is_evex_instruction();4502vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);4503emit_int8(0x30);4504emit_operand(src, dst);4505}45064507void Assembler::evpmovdb(Address dst, XMMRegister src, int vector_len) {4508assert(VM_Version::supports_evex(), "");4509assert(src != xnoreg, "sanity");4510InstructionMark im(this);4511InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4512attributes.set_address_attributes(/* tuple_type */ EVEX_QVM, /* input_size_in_bits */ EVEX_NObit);4513attributes.set_is_evex_instruction();4514vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);4515emit_int8(0x31);4516emit_operand(src, dst);4517}45184519void Assembler::vpmovzxwd(XMMRegister dst, XMMRegister src, int vector_len) {4520assert(vector_len == AVX_128bit? VM_Version::supports_avx() :4521vector_len == AVX_256bit? VM_Version::supports_avx2() :4522vector_len == AVX_512bit? VM_Version::supports_evex() : 0, " ");4523InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4524int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4525emit_int16(0x33, (0xC0 | encode));4526}45274528void Assembler::pmaddwd(XMMRegister dst, XMMRegister src) {4529NOT_LP64(assert(VM_Version::supports_sse2(), ""));4530InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4531int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4532emit_int16((unsigned char)0xF5, (0xC0 | encode));4533}45344535void Assembler::vpmaddwd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {4536assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :4537(vector_len == AVX_256bit ? VM_Version::supports_avx2() :4538(vector_len == AVX_512bit ? VM_Version::supports_evex() : 0)), "");4539InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4540int encode = simd_prefix_and_encode(dst, nds, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4541emit_int16((unsigned char)0xF5, (0xC0 | encode));4542}45434544void Assembler::evpdpwssd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {4545assert(VM_Version::supports_evex(), "");4546assert(VM_Version::supports_avx512_vnni(), "must support vnni");4547InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4548attributes.set_is_evex_instruction();4549int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4550emit_int16(0x52, (0xC0 | encode));4551}45524553// generic4554void Assembler::pop(Register dst) {4555int encode = prefix_and_encode(dst->encoding());4556emit_int8(0x58 | encode);4557}45584559void Assembler::popcntl(Register dst, Address src) {4560assert(VM_Version::supports_popcnt(), "must support");4561InstructionMark im(this);4562emit_int8((unsigned char)0xF3);4563prefix(src, dst);4564emit_int16(0x0F, (unsigned char)0xB8);4565emit_operand(dst, src);4566}45674568void Assembler::popcntl(Register dst, Register src) {4569assert(VM_Version::supports_popcnt(), "must support");4570emit_int8((unsigned char)0xF3);4571int encode = prefix_and_encode(dst->encoding(), src->encoding());4572emit_int24(0x0F, (unsigned char)0xB8, (0xC0 | encode));4573}45744575void Assembler::vpopcntd(XMMRegister dst, XMMRegister src, int vector_len) {4576assert(VM_Version::supports_avx512_vpopcntdq(), "must support vpopcntdq feature");4577InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4578attributes.set_is_evex_instruction();4579int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4580emit_int16(0x55, (0xC0 | encode));4581}45824583void Assembler::popf() {4584emit_int8((unsigned char)0x9D);4585}45864587#ifndef _LP64 // no 32bit push/pop on amd644588void Assembler::popl(Address dst) {4589// NOTE: this will adjust stack by 8byte on 64bits4590InstructionMark im(this);4591prefix(dst);4592emit_int8((unsigned char)0x8F);4593emit_operand(rax, dst);4594}4595#endif45964597void Assembler::prefetchnta(Address src) {4598NOT_LP64(assert(VM_Version::supports_sse(), "must support"));4599InstructionMark im(this);4600prefix(src);4601emit_int16(0x0F, 0x18);4602emit_operand(rax, src); // 0, src4603}46044605void Assembler::prefetchr(Address src) {4606assert(VM_Version::supports_3dnow_prefetch(), "must support");4607InstructionMark im(this);4608prefix(src);4609emit_int16(0x0F, 0x0D);4610emit_operand(rax, src); // 0, src4611}46124613void Assembler::prefetcht0(Address src) {4614NOT_LP64(assert(VM_Version::supports_sse(), "must support"));4615InstructionMark im(this);4616prefix(src);4617emit_int16(0x0F, 0x18);4618emit_operand(rcx, src); // 1, src4619}46204621void Assembler::prefetcht1(Address src) {4622NOT_LP64(assert(VM_Version::supports_sse(), "must support"));4623InstructionMark im(this);4624prefix(src);4625emit_int16(0x0F, 0x18);4626emit_operand(rdx, src); // 2, src4627}46284629void Assembler::prefetcht2(Address src) {4630NOT_LP64(assert(VM_Version::supports_sse(), "must support"));4631InstructionMark im(this);4632prefix(src);4633emit_int16(0x0F, 0x18);4634emit_operand(rbx, src); // 3, src4635}46364637void Assembler::prefetchw(Address src) {4638assert(VM_Version::supports_3dnow_prefetch(), "must support");4639InstructionMark im(this);4640prefix(src);4641emit_int16(0x0F, 0x0D);4642emit_operand(rcx, src); // 1, src4643}46444645void Assembler::prefix(Prefix p) {4646emit_int8(p);4647}46484649void Assembler::pshufb(XMMRegister dst, XMMRegister src) {4650assert(VM_Version::supports_ssse3(), "");4651InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4652int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4653emit_int16(0x00, (0xC0 | encode));4654}46554656void Assembler::vpshufb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {4657assert(vector_len == AVX_128bit? VM_Version::supports_avx() :4658vector_len == AVX_256bit? VM_Version::supports_avx2() :4659vector_len == AVX_512bit? VM_Version::supports_avx512bw() : 0, "");4660InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4661int encode = simd_prefix_and_encode(dst, nds, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4662emit_int16(0x00, (0xC0 | encode));4663}46644665void Assembler::pshufb(XMMRegister dst, Address src) {4666assert(VM_Version::supports_ssse3(), "");4667InstructionMark im(this);4668InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4669attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);4670simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4671emit_int8(0x00);4672emit_operand(dst, src);4673}46744675void Assembler::pshufd(XMMRegister dst, XMMRegister src, int mode) {4676assert(isByte(mode), "invalid value");4677NOT_LP64(assert(VM_Version::supports_sse2(), ""));4678int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_128bit;4679InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4680int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4681emit_int24(0x70, (0xC0 | encode), mode & 0xFF);4682}46834684void Assembler::vpshufd(XMMRegister dst, XMMRegister src, int mode, int vector_len) {4685assert(vector_len == AVX_128bit? VM_Version::supports_avx() :4686(vector_len == AVX_256bit? VM_Version::supports_avx2() :4687(vector_len == AVX_512bit? VM_Version::supports_evex() : 0)), "");4688NOT_LP64(assert(VM_Version::supports_sse2(), ""));4689InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4690int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4691emit_int24(0x70, (0xC0 | encode), mode & 0xFF);4692}46934694void Assembler::pshufd(XMMRegister dst, Address src, int mode) {4695assert(isByte(mode), "invalid value");4696NOT_LP64(assert(VM_Version::supports_sse2(), ""));4697assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");4698InstructionMark im(this);4699InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4700attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);4701simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4702emit_int8(0x70);4703emit_operand(dst, src);4704emit_int8(mode & 0xFF);4705}47064707void Assembler::pshufhw(XMMRegister dst, XMMRegister src, int mode) {4708assert(isByte(mode), "invalid value");4709NOT_LP64(assert(VM_Version::supports_sse2(), ""));4710InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4711int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);4712emit_int24(0x70, (0xC0 | encode), mode & 0xFF);4713}47144715void Assembler::pshuflw(XMMRegister dst, XMMRegister src, int mode) {4716assert(isByte(mode), "invalid value");4717NOT_LP64(assert(VM_Version::supports_sse2(), ""));4718InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4719int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);4720emit_int24(0x70, (0xC0 | encode), mode & 0xFF);4721}47224723void Assembler::pshuflw(XMMRegister dst, Address src, int mode) {4724assert(isByte(mode), "invalid value");4725NOT_LP64(assert(VM_Version::supports_sse2(), ""));4726assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");4727InstructionMark im(this);4728InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4729attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);4730simd_prefix(dst, xnoreg, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);4731emit_int8(0x70);4732emit_operand(dst, src);4733emit_int8(mode & 0xFF);4734}47354736void Assembler::evshufi64x2(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8, int vector_len) {4737assert(VM_Version::supports_evex(), "requires EVEX support");4738assert(vector_len == Assembler::AVX_256bit || vector_len == Assembler::AVX_512bit, "");4739InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4740attributes.set_is_evex_instruction();4741int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);4742emit_int24(0x43, (0xC0 | encode), imm8 & 0xFF);4743}47444745void Assembler::pshufpd(XMMRegister dst, XMMRegister src, int imm8) {4746assert(isByte(imm8), "invalid value");4747NOT_LP64(assert(VM_Version::supports_sse2(), ""));4748InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4749int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4750emit_int24((unsigned char)0xC6, (0xC0 | encode), imm8 & 0xFF);4751}47524753void Assembler::vpshufpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8, int vector_len) {4754InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4755attributes.set_rex_vex_w_reverted();4756int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4757emit_int24((unsigned char)0xC6, (0xC0 | encode), imm8 & 0xFF);4758}47594760void Assembler::pshufps(XMMRegister dst, XMMRegister src, int imm8) {4761assert(isByte(imm8), "invalid value");4762NOT_LP64(assert(VM_Version::supports_sse2(), ""));4763InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4764int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);4765emit_int24((unsigned char)0xC6, (0xC0 | encode), imm8 & 0xFF);4766}47674768void Assembler::vpshufps(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8, int vector_len) {4769InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4770int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);4771emit_int24((unsigned char)0xC6, (0xC0 | encode), imm8 & 0xFF);4772}47734774void Assembler::psrldq(XMMRegister dst, int shift) {4775// Shift left 128 bit value in dst XMMRegister by shift number of bytes.4776NOT_LP64(assert(VM_Version::supports_sse2(), ""));4777InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4778int encode = simd_prefix_and_encode(xmm3, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4779emit_int24(0x73, (0xC0 | encode), shift);4780}47814782void Assembler::vpsrldq(XMMRegister dst, XMMRegister src, int shift, int vector_len) {4783assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :4784vector_len == AVX_256bit ? VM_Version::supports_avx2() :4785vector_len == AVX_512bit ? VM_Version::supports_avx512bw() : 0, "");4786InstructionAttr attributes(vector_len, /*vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4787int encode = vex_prefix_and_encode(xmm3->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4788emit_int24(0x73, (0xC0 | encode), shift & 0xFF);4789}47904791void Assembler::pslldq(XMMRegister dst, int shift) {4792// Shift left 128 bit value in dst XMMRegister by shift number of bytes.4793NOT_LP64(assert(VM_Version::supports_sse2(), ""));4794InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4795// XMM7 is for /7 encoding: 66 0F 73 /7 ib4796int encode = simd_prefix_and_encode(xmm7, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4797emit_int24(0x73, (0xC0 | encode), shift);4798}47994800void Assembler::vpslldq(XMMRegister dst, XMMRegister src, int shift, int vector_len) {4801assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :4802vector_len == AVX_256bit ? VM_Version::supports_avx2() :4803vector_len == AVX_512bit ? VM_Version::supports_avx512bw() : 0, "");4804InstructionAttr attributes(vector_len, /*vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);4805int encode = vex_prefix_and_encode(xmm7->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4806emit_int24(0x73, (0xC0 | encode), shift & 0xFF);4807}48084809void Assembler::ptest(XMMRegister dst, Address src) {4810assert(VM_Version::supports_sse4_1(), "");4811assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");4812InstructionMark im(this);4813InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4814simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4815emit_int8(0x17);4816emit_operand(dst, src);4817}48184819void Assembler::ptest(XMMRegister dst, XMMRegister src) {4820assert(VM_Version::supports_sse4_1() || VM_Version::supports_avx(), "");4821InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4822int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4823emit_int8(0x17);4824emit_int8((0xC0 | encode));4825}48264827void Assembler::vptest(XMMRegister dst, Address src) {4828assert(VM_Version::supports_avx(), "");4829InstructionMark im(this);4830InstructionAttr attributes(AVX_256bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4831assert(dst != xnoreg, "sanity");4832// swap src<->dst for encoding4833vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4834emit_int8(0x17);4835emit_operand(dst, src);4836}48374838void Assembler::vptest(XMMRegister dst, XMMRegister src) {4839assert(VM_Version::supports_avx(), "");4840InstructionAttr attributes(AVX_256bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4841int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);4842emit_int16(0x17, (0xC0 | encode));4843}48444845void Assembler::vptest(XMMRegister dst, XMMRegister src, int vector_len) {4846assert(VM_Version::supports_avx(), "");4847InstructionAttr attributes(vector_len, /* 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::punpcklbw(XMMRegister dst, Address src) {4853NOT_LP64(assert(VM_Version::supports_sse2(), ""));4854assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");4855InstructionMark im(this);4856InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_vlbw, /* no_mask_reg */ true, /* uses_vl */ true);4857attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);4858simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4859emit_int8(0x60);4860emit_operand(dst, src);4861}48624863void Assembler::punpcklbw(XMMRegister dst, XMMRegister src) {4864NOT_LP64(assert(VM_Version::supports_sse2(), ""));4865InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_vlbw, /* no_mask_reg */ true, /* uses_vl */ true);4866int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4867emit_int16(0x60, (0xC0 | encode));4868}48694870void Assembler::punpckldq(XMMRegister dst, Address src) {4871NOT_LP64(assert(VM_Version::supports_sse2(), ""));4872assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");4873InstructionMark im(this);4874InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4875attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);4876simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4877emit_int8(0x62);4878emit_operand(dst, src);4879}48804881void Assembler::punpckldq(XMMRegister dst, XMMRegister src) {4882NOT_LP64(assert(VM_Version::supports_sse2(), ""));4883InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4884int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4885emit_int16(0x62, (0xC0 | encode));4886}48874888void Assembler::punpcklqdq(XMMRegister dst, XMMRegister src) {4889NOT_LP64(assert(VM_Version::supports_sse2(), ""));4890InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);4891attributes.set_rex_vex_w_reverted();4892int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);4893emit_int16(0x6C, (0xC0 | encode));4894}48954896void Assembler::push(int32_t imm32) {4897// in 64bits we push 64bits onto the stack but only4898// take a 32bit immediate4899emit_int8(0x68);4900emit_int32(imm32);4901}49024903void Assembler::push(Register src) {4904int encode = prefix_and_encode(src->encoding());4905emit_int8(0x50 | encode);4906}49074908void Assembler::pushf() {4909emit_int8((unsigned char)0x9C);4910}49114912#ifndef _LP64 // no 32bit push/pop on amd644913void Assembler::pushl(Address src) {4914// Note this will push 64bit on 64bit4915InstructionMark im(this);4916prefix(src);4917emit_int8((unsigned char)0xFF);4918emit_operand(rsi, src);4919}4920#endif49214922void Assembler::rcll(Register dst, int imm8) {4923assert(isShiftCount(imm8), "illegal shift count");4924int encode = prefix_and_encode(dst->encoding());4925if (imm8 == 1) {4926emit_int16((unsigned char)0xD1, (0xD0 | encode));4927} else {4928emit_int24((unsigned char)0xC1, (0xD0 | encode), imm8);4929}4930}49314932void Assembler::rcpps(XMMRegister dst, XMMRegister src) {4933NOT_LP64(assert(VM_Version::supports_sse(), ""));4934InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);4935int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);4936emit_int16(0x53, (0xC0 | encode));4937}49384939void Assembler::rcpss(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, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);4943emit_int16(0x53, (0xC0 | encode));4944}49454946void Assembler::rdtsc() {4947emit_int16(0x0F, 0x31);4948}49494950// copies data from [esi] to [edi] using rcx pointer sized words4951// generic4952void Assembler::rep_mov() {4953// REP4954// MOVSQ4955LP64_ONLY(emit_int24((unsigned char)0xF3, REX_W, (unsigned char)0xA5);)4956NOT_LP64( emit_int16((unsigned char)0xF3, (unsigned char)0xA5);)4957}49584959// sets rcx bytes with rax, value at [edi]4960void Assembler::rep_stosb() {4961// REP4962// STOSB4963LP64_ONLY(emit_int24((unsigned char)0xF3, REX_W, (unsigned char)0xAA);)4964NOT_LP64( emit_int16((unsigned char)0xF3, (unsigned char)0xAA);)4965}49664967// sets rcx pointer sized words with rax, value at [edi]4968// generic4969void Assembler::rep_stos() {4970// REP4971// LP64:STOSQ, LP32:STOSD4972LP64_ONLY(emit_int24((unsigned char)0xF3, REX_W, (unsigned char)0xAB);)4973NOT_LP64( emit_int16((unsigned char)0xF3, (unsigned char)0xAB);)4974}49754976// scans rcx pointer sized words at [edi] for occurance of rax,4977// generic4978void Assembler::repne_scan() { // repne_scan4979// SCASQ4980LP64_ONLY(emit_int24((unsigned char)0xF2, REX_W, (unsigned char)0xAF);)4981NOT_LP64( emit_int16((unsigned char)0xF2, (unsigned char)0xAF);)4982}49834984#ifdef _LP644985// scans rcx 4 byte words at [edi] for occurance of rax,4986// generic4987void Assembler::repne_scanl() { // repne_scan4988// SCASL4989emit_int16((unsigned char)0xF2, (unsigned char)0xAF);4990}4991#endif49924993void Assembler::ret(int imm16) {4994if (imm16 == 0) {4995emit_int8((unsigned char)0xC3);4996} else {4997emit_int8((unsigned char)0xC2);4998emit_int16(imm16);4999}5000}50015002void Assembler::roll(Register dst, int imm8) {5003assert(isShiftCount(imm8), "illegal shift count");5004int encode = prefix_and_encode(dst->encoding());5005if (imm8 == 1) {5006emit_int16((unsigned char)0xD1, (0xC0 | encode));5007} else {5008emit_int24((unsigned char)0xC1, (0xc0 | encode), imm8);5009}5010}50115012void Assembler::roll(Register dst) {5013int encode = prefix_and_encode(dst->encoding());5014emit_int16((unsigned char)0xD3, (0xC0 | encode));5015}50165017void Assembler::rorl(Register dst, int imm8) {5018assert(isShiftCount(imm8), "illegal shift count");5019int encode = prefix_and_encode(dst->encoding());5020if (imm8 == 1) {5021emit_int16((unsigned char)0xD1, (0xC8 | encode));5022} else {5023emit_int24((unsigned char)0xC1, (0xc8 | encode), imm8);5024}5025}50265027void Assembler::rorl(Register dst) {5028int encode = prefix_and_encode(dst->encoding());5029emit_int16((unsigned char)0xD3, (0xC8 | encode));5030}50315032#ifdef _LP645033void Assembler::rorq(Register dst) {5034int encode = prefixq_and_encode(dst->encoding());5035emit_int16((unsigned char)0xD3, (0xC8 | encode));5036}50375038void Assembler::rorq(Register dst, int imm8) {5039assert(isShiftCount(imm8 >> 1), "illegal shift count");5040int encode = prefixq_and_encode(dst->encoding());5041if (imm8 == 1) {5042emit_int16((unsigned char)0xD1, (0xC8 | encode));5043} else {5044emit_int24((unsigned char)0xC1, (0xc8 | encode), imm8);5045}5046}50475048void Assembler::rolq(Register dst) {5049int encode = prefixq_and_encode(dst->encoding());5050emit_int16((unsigned char)0xD3, (0xC0 | encode));5051}50525053void Assembler::rolq(Register dst, int imm8) {5054assert(isShiftCount(imm8 >> 1), "illegal shift count");5055int encode = prefixq_and_encode(dst->encoding());5056if (imm8 == 1) {5057emit_int16((unsigned char)0xD1, (0xC0 | encode));5058} else {5059emit_int24((unsigned char)0xC1, (0xc0 | encode), imm8);5060}5061}5062#endif50635064void Assembler::sahf() {5065#ifdef _LP645066// Not supported in 64bit mode5067ShouldNotReachHere();5068#endif5069emit_int8((unsigned char)0x9E);5070}50715072void Assembler::sall(Address dst, int imm8) {5073InstructionMark im(this);5074assert(isShiftCount(imm8), "illegal shift count");5075prefix(dst);5076if (imm8 == 1) {5077emit_int8((unsigned char)0xD1);5078emit_operand(as_Register(4), dst);5079}5080else {5081emit_int8((unsigned char)0xC1);5082emit_operand(as_Register(4), dst);5083emit_int8(imm8);5084}5085}50865087void Assembler::sall(Address dst) {5088InstructionMark im(this);5089prefix(dst);5090emit_int8((unsigned char)0xD3);5091emit_operand(as_Register(4), dst);5092}50935094void Assembler::sall(Register dst, int imm8) {5095assert(isShiftCount(imm8), "illegal shift count");5096int encode = prefix_and_encode(dst->encoding());5097if (imm8 == 1) {5098emit_int16((unsigned char)0xD1, (0xE0 | encode));5099} else {5100emit_int24((unsigned char)0xC1, (0xE0 | encode), imm8);5101}5102}51035104void Assembler::sall(Register dst) {5105int encode = prefix_and_encode(dst->encoding());5106emit_int16((unsigned char)0xD3, (0xE0 | encode));5107}51085109void Assembler::sarl(Address dst, int imm8) {5110assert(isShiftCount(imm8), "illegal shift count");5111InstructionMark im(this);5112prefix(dst);5113if (imm8 == 1) {5114emit_int8((unsigned char)0xD1);5115emit_operand(as_Register(7), dst);5116}5117else {5118emit_int8((unsigned char)0xC1);5119emit_operand(as_Register(7), dst);5120emit_int8(imm8);5121}5122}51235124void Assembler::sarl(Address dst) {5125InstructionMark im(this);5126prefix(dst);5127emit_int8((unsigned char)0xD3);5128emit_operand(as_Register(7), dst);5129}51305131void Assembler::sarl(Register dst, int imm8) {5132int encode = prefix_and_encode(dst->encoding());5133assert(isShiftCount(imm8), "illegal shift count");5134if (imm8 == 1) {5135emit_int16((unsigned char)0xD1, (0xF8 | encode));5136} else {5137emit_int24((unsigned char)0xC1, (0xF8 | encode), imm8);5138}5139}51405141void Assembler::sarl(Register dst) {5142int encode = prefix_and_encode(dst->encoding());5143emit_int16((unsigned char)0xD3, (0xF8 | encode));5144}51455146void Assembler::sbbl(Address dst, int32_t imm32) {5147InstructionMark im(this);5148prefix(dst);5149emit_arith_operand(0x81, rbx, dst, imm32);5150}51515152void Assembler::sbbl(Register dst, int32_t imm32) {5153prefix(dst);5154emit_arith(0x81, 0xD8, dst, imm32);5155}515651575158void Assembler::sbbl(Register dst, Address src) {5159InstructionMark im(this);5160prefix(src, dst);5161emit_int8(0x1B);5162emit_operand(dst, src);5163}51645165void Assembler::sbbl(Register dst, Register src) {5166(void) prefix_and_encode(dst->encoding(), src->encoding());5167emit_arith(0x1B, 0xC0, dst, src);5168}51695170void Assembler::setb(Condition cc, Register dst) {5171assert(0 <= cc && cc < 16, "illegal cc");5172int encode = prefix_and_encode(dst->encoding(), true);5173emit_int24(0x0F, (unsigned char)0x90 | cc, (0xC0 | encode));5174}51755176void Assembler::sete(Register dst) {5177int encode = prefix_and_encode(dst->encoding(), true);5178emit_int24(0x0F, (unsigned char)0x94, (0xC0 | encode));5179}51805181void Assembler::setl(Register dst) {5182int encode = prefix_and_encode(dst->encoding(), true);5183emit_int24(0x0F, (unsigned char)0x9C, (0xC0 | encode));5184}51855186void Assembler::setne(Register dst) {5187int encode = prefix_and_encode(dst->encoding(), true);5188emit_int24(0x0F, (unsigned char)0x95, (0xC0 | encode));5189}51905191void Assembler::palignr(XMMRegister dst, XMMRegister src, int imm8) {5192assert(VM_Version::supports_ssse3(), "");5193InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);5194int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);5195emit_int24(0x0F, (0xC0 | encode), imm8);5196}51975198void Assembler::vpalignr(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8, int vector_len) {5199assert(vector_len == AVX_128bit? VM_Version::supports_avx() :5200vector_len == AVX_256bit? VM_Version::supports_avx2() :52010, "");5202InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);5203int encode = simd_prefix_and_encode(dst, nds, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);5204emit_int24(0x0F, (0xC0 | encode), imm8);5205}52065207void Assembler::evalignq(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {5208assert(VM_Version::supports_evex(), "");5209InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5210attributes.set_is_evex_instruction();5211int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);5212emit_int24(0x3, (0xC0 | encode), imm8);5213}52145215void Assembler::pblendw(XMMRegister dst, XMMRegister src, int imm8) {5216assert(VM_Version::supports_sse4_1(), "");5217InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);5218int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);5219emit_int24(0x0E, (0xC0 | encode), imm8);5220}52215222void Assembler::sha1rnds4(XMMRegister dst, XMMRegister src, int imm8) {5223assert(VM_Version::supports_sha(), "");5224int encode = rex_prefix_and_encode(dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_3A, /* rex_w */ false);5225emit_int24((unsigned char)0xCC, (0xC0 | encode), (unsigned char)imm8);5226}52275228void Assembler::sha1nexte(XMMRegister dst, XMMRegister src) {5229assert(VM_Version::supports_sha(), "");5230int encode = rex_prefix_and_encode(dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, /* rex_w */ false);5231emit_int16((unsigned char)0xC8, (0xC0 | encode));5232}52335234void Assembler::sha1msg1(XMMRegister dst, XMMRegister src) {5235assert(VM_Version::supports_sha(), "");5236int encode = rex_prefix_and_encode(dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, /* rex_w */ false);5237emit_int16((unsigned char)0xC9, (0xC0 | encode));5238}52395240void Assembler::sha1msg2(XMMRegister dst, XMMRegister src) {5241assert(VM_Version::supports_sha(), "");5242int encode = rex_prefix_and_encode(dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, /* rex_w */ false);5243emit_int16((unsigned char)0xCA, (0xC0 | encode));5244}52455246// xmm0 is implicit additional source to this instruction.5247void Assembler::sha256rnds2(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)0xCB, (0xC0 | encode));5251}52525253void Assembler::sha256msg1(XMMRegister dst, XMMRegister src) {5254assert(VM_Version::supports_sha(), "");5255int encode = rex_prefix_and_encode(dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, /* rex_w */ false);5256emit_int16((unsigned char)0xCC, (0xC0 | encode));5257}52585259void Assembler::sha256msg2(XMMRegister dst, XMMRegister src) {5260assert(VM_Version::supports_sha(), "");5261int encode = rex_prefix_and_encode(dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, /* rex_w */ false);5262emit_int16((unsigned char)0xCD, (0xC0 | encode));5263}526452655266void Assembler::shll(Register dst, int imm8) {5267assert(isShiftCount(imm8), "illegal shift count");5268int encode = prefix_and_encode(dst->encoding());5269if (imm8 == 1 ) {5270emit_int16((unsigned char)0xD1, (0xE0 | encode));5271} else {5272emit_int24((unsigned char)0xC1, (0xE0 | encode), imm8);5273}5274}52755276void Assembler::shll(Register dst) {5277int encode = prefix_and_encode(dst->encoding());5278emit_int16((unsigned char)0xD3, (0xE0 | encode));5279}52805281void Assembler::shrl(Register dst, int imm8) {5282assert(isShiftCount(imm8), "illegal shift count");5283int encode = prefix_and_encode(dst->encoding());5284if (imm8 == 1) {5285emit_int16((unsigned char)0xD1, (0xE8 | encode));5286}5287else {5288emit_int24((unsigned char)0xC1, (0xE8 | encode), imm8);5289}5290}52915292void Assembler::shrl(Register dst) {5293int encode = prefix_and_encode(dst->encoding());5294emit_int16((unsigned char)0xD3, (0xE8 | encode));5295}52965297void Assembler::shrl(Address dst) {5298InstructionMark im(this);5299prefix(dst);5300emit_int8((unsigned char)0xD3);5301emit_operand(as_Register(5), dst);5302}53035304void Assembler::shrl(Address dst, int imm8) {5305InstructionMark im(this);5306assert(isShiftCount(imm8), "illegal shift count");5307prefix(dst);5308if (imm8 == 1) {5309emit_int8((unsigned char)0xD1);5310emit_operand(as_Register(5), dst);5311}5312else {5313emit_int8((unsigned char)0xC1);5314emit_operand(as_Register(5), dst);5315emit_int8(imm8);5316}5317}531853195320void Assembler::shldl(Register dst, Register src) {5321int encode = prefix_and_encode(src->encoding(), dst->encoding());5322emit_int24(0x0F, (unsigned char)0xA5, (0xC0 | encode));5323}53245325void Assembler::shldl(Register dst, Register src, int8_t imm8) {5326int encode = prefix_and_encode(src->encoding(), dst->encoding());5327emit_int32(0x0F, (unsigned char)0xA4, (0xC0 | encode), imm8);5328}53295330void Assembler::shrdl(Register dst, Register src) {5331int encode = prefix_and_encode(src->encoding(), dst->encoding());5332emit_int24(0x0F, (unsigned char)0xAD, (0xC0 | encode));5333}53345335void Assembler::shrdl(Register dst, Register src, int8_t imm8) {5336int encode = prefix_and_encode(src->encoding(), dst->encoding());5337emit_int32(0x0F, (unsigned char)0xAC, (0xC0 | encode), imm8);5338}53395340// copies a single word from [esi] to [edi]5341void Assembler::smovl() {5342emit_int8((unsigned char)0xA5);5343}53445345void Assembler::roundsd(XMMRegister dst, XMMRegister src, int32_t rmode) {5346assert(VM_Version::supports_sse4_1(), "");5347InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);5348int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);5349emit_int24(0x0B, (0xC0 | encode), (unsigned char)rmode);5350}53515352void Assembler::roundsd(XMMRegister dst, Address src, int32_t rmode) {5353assert(VM_Version::supports_sse4_1(), "");5354InstructionMark im(this);5355InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);5356simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);5357emit_int8(0x0B);5358emit_operand(dst, src);5359emit_int8((unsigned char)rmode);5360}53615362void Assembler::sqrtsd(XMMRegister dst, XMMRegister src) {5363NOT_LP64(assert(VM_Version::supports_sse2(), ""));5364InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5365attributes.set_rex_vex_w_reverted();5366int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5367emit_int16(0x51, (0xC0 | encode));5368}53695370void Assembler::sqrtsd(XMMRegister dst, Address src) {5371NOT_LP64(assert(VM_Version::supports_sse2(), ""));5372InstructionMark im(this);5373InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5374attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);5375attributes.set_rex_vex_w_reverted();5376simd_prefix(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5377emit_int8(0x51);5378emit_operand(dst, src);5379}53805381void Assembler::sqrtss(XMMRegister dst, XMMRegister src) {5382NOT_LP64(assert(VM_Version::supports_sse(), ""));5383InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5384int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5385emit_int16(0x51, (0xC0 | encode));5386}53875388void Assembler::std() {5389emit_int8((unsigned char)0xFD);5390}53915392void Assembler::sqrtss(XMMRegister dst, Address src) {5393NOT_LP64(assert(VM_Version::supports_sse(), ""));5394InstructionMark im(this);5395InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5396attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);5397simd_prefix(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5398emit_int8(0x51);5399emit_operand(dst, src);5400}54015402void Assembler::stmxcsr( Address dst) {5403if (UseAVX > 0 ) {5404assert(VM_Version::supports_avx(), "");5405InstructionMark im(this);5406InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);5407vex_prefix(dst, 0, 0, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5408emit_int8((unsigned char)0xAE);5409emit_operand(as_Register(3), dst);5410} else {5411NOT_LP64(assert(VM_Version::supports_sse(), ""));5412InstructionMark im(this);5413prefix(dst);5414emit_int16(0x0F, (unsigned char)0xAE);5415emit_operand(as_Register(3), dst);5416}5417}54185419void Assembler::subl(Address dst, int32_t imm32) {5420InstructionMark im(this);5421prefix(dst);5422emit_arith_operand(0x81, rbp, dst, imm32);5423}54245425void Assembler::subl(Address dst, Register src) {5426InstructionMark im(this);5427prefix(dst, src);5428emit_int8(0x29);5429emit_operand(src, dst);5430}54315432void Assembler::subl(Register dst, int32_t imm32) {5433prefix(dst);5434emit_arith(0x81, 0xE8, dst, imm32);5435}54365437// Force generation of a 4 byte immediate value even if it fits into 8bit5438void Assembler::subl_imm32(Register dst, int32_t imm32) {5439prefix(dst);5440emit_arith_imm32(0x81, 0xE8, dst, imm32);5441}54425443void Assembler::subl(Register dst, Address src) {5444InstructionMark im(this);5445prefix(src, dst);5446emit_int8(0x2B);5447emit_operand(dst, src);5448}54495450void Assembler::subl(Register dst, Register src) {5451(void) prefix_and_encode(dst->encoding(), src->encoding());5452emit_arith(0x2B, 0xC0, dst, src);5453}54545455void Assembler::subsd(XMMRegister dst, XMMRegister src) {5456NOT_LP64(assert(VM_Version::supports_sse2(), ""));5457InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5458attributes.set_rex_vex_w_reverted();5459int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5460emit_int16(0x5C, (0xC0 | encode));5461}54625463void Assembler::subsd(XMMRegister dst, Address src) {5464NOT_LP64(assert(VM_Version::supports_sse2(), ""));5465InstructionMark im(this);5466InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5467attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);5468attributes.set_rex_vex_w_reverted();5469simd_prefix(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5470emit_int8(0x5C);5471emit_operand(dst, src);5472}54735474void Assembler::subss(XMMRegister dst, XMMRegister src) {5475NOT_LP64(assert(VM_Version::supports_sse(), ""));5476InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true , /* uses_vl */ false);5477int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5478emit_int16(0x5C, (0xC0 | encode));5479}54805481void Assembler::subss(XMMRegister dst, Address src) {5482NOT_LP64(assert(VM_Version::supports_sse(), ""));5483InstructionMark im(this);5484InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5485attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);5486simd_prefix(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5487emit_int8(0x5C);5488emit_operand(dst, src);5489}54905491void Assembler::testb(Register dst, int imm8) {5492NOT_LP64(assert(dst->has_byte_register(), "must have byte register"));5493(void) prefix_and_encode(dst->encoding(), true);5494emit_arith_b(0xF6, 0xC0, dst, imm8);5495}54965497void Assembler::testb(Address dst, int imm8) {5498InstructionMark im(this);5499prefix(dst);5500emit_int8((unsigned char)0xF6);5501emit_operand(rax, dst, 1);5502emit_int8(imm8);5503}55045505void Assembler::testl(Register dst, int32_t imm32) {5506// not using emit_arith because test5507// doesn't support sign-extension of5508// 8bit operands5509int encode = dst->encoding();5510encode = prefix_and_encode(encode);5511emit_int16((unsigned char)0xF7, (0xC0 | encode));5512emit_int32(imm32);5513}55145515void Assembler::testl(Register dst, Register src) {5516(void) prefix_and_encode(dst->encoding(), src->encoding());5517emit_arith(0x85, 0xC0, dst, src);5518}55195520void Assembler::testl(Register dst, Address src) {5521InstructionMark im(this);5522prefix(src, dst);5523emit_int8((unsigned char)0x85);5524emit_operand(dst, src);5525}55265527void Assembler::tzcntl(Register dst, Register src) {5528assert(VM_Version::supports_bmi1(), "tzcnt instruction not supported");5529emit_int8((unsigned char)0xF3);5530int encode = prefix_and_encode(dst->encoding(), src->encoding());5531emit_int24(0x0F,5532(unsigned char)0xBC,55330xC0 | encode);5534}55355536void Assembler::tzcntq(Register dst, Register src) {5537assert(VM_Version::supports_bmi1(), "tzcnt instruction not supported");5538emit_int8((unsigned char)0xF3);5539int encode = prefixq_and_encode(dst->encoding(), src->encoding());5540emit_int24(0x0F, (unsigned char)0xBC, (0xC0 | encode));5541}55425543void Assembler::ucomisd(XMMRegister dst, Address src) {5544NOT_LP64(assert(VM_Version::supports_sse2(), ""));5545InstructionMark im(this);5546InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5547attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);5548attributes.set_rex_vex_w_reverted();5549simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5550emit_int8(0x2E);5551emit_operand(dst, src);5552}55535554void Assembler::ucomisd(XMMRegister dst, XMMRegister src) {5555NOT_LP64(assert(VM_Version::supports_sse2(), ""));5556InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5557attributes.set_rex_vex_w_reverted();5558int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5559emit_int16(0x2E, (0xC0 | encode));5560}55615562void Assembler::ucomiss(XMMRegister dst, Address src) {5563NOT_LP64(assert(VM_Version::supports_sse(), ""));5564InstructionMark im(this);5565InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5566attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);5567simd_prefix(dst, xnoreg, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5568emit_int8(0x2E);5569emit_operand(dst, src);5570}55715572void Assembler::ucomiss(XMMRegister dst, XMMRegister src) {5573NOT_LP64(assert(VM_Version::supports_sse(), ""));5574InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5575int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5576emit_int16(0x2E, (0xC0 | encode));5577}55785579void Assembler::xabort(int8_t imm8) {5580emit_int24((unsigned char)0xC6, (unsigned char)0xF8, (imm8 & 0xFF));5581}55825583void Assembler::xaddb(Address dst, Register src) {5584InstructionMark im(this);5585prefix(dst, src, true);5586emit_int16(0x0F, (unsigned char)0xC0);5587emit_operand(src, dst);5588}55895590void Assembler::xaddw(Address dst, Register src) {5591InstructionMark im(this);5592emit_int8(0x66);5593prefix(dst, src);5594emit_int16(0x0F, (unsigned char)0xC1);5595emit_operand(src, dst);5596}55975598void Assembler::xaddl(Address dst, Register src) {5599InstructionMark im(this);5600prefix(dst, src);5601emit_int16(0x0F, (unsigned char)0xC1);5602emit_operand(src, dst);5603}56045605void Assembler::xbegin(Label& abort, relocInfo::relocType rtype) {5606InstructionMark im(this);5607relocate(rtype);5608if (abort.is_bound()) {5609address entry = target(abort);5610assert(entry != NULL, "abort entry NULL");5611intptr_t offset = entry - pc();5612emit_int16((unsigned char)0xC7, (unsigned char)0xF8);5613emit_int32(offset - 6); // 2 opcode + 4 address5614} else {5615abort.add_patch_at(code(), locator());5616emit_int16((unsigned char)0xC7, (unsigned char)0xF8);5617emit_int32(0);5618}5619}56205621void Assembler::xchgb(Register dst, Address src) { // xchg5622InstructionMark im(this);5623prefix(src, dst, true);5624emit_int8((unsigned char)0x86);5625emit_operand(dst, src);5626}56275628void Assembler::xchgw(Register dst, Address src) { // xchg5629InstructionMark im(this);5630emit_int8(0x66);5631prefix(src, dst);5632emit_int8((unsigned char)0x87);5633emit_operand(dst, src);5634}56355636void Assembler::xchgl(Register dst, Address src) { // xchg5637InstructionMark im(this);5638prefix(src, dst);5639emit_int8((unsigned char)0x87);5640emit_operand(dst, src);5641}56425643void Assembler::xchgl(Register dst, Register src) {5644int encode = prefix_and_encode(dst->encoding(), src->encoding());5645emit_int16((unsigned char)0x87, (0xC0 | encode));5646}56475648void Assembler::xend() {5649emit_int24(0x0F, 0x01, (unsigned char)0xD5);5650}56515652void Assembler::xgetbv() {5653emit_int24(0x0F, 0x01, (unsigned char)0xD0);5654}56555656void Assembler::xorl(Address dst, int32_t imm32) {5657InstructionMark im(this);5658prefix(dst);5659emit_arith_operand(0x81, as_Register(6), dst, imm32);5660}56615662void Assembler::xorl(Register dst, int32_t imm32) {5663prefix(dst);5664emit_arith(0x81, 0xF0, dst, imm32);5665}56665667void Assembler::xorl(Register dst, Address src) {5668InstructionMark im(this);5669prefix(src, dst);5670emit_int8(0x33);5671emit_operand(dst, src);5672}56735674void Assembler::xorl(Register dst, Register src) {5675(void) prefix_and_encode(dst->encoding(), src->encoding());5676emit_arith(0x33, 0xC0, dst, src);5677}56785679void Assembler::xorl(Address dst, Register src) {5680InstructionMark im(this);5681prefix(dst, src);5682emit_int8(0x31);5683emit_operand(src, dst);5684}56855686void Assembler::xorb(Register dst, Address src) {5687InstructionMark im(this);5688prefix(src, dst);5689emit_int8(0x32);5690emit_operand(dst, src);5691}56925693void Assembler::xorb(Address dst, Register src) {5694InstructionMark im(this);5695prefix(dst, src, true);5696emit_int8(0x30);5697emit_operand(src, dst);5698}56995700void Assembler::xorw(Register dst, Register src) {5701(void)prefix_and_encode(dst->encoding(), src->encoding());5702emit_arith(0x33, 0xC0, dst, src);5703}57045705// AVX 3-operands scalar float-point arithmetic instructions57065707void Assembler::vaddsd(XMMRegister dst, XMMRegister nds, Address src) {5708assert(VM_Version::supports_avx(), "");5709InstructionMark im(this);5710InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5711attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);5712attributes.set_rex_vex_w_reverted();5713vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5714emit_int8(0x58);5715emit_operand(dst, src);5716}57175718void Assembler::vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {5719assert(VM_Version::supports_avx(), "");5720InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5721attributes.set_rex_vex_w_reverted();5722int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5723emit_int16(0x58, (0xC0 | encode));5724}57255726void Assembler::vaddss(XMMRegister dst, XMMRegister nds, Address src) {5727assert(VM_Version::supports_avx(), "");5728InstructionMark im(this);5729InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5730attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);5731vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5732emit_int8(0x58);5733emit_operand(dst, src);5734}57355736void Assembler::vaddss(XMMRegister dst, XMMRegister nds, XMMRegister src) {5737assert(VM_Version::supports_avx(), "");5738InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5739int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5740emit_int16(0x58, (0xC0 | encode));5741}57425743void Assembler::vdivsd(XMMRegister dst, XMMRegister nds, Address src) {5744assert(VM_Version::supports_avx(), "");5745InstructionMark im(this);5746InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5747attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);5748attributes.set_rex_vex_w_reverted();5749vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5750emit_int8(0x5E);5751emit_operand(dst, src);5752}57535754void Assembler::vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {5755assert(VM_Version::supports_avx(), "");5756InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5757attributes.set_rex_vex_w_reverted();5758int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5759emit_int16(0x5E, (0xC0 | encode));5760}57615762void Assembler::vdivss(XMMRegister dst, XMMRegister nds, Address src) {5763assert(VM_Version::supports_avx(), "");5764InstructionMark im(this);5765InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5766attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);5767vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5768emit_int8(0x5E);5769emit_operand(dst, src);5770}57715772void Assembler::vdivss(XMMRegister dst, XMMRegister nds, XMMRegister src) {5773assert(VM_Version::supports_avx(), "");5774InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5775int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5776emit_int16(0x5E, (0xC0 | encode));5777}57785779void Assembler::vfmadd231sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) {5780assert(VM_Version::supports_fma(), "");5781InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5782int encode = vex_prefix_and_encode(dst->encoding(), src1->encoding(), src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);5783emit_int16((unsigned char)0xB9, (0xC0 | encode));5784}57855786void Assembler::vfmadd231ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) {5787assert(VM_Version::supports_fma(), "");5788InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* 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::vmulsd(XMMRegister dst, XMMRegister nds, Address src) {5794assert(VM_Version::supports_avx(), "");5795InstructionMark im(this);5796InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5797attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);5798attributes.set_rex_vex_w_reverted();5799vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5800emit_int8(0x59);5801emit_operand(dst, src);5802}58035804void Assembler::vmulsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {5805assert(VM_Version::supports_avx(), "");5806InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5807attributes.set_rex_vex_w_reverted();5808int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5809emit_int16(0x59, (0xC0 | encode));5810}58115812void Assembler::vmulss(XMMRegister dst, XMMRegister nds, Address src) {5813assert(VM_Version::supports_avx(), "");5814InstructionMark im(this);5815InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5816attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);5817vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5818emit_int8(0x59);5819emit_operand(dst, src);5820}58215822void Assembler::vmulss(XMMRegister dst, XMMRegister nds, XMMRegister src) {5823assert(VM_Version::supports_avx(), "");5824InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5825int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5826emit_int16(0x59, (0xC0 | encode));5827}58285829void Assembler::vsubsd(XMMRegister dst, XMMRegister nds, Address src) {5830assert(VM_Version::supports_avx(), "");5831InstructionMark im(this);5832InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5833attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);5834attributes.set_rex_vex_w_reverted();5835vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5836emit_int8(0x5C);5837emit_operand(dst, src);5838}58395840void Assembler::vsubsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {5841assert(VM_Version::supports_avx(), "");5842InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5843attributes.set_rex_vex_w_reverted();5844int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);5845emit_int16(0x5C, (0xC0 | encode));5846}58475848void Assembler::vsubss(XMMRegister dst, XMMRegister nds, Address src) {5849assert(VM_Version::supports_avx(), "");5850InstructionMark im(this);5851InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5852attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);5853vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5854emit_int8(0x5C);5855emit_operand(dst, src);5856}58575858void Assembler::vsubss(XMMRegister dst, XMMRegister nds, XMMRegister src) {5859assert(VM_Version::supports_avx(), "");5860InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);5861int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);5862emit_int16(0x5C, (0xC0 | encode));5863}58645865//====================VECTOR ARITHMETIC=====================================58665867// Float-point vector arithmetic58685869void Assembler::addpd(XMMRegister dst, XMMRegister src) {5870NOT_LP64(assert(VM_Version::supports_sse2(), ""));5871InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5872attributes.set_rex_vex_w_reverted();5873int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5874emit_int16(0x58, (0xC0 | encode));5875}58765877void Assembler::addpd(XMMRegister dst, Address src) {5878NOT_LP64(assert(VM_Version::supports_sse2(), ""));5879InstructionMark im(this);5880InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5881attributes.set_rex_vex_w_reverted();5882attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);5883simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5884emit_int8(0x58);5885emit_operand(dst, src);5886}588758885889void Assembler::addps(XMMRegister dst, XMMRegister src) {5890NOT_LP64(assert(VM_Version::supports_sse2(), ""));5891InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5892int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5893emit_int16(0x58, (0xC0 | encode));5894}58955896void Assembler::vaddpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {5897assert(VM_Version::supports_avx(), "");5898InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5899attributes.set_rex_vex_w_reverted();5900int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5901emit_int16(0x58, (0xC0 | encode));5902}59035904void Assembler::vaddps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {5905assert(VM_Version::supports_avx(), "");5906InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5907int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5908emit_int16(0x58, (0xC0 | encode));5909}59105911void Assembler::vaddpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {5912assert(VM_Version::supports_avx(), "");5913InstructionMark im(this);5914InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5915attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);5916attributes.set_rex_vex_w_reverted();5917vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5918emit_int8(0x58);5919emit_operand(dst, src);5920}59215922void Assembler::vaddps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {5923assert(VM_Version::supports_avx(), "");5924InstructionMark im(this);5925InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5926attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);5927vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5928emit_int8(0x58);5929emit_operand(dst, src);5930}59315932void Assembler::subpd(XMMRegister dst, XMMRegister src) {5933NOT_LP64(assert(VM_Version::supports_sse2(), ""));5934InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5935attributes.set_rex_vex_w_reverted();5936int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5937emit_int16(0x5C, (0xC0 | encode));5938}59395940void Assembler::subps(XMMRegister dst, XMMRegister src) {5941NOT_LP64(assert(VM_Version::supports_sse2(), ""));5942InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5943int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5944emit_int16(0x5C, (0xC0 | encode));5945}59465947void Assembler::vsubpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {5948assert(VM_Version::supports_avx(), "");5949InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5950attributes.set_rex_vex_w_reverted();5951int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5952emit_int16(0x5C, (0xC0 | encode));5953}59545955void Assembler::vsubps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {5956assert(VM_Version::supports_avx(), "");5957InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5958int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5959emit_int16(0x5C, (0xC0 | encode));5960}59615962void Assembler::vsubpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {5963assert(VM_Version::supports_avx(), "");5964InstructionMark im(this);5965InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5966attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);5967attributes.set_rex_vex_w_reverted();5968vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5969emit_int8(0x5C);5970emit_operand(dst, src);5971}59725973void Assembler::vsubps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {5974assert(VM_Version::supports_avx(), "");5975InstructionMark im(this);5976InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5977attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);5978vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);5979emit_int8(0x5C);5980emit_operand(dst, src);5981}59825983void Assembler::mulpd(XMMRegister dst, XMMRegister src) {5984NOT_LP64(assert(VM_Version::supports_sse2(), ""));5985InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5986attributes.set_rex_vex_w_reverted();5987int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5988emit_int16(0x59, (0xC0 | encode));5989}59905991void Assembler::mulpd(XMMRegister dst, Address src) {5992NOT_LP64(assert(VM_Version::supports_sse2(), ""));5993InstructionMark im(this);5994InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);5995attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);5996attributes.set_rex_vex_w_reverted();5997simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);5998emit_int8(0x59);5999emit_operand(dst, src);6000}60016002void Assembler::mulps(XMMRegister dst, XMMRegister src) {6003NOT_LP64(assert(VM_Version::supports_sse2(), ""));6004InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6005int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6006emit_int16(0x59, (0xC0 | encode));6007}60086009void Assembler::vmulpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6010assert(VM_Version::supports_avx(), "");6011InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6012attributes.set_rex_vex_w_reverted();6013int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6014emit_int16(0x59, (0xC0 | encode));6015}60166017void Assembler::vmulps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6018assert(VM_Version::supports_avx(), "");6019InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6020int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6021emit_int16(0x59, (0xC0 | encode));6022}60236024void Assembler::vmulpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6025assert(VM_Version::supports_avx(), "");6026InstructionMark im(this);6027InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6028attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6029attributes.set_rex_vex_w_reverted();6030vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6031emit_int8(0x59);6032emit_operand(dst, src);6033}60346035void Assembler::vmulps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6036assert(VM_Version::supports_avx(), "");6037InstructionMark im(this);6038InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6039attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6040vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6041emit_int8(0x59);6042emit_operand(dst, src);6043}60446045void Assembler::vfmadd231pd(XMMRegister dst, XMMRegister src1, XMMRegister src2, int vector_len) {6046assert(VM_Version::supports_fma(), "");6047InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6048int encode = vex_prefix_and_encode(dst->encoding(), src1->encoding(), src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6049emit_int16((unsigned char)0xB8, (0xC0 | encode));6050}60516052void Assembler::vfmadd231ps(XMMRegister dst, XMMRegister src1, XMMRegister src2, int vector_len) {6053assert(VM_Version::supports_fma(), "");6054InstructionAttr attributes(vector_len, /* vex_w */ false, /* 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::vfmadd231pd(XMMRegister dst, XMMRegister src1, Address src2, int vector_len) {6060assert(VM_Version::supports_fma(), "");6061InstructionMark im(this);6062InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6063attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6064vex_prefix(src2, src1->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6065emit_int8((unsigned char)0xB8);6066emit_operand(dst, src2);6067}60686069void Assembler::vfmadd231ps(XMMRegister dst, XMMRegister src1, Address src2, int vector_len) {6070assert(VM_Version::supports_fma(), "");6071InstructionMark im(this);6072InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6073attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6074vex_prefix(src2, src1->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6075emit_int8((unsigned char)0xB8);6076emit_operand(dst, src2);6077}60786079void Assembler::divpd(XMMRegister dst, XMMRegister src) {6080NOT_LP64(assert(VM_Version::supports_sse2(), ""));6081InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6082attributes.set_rex_vex_w_reverted();6083int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6084emit_int16(0x5E, (0xC0 | encode));6085}60866087void Assembler::divps(XMMRegister dst, XMMRegister src) {6088NOT_LP64(assert(VM_Version::supports_sse2(), ""));6089InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6090int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6091emit_int16(0x5E, (0xC0 | encode));6092}60936094void Assembler::vdivpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6095assert(VM_Version::supports_avx(), "");6096InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6097attributes.set_rex_vex_w_reverted();6098int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6099emit_int16(0x5E, (0xC0 | encode));6100}61016102void Assembler::vdivps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6103assert(VM_Version::supports_avx(), "");6104InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6105int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6106emit_int16(0x5E, (0xC0 | encode));6107}61086109void Assembler::vdivpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6110assert(VM_Version::supports_avx(), "");6111InstructionMark im(this);6112InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6113attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6114attributes.set_rex_vex_w_reverted();6115vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6116emit_int8(0x5E);6117emit_operand(dst, src);6118}61196120void Assembler::vdivps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6121assert(VM_Version::supports_avx(), "");6122InstructionMark im(this);6123InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6124attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6125vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6126emit_int8(0x5E);6127emit_operand(dst, src);6128}61296130void Assembler::vroundpd(XMMRegister dst, XMMRegister src, int32_t rmode, int vector_len) {6131assert(VM_Version::supports_avx(), "");6132InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);6133int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);6134emit_int24(0x09, (0xC0 | encode), (rmode));6135}61366137void Assembler::vroundpd(XMMRegister dst, Address src, int32_t rmode, int vector_len) {6138assert(VM_Version::supports_avx(), "");6139InstructionMark im(this);6140InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);6141vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);6142emit_int8(0x09);6143emit_operand(dst, src);6144emit_int8((rmode));6145}61466147void Assembler::vrndscalepd(XMMRegister dst, XMMRegister src, int32_t rmode, int vector_len) {6148assert(VM_Version::supports_evex(), "requires EVEX support");6149InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6150attributes.set_is_evex_instruction();6151int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);6152emit_int24(0x09, (0xC0 | encode), (rmode));6153}61546155void Assembler::vrndscalepd(XMMRegister dst, Address src, int32_t rmode, int vector_len) {6156assert(VM_Version::supports_evex(), "requires EVEX support");6157assert(dst != xnoreg, "sanity");6158InstructionMark im(this);6159InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6160attributes.set_is_evex_instruction();6161attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6162vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);6163emit_int8(0x09);6164emit_operand(dst, src);6165emit_int8((rmode));6166}616761686169void Assembler::vsqrtpd(XMMRegister dst, XMMRegister src, int vector_len) {6170assert(VM_Version::supports_avx(), "");6171InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6172attributes.set_rex_vex_w_reverted();6173int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6174emit_int16(0x51, (0xC0 | encode));6175}61766177void Assembler::vsqrtpd(XMMRegister dst, Address src, int vector_len) {6178assert(VM_Version::supports_avx(), "");6179InstructionMark im(this);6180InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6181attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6182attributes.set_rex_vex_w_reverted();6183vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6184emit_int8(0x51);6185emit_operand(dst, src);6186}61876188void Assembler::vsqrtps(XMMRegister dst, XMMRegister src, int vector_len) {6189assert(VM_Version::supports_avx(), "");6190InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6191int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6192emit_int16(0x51, (0xC0 | encode));6193}61946195void Assembler::vsqrtps(XMMRegister dst, Address src, int vector_len) {6196assert(VM_Version::supports_avx(), "");6197InstructionMark im(this);6198InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6199attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6200vex_prefix(src, 0, dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6201emit_int8(0x51);6202emit_operand(dst, src);6203}62046205void Assembler::andpd(XMMRegister dst, XMMRegister src) {6206NOT_LP64(assert(VM_Version::supports_sse2(), ""));6207InstructionAttr attributes(AVX_128bit, /* rex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6208attributes.set_rex_vex_w_reverted();6209int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6210emit_int16(0x54, (0xC0 | encode));6211}62126213void Assembler::andps(XMMRegister dst, XMMRegister src) {6214NOT_LP64(assert(VM_Version::supports_sse(), ""));6215InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6216int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6217emit_int16(0x54, (0xC0 | encode));6218}62196220void Assembler::andps(XMMRegister dst, Address src) {6221NOT_LP64(assert(VM_Version::supports_sse(), ""));6222InstructionMark im(this);6223InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6224attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6225simd_prefix(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6226emit_int8(0x54);6227emit_operand(dst, src);6228}62296230void Assembler::andpd(XMMRegister dst, Address src) {6231NOT_LP64(assert(VM_Version::supports_sse2(), ""));6232InstructionMark im(this);6233InstructionAttr attributes(AVX_128bit, /* rex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6234attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6235attributes.set_rex_vex_w_reverted();6236simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6237emit_int8(0x54);6238emit_operand(dst, src);6239}62406241void Assembler::vandpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6242assert(VM_Version::supports_avx(), "");6243InstructionAttr attributes(vector_len, /* vex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6244attributes.set_rex_vex_w_reverted();6245int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6246emit_int16(0x54, (0xC0 | encode));6247}62486249void Assembler::vandps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6250assert(VM_Version::supports_avx(), "");6251InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6252int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6253emit_int16(0x54, (0xC0 | encode));6254}62556256void Assembler::vandpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6257assert(VM_Version::supports_avx(), "");6258InstructionMark im(this);6259InstructionAttr attributes(vector_len, /* vex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6260attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6261attributes.set_rex_vex_w_reverted();6262vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6263emit_int8(0x54);6264emit_operand(dst, src);6265}62666267void Assembler::vandps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6268assert(VM_Version::supports_avx(), "");6269InstructionMark im(this);6270InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6271attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6272vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6273emit_int8(0x54);6274emit_operand(dst, src);6275}62766277void Assembler::unpckhpd(XMMRegister dst, XMMRegister src) {6278NOT_LP64(assert(VM_Version::supports_sse2(), ""));6279InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6280attributes.set_rex_vex_w_reverted();6281int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6282emit_int8(0x15);6283emit_int8((0xC0 | encode));6284}62856286void Assembler::unpcklpd(XMMRegister dst, XMMRegister src) {6287NOT_LP64(assert(VM_Version::supports_sse2(), ""));6288InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6289attributes.set_rex_vex_w_reverted();6290int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6291emit_int16(0x14, (0xC0 | encode));6292}62936294void Assembler::xorpd(XMMRegister dst, XMMRegister src) {6295NOT_LP64(assert(VM_Version::supports_sse2(), ""));6296InstructionAttr attributes(AVX_128bit, /* rex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6297attributes.set_rex_vex_w_reverted();6298int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6299emit_int16(0x57, (0xC0 | encode));6300}63016302void Assembler::xorps(XMMRegister dst, XMMRegister src) {6303NOT_LP64(assert(VM_Version::supports_sse(), ""));6304InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6305int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6306emit_int16(0x57, (0xC0 | encode));6307}63086309void Assembler::xorpd(XMMRegister dst, Address src) {6310NOT_LP64(assert(VM_Version::supports_sse2(), ""));6311InstructionMark im(this);6312InstructionAttr attributes(AVX_128bit, /* rex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6313attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6314attributes.set_rex_vex_w_reverted();6315simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6316emit_int8(0x57);6317emit_operand(dst, src);6318}63196320void Assembler::xorps(XMMRegister dst, Address src) {6321NOT_LP64(assert(VM_Version::supports_sse(), ""));6322InstructionMark im(this);6323InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6324attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6325simd_prefix(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6326emit_int8(0x57);6327emit_operand(dst, src);6328}63296330void Assembler::vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6331assert(VM_Version::supports_avx(), "");6332InstructionAttr attributes(vector_len, /* vex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6333attributes.set_rex_vex_w_reverted();6334int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6335emit_int16(0x57, (0xC0 | encode));6336}63376338void Assembler::vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6339assert(VM_Version::supports_avx(), "");6340InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6341int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6342emit_int16(0x57, (0xC0 | encode));6343}63446345void Assembler::vxorpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6346assert(VM_Version::supports_avx(), "");6347InstructionMark im(this);6348InstructionAttr attributes(vector_len, /* vex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6349attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6350attributes.set_rex_vex_w_reverted();6351vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6352emit_int8(0x57);6353emit_operand(dst, src);6354}63556356void Assembler::vxorps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6357assert(VM_Version::supports_avx(), "");6358InstructionMark im(this);6359InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6360attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6361vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6362emit_int8(0x57);6363emit_operand(dst, src);6364}63656366// Integer vector arithmetic6367void Assembler::vphaddw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6368assert(VM_Version::supports_avx() && (vector_len == 0) ||6369VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");6370InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);6371int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6372emit_int16(0x01, (0xC0 | encode));6373}63746375void Assembler::vphaddd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6376assert(VM_Version::supports_avx() && (vector_len == 0) ||6377VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");6378InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);6379int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6380emit_int16(0x02, (0xC0 | encode));6381}63826383void Assembler::paddb(XMMRegister dst, XMMRegister src) {6384NOT_LP64(assert(VM_Version::supports_sse2(), ""));6385InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6386int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6387emit_int16((unsigned char)0xFC, (0xC0 | encode));6388}63896390void Assembler::paddw(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)0xFD, (0xC0 | encode));6395}63966397void Assembler::paddd(XMMRegister dst, XMMRegister src) {6398NOT_LP64(assert(VM_Version::supports_sse2(), ""));6399InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* 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)0xFE, (0xC0 | encode));6402}64036404void Assembler::paddd(XMMRegister dst, Address src) {6405NOT_LP64(assert(VM_Version::supports_sse2(), ""));6406InstructionMark im(this);6407InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6408simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6409emit_int8((unsigned char)0xFE);6410emit_operand(dst, src);6411}64126413void Assembler::paddq(XMMRegister dst, XMMRegister src) {6414NOT_LP64(assert(VM_Version::supports_sse2(), ""));6415InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6416attributes.set_rex_vex_w_reverted();6417int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6418emit_int16((unsigned char)0xD4, (0xC0 | encode));6419}64206421void Assembler::phaddw(XMMRegister dst, XMMRegister src) {6422assert(VM_Version::supports_sse3(), "");6423InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);6424int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6425emit_int16(0x01, (0xC0 | encode));6426}64276428void Assembler::phaddd(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(0x02, (0xC0 | encode));6433}64346435void Assembler::vpaddb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6436assert(UseAVX > 0, "requires some form of AVX");6437InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6438int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6439emit_int16((unsigned char)0xFC, (0xC0 | encode));6440}64416442void Assembler::vpaddw(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)0xFD, (0xC0 | encode));6447}64486449void Assembler::vpaddd(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 */ false, /* 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)0xFE, (0xC0 | encode));6454}64556456void Assembler::vpaddq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6457assert(UseAVX > 0, "requires some form of AVX");6458InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6459attributes.set_rex_vex_w_reverted();6460int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6461emit_int16((unsigned char)0xD4, (0xC0 | encode));6462}64636464void Assembler::vpaddb(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6465assert(UseAVX > 0, "requires some form of AVX");6466InstructionMark im(this);6467InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6468attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);6469vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6470emit_int8((unsigned char)0xFC);6471emit_operand(dst, src);6472}64736474void Assembler::vpaddw(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6475assert(UseAVX > 0, "requires some form of AVX");6476InstructionMark im(this);6477InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6478attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);6479vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6480emit_int8((unsigned char)0xFD);6481emit_operand(dst, src);6482}64836484void Assembler::vpaddd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6485assert(UseAVX > 0, "requires some form of AVX");6486InstructionMark im(this);6487InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6488attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6489vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6490emit_int8((unsigned char)0xFE);6491emit_operand(dst, src);6492}64936494void Assembler::vpaddq(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6495assert(UseAVX > 0, "requires some form of AVX");6496InstructionMark im(this);6497InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6498attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6499attributes.set_rex_vex_w_reverted();6500vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6501emit_int8((unsigned char)0xD4);6502emit_operand(dst, src);6503}65046505void Assembler::psubb(XMMRegister dst, XMMRegister src) {6506NOT_LP64(assert(VM_Version::supports_sse2(), ""));6507InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6508int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6509emit_int16((unsigned char)0xF8, (0xC0 | encode));6510}65116512void Assembler::psubw(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)0xF9, (0xC0 | encode));6517}65186519void Assembler::psubd(XMMRegister dst, XMMRegister src) {6520InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6521int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6522emit_int16((unsigned char)0xFA, (0xC0 | encode));6523}65246525void Assembler::psubq(XMMRegister dst, XMMRegister src) {6526NOT_LP64(assert(VM_Version::supports_sse2(), ""));6527InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6528attributes.set_rex_vex_w_reverted();6529int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6530emit_int8((unsigned char)0xFB);6531emit_int8((0xC0 | encode));6532}65336534void Assembler::vpsubb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6535assert(UseAVX > 0, "requires some form of AVX");6536InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6537int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6538emit_int16((unsigned char)0xF8, (0xC0 | encode));6539}65406541void Assembler::vpsubw(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)0xF9, (0xC0 | encode));6546}65476548void Assembler::vpsubd(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 */ false, /* 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)0xFA, (0xC0 | encode));6553}65546555void Assembler::vpsubq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6556assert(UseAVX > 0, "requires some form of AVX");6557InstructionAttr attributes(vector_len, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6558attributes.set_rex_vex_w_reverted();6559int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6560emit_int16((unsigned char)0xFB, (0xC0 | encode));6561}65626563void Assembler::vpsubb(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6564assert(UseAVX > 0, "requires some form of AVX");6565InstructionMark im(this);6566InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6567attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);6568vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6569emit_int8((unsigned char)0xF8);6570emit_operand(dst, src);6571}65726573void Assembler::vpsubw(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6574assert(UseAVX > 0, "requires some form of AVX");6575InstructionMark im(this);6576InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6577attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);6578vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6579emit_int8((unsigned char)0xF9);6580emit_operand(dst, src);6581}65826583void Assembler::vpsubd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6584assert(UseAVX > 0, "requires some form of AVX");6585InstructionMark im(this);6586InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6587attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6588vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6589emit_int8((unsigned char)0xFA);6590emit_operand(dst, src);6591}65926593void Assembler::vpsubq(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6594assert(UseAVX > 0, "requires some form of AVX");6595InstructionMark im(this);6596InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6597attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6598attributes.set_rex_vex_w_reverted();6599vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6600emit_int8((unsigned char)0xFB);6601emit_operand(dst, src);6602}66036604void Assembler::pmullw(XMMRegister dst, XMMRegister src) {6605NOT_LP64(assert(VM_Version::supports_sse2(), ""));6606InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6607int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6608emit_int16((unsigned char)0xD5, (0xC0 | encode));6609}66106611void Assembler::pmulld(XMMRegister dst, XMMRegister src) {6612assert(VM_Version::supports_sse4_1(), "");6613InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6614int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6615emit_int16(0x40, (0xC0 | encode));6616}66176618void Assembler::pmuludq(XMMRegister dst, XMMRegister src) {6619assert(VM_Version::supports_sse2(), "");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, &attributes);6622emit_int16((unsigned char)0xF4, (0xC0 | encode));6623}66246625void Assembler::vpmullw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6626assert(UseAVX > 0, "requires some form of AVX");6627InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6628int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6629emit_int16((unsigned char)0xD5, (0xC0 | encode));6630}66316632void Assembler::vpmulld(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 */ false, /* 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_38, &attributes);6636emit_int16(0x40, (0xC0 | encode));6637}66386639void Assembler::vpmullq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6640assert(UseAVX > 2, "requires some form of EVEX");6641InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6642attributes.set_is_evex_instruction();6643int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6644emit_int16(0x40, (0xC0 | encode));6645}66466647void Assembler::vpmuludq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6648assert(UseAVX > 0, "requires some form of AVX");6649InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6650int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6651emit_int16((unsigned char)0xF4, (0xC0 | encode));6652}66536654void Assembler::vpmullw(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6655assert(UseAVX > 0, "requires some form of AVX");6656InstructionMark im(this);6657InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6658attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);6659vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6660emit_int8((unsigned char)0xD5);6661emit_operand(dst, src);6662}66636664void Assembler::vpmulld(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6665assert(UseAVX > 0, "requires some form of AVX");6666InstructionMark im(this);6667InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6668attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);6669vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6670emit_int8(0x40);6671emit_operand(dst, src);6672}66736674void Assembler::vpmullq(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {6675assert(UseAVX > 2, "requires some form of EVEX");6676InstructionMark im(this);6677InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);6678attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);6679attributes.set_is_evex_instruction();6680vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6681emit_int8(0x40);6682emit_operand(dst, src);6683}66846685// Min, max6686void Assembler::pminsb(XMMRegister dst, XMMRegister src) {6687assert(VM_Version::supports_sse4_1(), "");6688InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6689int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6690emit_int16(0x38, (0xC0 | encode));6691}66926693void Assembler::vpminsb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6694assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :6695(vector_len == AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_avx512bw()), "");6696InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6697int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6698emit_int16(0x38, (0xC0 | encode));6699}67006701void Assembler::pminsw(XMMRegister dst, XMMRegister src) {6702assert(VM_Version::supports_sse2(), "");6703InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6704int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6705emit_int16((unsigned char)0xEA, (0xC0 | encode));6706}67076708void Assembler::vpminsw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6709assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :6710(vector_len == AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_avx512bw()), "");6711InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6712int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6713emit_int16((unsigned char)0xEA, (0xC0 | encode));6714}67156716void Assembler::pminsd(XMMRegister dst, XMMRegister src) {6717assert(VM_Version::supports_sse4_1(), "");6718InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6719int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6720emit_int16(0x39, (0xC0 | encode));6721}67226723void Assembler::vpminsd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6724assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :6725(vector_len == AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_evex()), "");6726InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6727int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6728emit_int16(0x39, (0xC0 | encode));6729}67306731void Assembler::vpminsq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6732assert(UseAVX > 2, "requires AVX512F");6733InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6734attributes.set_is_evex_instruction();6735int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6736emit_int16(0x39, (0xC0 | encode));6737}67386739void Assembler::minps(XMMRegister dst, XMMRegister src) {6740NOT_LP64(assert(VM_Version::supports_sse(), ""));6741InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6742int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6743emit_int16(0x5D, (0xC0 | encode));6744}6745void Assembler::vminps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6746assert(vector_len >= AVX_512bit ? VM_Version::supports_evex() : VM_Version::supports_avx(), "");6747InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6748int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6749emit_int16(0x5D, (0xC0 | encode));6750}67516752void Assembler::minpd(XMMRegister dst, XMMRegister src) {6753NOT_LP64(assert(VM_Version::supports_sse(), ""));6754InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6755int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6756emit_int16(0x5D, (0xC0 | encode));6757}6758void Assembler::vminpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6759assert(vector_len >= AVX_512bit ? VM_Version::supports_evex() : VM_Version::supports_avx(), "");6760InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6761int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6762emit_int16(0x5D, (0xC0 | encode));6763}67646765void Assembler::pmaxsb(XMMRegister dst, XMMRegister src) {6766assert(VM_Version::supports_sse4_1(), "");6767InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6768int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6769emit_int16(0x3C, (0xC0 | encode));6770}67716772void Assembler::vpmaxsb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6773assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :6774(vector_len == AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_avx512bw()), "");6775InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6776int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6777emit_int16(0x3C, (0xC0 | encode));6778}67796780void Assembler::pmaxsw(XMMRegister dst, XMMRegister src) {6781assert(VM_Version::supports_sse2(), "");6782InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6783int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6784emit_int16((unsigned char)0xEE, (0xC0 | encode));6785}67866787void Assembler::vpmaxsw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6788assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :6789(vector_len == AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_avx512bw()), "");6790InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6791int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6792emit_int16((unsigned char)0xEE, (0xC0 | encode));6793}67946795void Assembler::pmaxsd(XMMRegister dst, XMMRegister src) {6796assert(VM_Version::supports_sse4_1(), "");6797InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6798int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6799emit_int16(0x3D, (0xC0 | encode));6800}68016802void Assembler::vpmaxsd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6803assert(vector_len == AVX_128bit ? VM_Version::supports_avx() :6804(vector_len == AVX_256bit ? VM_Version::supports_avx2() : VM_Version::supports_evex()), "");6805InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6806int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6807emit_int16(0x3D, (0xC0 | encode));6808}68096810void Assembler::vpmaxsq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6811assert(UseAVX > 2, "requires AVX512F");6812InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6813attributes.set_is_evex_instruction();6814int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);6815emit_int16(0x3D, (0xC0 | encode));6816}68176818void Assembler::maxps(XMMRegister dst, XMMRegister src) {6819NOT_LP64(assert(VM_Version::supports_sse(), ""));6820InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6821int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6822emit_int16(0x5F, (0xC0 | encode));6823}68246825void Assembler::vmaxps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6826assert(vector_len >= AVX_512bit ? VM_Version::supports_evex() : VM_Version::supports_avx(), "");6827InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6828int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);6829emit_int16(0x5F, (0xC0 | encode));6830}68316832void Assembler::maxpd(XMMRegister dst, XMMRegister src) {6833NOT_LP64(assert(VM_Version::supports_sse(), ""));6834InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6835int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6836emit_int16(0x5F, (0xC0 | encode));6837}68386839void Assembler::vmaxpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {6840assert(vector_len >= AVX_512bit ? VM_Version::supports_evex() : VM_Version::supports_avx(), "");6841InstructionAttr attributes(vector_len, /* vex_w */true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6842int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6843emit_int16(0x5F, (0xC0 | encode));6844}68456846// Shift packed integers left by specified number of bits.6847void Assembler::psllw(XMMRegister dst, int shift) {6848NOT_LP64(assert(VM_Version::supports_sse2(), ""));6849InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6850// XMM6 is for /6 encoding: 66 0F 71 /6 ib6851int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6852emit_int24(0x71, (0xC0 | encode), shift & 0xFF);6853}68546855void Assembler::pslld(XMMRegister dst, int shift) {6856NOT_LP64(assert(VM_Version::supports_sse2(), ""));6857InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6858// XMM6 is for /6 encoding: 66 0F 72 /6 ib6859int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6860emit_int24(0x72, (0xC0 | encode), shift & 0xFF);6861}68626863void Assembler::psllq(XMMRegister dst, int shift) {6864NOT_LP64(assert(VM_Version::supports_sse2(), ""));6865InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6866// XMM6 is for /6 encoding: 66 0F 73 /6 ib6867int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6868emit_int24(0x73, (0xC0 | encode), shift & 0xFF);6869}68706871void Assembler::psllw(XMMRegister dst, XMMRegister shift) {6872NOT_LP64(assert(VM_Version::supports_sse2(), ""));6873InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6874int encode = simd_prefix_and_encode(dst, dst, shift, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6875emit_int16((unsigned char)0xF1, (0xC0 | encode));6876}68776878void Assembler::pslld(XMMRegister dst, XMMRegister shift) {6879NOT_LP64(assert(VM_Version::supports_sse2(), ""));6880InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* 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)0xF2, (0xC0 | encode));6883}68846885void Assembler::psllq(XMMRegister dst, XMMRegister shift) {6886NOT_LP64(assert(VM_Version::supports_sse2(), ""));6887InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6888attributes.set_rex_vex_w_reverted();6889int encode = simd_prefix_and_encode(dst, dst, shift, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6890emit_int16((unsigned char)0xF3, (0xC0 | encode));6891}68926893void Assembler::vpsllw(XMMRegister dst, XMMRegister src, int shift, int vector_len) {6894assert(UseAVX > 0, "requires some form of AVX");6895InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6896// XMM6 is for /6 encoding: 66 0F 71 /6 ib6897int encode = vex_prefix_and_encode(xmm6->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6898emit_int24(0x71, (0xC0 | encode), shift & 0xFF);6899}69006901void Assembler::vpslld(XMMRegister dst, XMMRegister src, int shift, int vector_len) {6902assert(UseAVX > 0, "requires some form of AVX");6903NOT_LP64(assert(VM_Version::supports_sse2(), ""));6904InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6905// XMM6 is for /6 encoding: 66 0F 72 /6 ib6906int encode = vex_prefix_and_encode(xmm6->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6907emit_int24(0x72, (0xC0 | encode), shift & 0xFF);6908}69096910void Assembler::vpsllq(XMMRegister dst, XMMRegister src, int shift, int vector_len) {6911assert(UseAVX > 0, "requires some form of AVX");6912InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6913attributes.set_rex_vex_w_reverted();6914// XMM6 is for /6 encoding: 66 0F 73 /6 ib6915int encode = vex_prefix_and_encode(xmm6->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6916emit_int24(0x73, (0xC0 | encode), shift & 0xFF);6917}69186919void Assembler::vpsllw(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {6920assert(UseAVX > 0, "requires some form of AVX");6921InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6922int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6923emit_int16((unsigned char)0xF1, (0xC0 | encode));6924}69256926void Assembler::vpslld(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 */ false, /* 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)0xF2, (0xC0 | encode));6931}69326933void Assembler::vpsllq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {6934assert(UseAVX > 0, "requires some form of AVX");6935InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6936attributes.set_rex_vex_w_reverted();6937int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6938emit_int16((unsigned char)0xF3, (0xC0 | encode));6939}69406941// Shift packed integers logically right by specified number of bits.6942void Assembler::psrlw(XMMRegister dst, int shift) {6943NOT_LP64(assert(VM_Version::supports_sse2(), ""));6944InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6945// XMM2 is for /2 encoding: 66 0F 71 /2 ib6946int encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6947emit_int24(0x71, (0xC0 | encode), shift & 0xFF);6948}69496950void Assembler::psrld(XMMRegister dst, int shift) {6951NOT_LP64(assert(VM_Version::supports_sse2(), ""));6952InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6953// XMM2 is for /2 encoding: 66 0F 72 /2 ib6954int encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6955emit_int24(0x72, (0xC0 | encode), shift & 0xFF);6956}69576958void Assembler::psrlq(XMMRegister dst, int shift) {6959// Do not confuse it with psrldq SSE2 instruction which6960// shifts 128 bit value in xmm register by number of bytes.6961NOT_LP64(assert(VM_Version::supports_sse2(), ""));6962InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6963attributes.set_rex_vex_w_reverted();6964// XMM2 is for /2 encoding: 66 0F 73 /2 ib6965int encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6966emit_int24(0x73, (0xC0 | encode), shift & 0xFF);6967}69686969void Assembler::psrlw(XMMRegister dst, XMMRegister shift) {6970NOT_LP64(assert(VM_Version::supports_sse2(), ""));6971InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6972int encode = simd_prefix_and_encode(dst, dst, shift, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6973emit_int16((unsigned char)0xD1, (0xC0 | encode));6974}69756976void Assembler::psrld(XMMRegister dst, XMMRegister shift) {6977NOT_LP64(assert(VM_Version::supports_sse2(), ""));6978InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* 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)0xD2, (0xC0 | encode));6981}69826983void Assembler::psrlq(XMMRegister dst, XMMRegister shift) {6984NOT_LP64(assert(VM_Version::supports_sse2(), ""));6985InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);6986attributes.set_rex_vex_w_reverted();6987int encode = simd_prefix_and_encode(dst, dst, shift, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6988emit_int16((unsigned char)0xD3, (0xC0 | encode));6989}69906991void Assembler::vpsrlw(XMMRegister dst, XMMRegister src, int shift, int vector_len) {6992assert(UseAVX > 0, "requires some form of AVX");6993InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);6994// XMM2 is for /2 encoding: 66 0F 71 /2 ib6995int encode = vex_prefix_and_encode(xmm2->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);6996emit_int24(0x71, (0xC0 | encode), shift & 0xFF);6997}69986999void Assembler::vpsrld(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7000assert(UseAVX > 0, "requires some form of AVX");7001InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7002// XMM2 is for /2 encoding: 66 0F 72 /2 ib7003int encode = vex_prefix_and_encode(xmm2->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7004emit_int24(0x72, (0xC0 | encode), shift & 0xFF);7005}70067007void Assembler::vpsrlq(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7008assert(UseAVX > 0, "requires some form of AVX");7009InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7010attributes.set_rex_vex_w_reverted();7011// XMM2 is for /2 encoding: 66 0F 73 /2 ib7012int encode = vex_prefix_and_encode(xmm2->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7013emit_int24(0x73, (0xC0 | encode), shift & 0xFF);7014}70157016void Assembler::vpsrlw(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7017assert(UseAVX > 0, "requires some form of AVX");7018InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7019int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7020emit_int16((unsigned char)0xD1, (0xC0 | encode));7021}70227023void Assembler::vpsrld(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 */ false, /* 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)0xD2, (0xC0 | encode));7028}70297030void Assembler::vpsrlq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7031assert(UseAVX > 0, "requires some form of AVX");7032InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7033attributes.set_rex_vex_w_reverted();7034int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7035emit_int16((unsigned char)0xD3, (0xC0 | encode));7036}70377038void Assembler::evpsrlvw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7039assert(VM_Version::supports_avx512bw(), "");7040InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7041attributes.set_is_evex_instruction();7042int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7043emit_int16(0x10, (0xC0 | encode));7044}70457046void Assembler::evpsllvw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7047assert(VM_Version::supports_avx512bw(), "");7048InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7049attributes.set_is_evex_instruction();7050int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7051emit_int16(0x12, (0xC0 | encode));7052}70537054// Shift packed integers arithmetically right by specified number of bits.7055void Assembler::psraw(XMMRegister dst, int shift) {7056NOT_LP64(assert(VM_Version::supports_sse2(), ""));7057InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7058// XMM4 is for /4 encoding: 66 0F 71 /4 ib7059int encode = simd_prefix_and_encode(xmm4, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7060emit_int24(0x71, (0xC0 | encode), shift & 0xFF);7061}70627063void Assembler::psrad(XMMRegister dst, int shift) {7064NOT_LP64(assert(VM_Version::supports_sse2(), ""));7065InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7066// XMM4 is for /4 encoding: 66 0F 72 /4 ib7067int encode = simd_prefix_and_encode(xmm4, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7068emit_int8(0x72);7069emit_int8((0xC0 | encode));7070emit_int8(shift & 0xFF);7071}70727073void Assembler::psraw(XMMRegister dst, XMMRegister shift) {7074NOT_LP64(assert(VM_Version::supports_sse2(), ""));7075InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7076int encode = simd_prefix_and_encode(dst, dst, shift, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7077emit_int16((unsigned char)0xE1, (0xC0 | encode));7078}70797080void Assembler::psrad(XMMRegister dst, XMMRegister shift) {7081NOT_LP64(assert(VM_Version::supports_sse2(), ""));7082InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* 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)0xE2, (0xC0 | encode));7085}70867087void Assembler::vpsraw(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7088assert(UseAVX > 0, "requires some form of AVX");7089InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7090// XMM4 is for /4 encoding: 66 0F 71 /4 ib7091int encode = vex_prefix_and_encode(xmm4->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7092emit_int24(0x71, (0xC0 | encode), shift & 0xFF);7093}70947095void Assembler::vpsrad(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7096assert(UseAVX > 0, "requires some form of AVX");7097InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7098// XMM4 is for /4 encoding: 66 0F 71 /4 ib7099int encode = vex_prefix_and_encode(xmm4->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7100emit_int24(0x72, (0xC0 | encode), shift & 0xFF);7101}71027103void Assembler::vpsraw(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7104assert(UseAVX > 0, "requires some form of AVX");7105InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7106int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7107emit_int16((unsigned char)0xE1, (0xC0 | encode));7108}71097110void Assembler::vpsrad(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 */ false, /* 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)0xE2, (0xC0 | encode));7115}71167117void Assembler::evpsraq(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7118assert(UseAVX > 2, "requires AVX512");7119assert ((VM_Version::supports_avx512vl() || vector_len == 2), "requires AVX512vl");7120InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7121attributes.set_is_evex_instruction();7122int encode = vex_prefix_and_encode(xmm4->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7123emit_int24((unsigned char)0x72, (0xC0 | encode), shift & 0xFF);7124}71257126void Assembler::evpsraq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7127assert(UseAVX > 2, "requires AVX512");7128assert ((VM_Version::supports_avx512vl() || vector_len == 2), "requires AVX512vl");7129InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7130attributes.set_is_evex_instruction();7131int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7132emit_int16((unsigned char)0xE2, (0xC0 | encode));7133}71347135// logical operations packed integers7136void Assembler::pand(XMMRegister dst, XMMRegister src) {7137NOT_LP64(assert(VM_Version::supports_sse2(), ""));7138InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7139int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7140emit_int16((unsigned char)0xDB, (0xC0 | encode));7141}71427143void Assembler::vpand(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7144assert(UseAVX > 0, "requires some form of AVX");7145InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7146int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7147emit_int16((unsigned char)0xDB, (0xC0 | encode));7148}71497150void Assembler::vpand(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {7151assert(UseAVX > 0, "requires some form of AVX");7152InstructionMark im(this);7153InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7154attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);7155vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7156emit_int8((unsigned char)0xDB);7157emit_operand(dst, src);7158}71597160void Assembler::vpandq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7161assert(VM_Version::supports_evex(), "");7162InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7163int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7164emit_int16((unsigned char)0xDB, (0xC0 | encode));7165}71667167//Variable Shift packed integers logically left.7168void Assembler::vpsllvd(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7169assert(UseAVX > 1, "requires AVX2");7170InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7171int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7172emit_int16(0x47, (0xC0 | encode));7173}71747175void Assembler::vpsllvq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7176assert(UseAVX > 1, "requires AVX2");7177InstructionAttr attributes(vector_len, /* vex_w */ true, /* 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}71817182//Variable Shift packed integers logically right.7183void Assembler::vpsrlvd(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7184assert(UseAVX > 1, "requires AVX2");7185InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7186int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7187emit_int16(0x45, (0xC0 | encode));7188}71897190void Assembler::vpsrlvq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7191assert(UseAVX > 1, "requires AVX2");7192InstructionAttr attributes(vector_len, /* vex_w */ true, /* 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}71967197//Variable right Shift arithmetic packed integers .7198void Assembler::vpsravd(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7199assert(UseAVX > 1, "requires AVX2");7200InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7201int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7202emit_int16(0x46, (0xC0 | encode));7203}72047205void Assembler::evpsravw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7206assert(VM_Version::supports_avx512bw(), "");7207InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7208attributes.set_is_evex_instruction();7209int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7210emit_int16(0x11, (0xC0 | encode));7211}72127213void Assembler::evpsravq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7214assert(UseAVX > 2, "requires AVX512");7215assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires AVX512VL");7216InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7217attributes.set_is_evex_instruction();7218int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7219emit_int16(0x46, (0xC0 | encode));7220}72217222void Assembler::vpshldvd(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7223assert(VM_Version::supports_avx512_vbmi2(), "requires vbmi2");7224InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7225attributes.set_is_evex_instruction();7226int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7227emit_int16(0x71, (0xC0 | encode));7228}72297230void Assembler::vpshrdvd(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7231assert(VM_Version::supports_avx512_vbmi2(), "requires vbmi2");7232InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7233attributes.set_is_evex_instruction();7234int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7235emit_int16(0x73, (0xC0 | encode));7236}72377238void Assembler::pandn(XMMRegister dst, XMMRegister src) {7239NOT_LP64(assert(VM_Version::supports_sse2(), ""));7240InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7241attributes.set_rex_vex_w_reverted();7242int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7243emit_int16((unsigned char)0xDF, (0xC0 | encode));7244}72457246void Assembler::vpandn(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7247assert(UseAVX > 0, "requires some form of AVX");7248InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7249int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7250emit_int16((unsigned char)0xDF, (0xC0 | encode));7251}72527253void Assembler::por(XMMRegister dst, XMMRegister src) {7254NOT_LP64(assert(VM_Version::supports_sse2(), ""));7255InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7256int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7257emit_int16((unsigned char)0xEB, (0xC0 | encode));7258}72597260void Assembler::vpor(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7261assert(UseAVX > 0, "requires some form of AVX");7262InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7263int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7264emit_int16((unsigned char)0xEB, (0xC0 | encode));7265}72667267void Assembler::vpor(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {7268assert(UseAVX > 0, "requires some form of AVX");7269InstructionMark im(this);7270InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7271attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);7272vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7273emit_int8((unsigned char)0xEB);7274emit_operand(dst, src);7275}72767277void Assembler::vporq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7278assert(VM_Version::supports_evex(), "");7279InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7280int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7281emit_int16((unsigned char)0xEB, (0xC0 | encode));7282}728372847285void Assembler::evpord(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len) {7286assert(VM_Version::supports_evex(), "");7287// Encoding: EVEX.NDS.XXX.66.0F.W0 EB /r7288InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);7289attributes.set_is_evex_instruction();7290attributes.set_embedded_opmask_register_specifier(mask);7291if (merge) {7292attributes.reset_is_clear_context();7293}7294int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7295emit_int16((unsigned char)0xEB, (0xC0 | encode));7296}72977298void Assembler::evpord(XMMRegister dst, KRegister mask, XMMRegister nds, Address src, bool merge, int vector_len) {7299assert(VM_Version::supports_evex(), "");7300// Encoding: EVEX.NDS.XXX.66.0F.W0 EB /r7301InstructionMark im(this);7302InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);7303attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_NObit);7304attributes.set_is_evex_instruction();7305attributes.set_embedded_opmask_register_specifier(mask);7306if (merge) {7307attributes.reset_is_clear_context();7308}7309vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7310emit_int8((unsigned char)0xEB);7311emit_operand(dst, src);7312}73137314void Assembler::pxor(XMMRegister dst, XMMRegister src) {7315NOT_LP64(assert(VM_Version::supports_sse2(), ""));7316InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7317int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7318emit_int16((unsigned char)0xEF, (0xC0 | encode));7319}73207321void Assembler::vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7322assert(UseAVX > 0, "requires some form of AVX");7323InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7324int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7325emit_int16((unsigned char)0xEF, (0xC0 | encode));7326}73277328void Assembler::vpxor(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {7329assert(UseAVX > 0, "requires some form of AVX");7330InstructionMark im(this);7331InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7332attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_32bit);7333vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7334emit_int8((unsigned char)0xEF);7335emit_operand(dst, src);7336}73377338void Assembler::vpxorq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7339assert(UseAVX > 2, "requires some form of EVEX");7340InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7341attributes.set_rex_vex_w_reverted();7342int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7343emit_int16((unsigned char)0xEF, (0xC0 | encode));7344}73457346void Assembler::evpxord(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len) {7347assert(VM_Version::supports_evex(), "");7348// Encoding: EVEX.NDS.XXX.66.0F.W0 EF /r7349InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);7350attributes.set_is_evex_instruction();7351attributes.set_embedded_opmask_register_specifier(mask);7352if (merge) {7353attributes.reset_is_clear_context();7354}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::evpxorq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {7360assert(VM_Version::supports_evex(), "requires EVEX support");7361InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7362attributes.set_is_evex_instruction();7363int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7364emit_int16((unsigned char)0xEF, (0xC0 | encode));7365}73667367void Assembler::evpxorq(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {7368assert(VM_Version::supports_evex(), "requires EVEX support");7369assert(dst != xnoreg, "sanity");7370InstructionMark im(this);7371InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7372attributes.set_is_evex_instruction();7373attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);7374vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7375emit_int8((unsigned char)0xEF);7376emit_operand(dst, src);7377}73787379void Assembler::evprold(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7380assert(VM_Version::supports_evex(), "requires EVEX support");7381assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7382InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7383attributes.set_is_evex_instruction();7384int encode = vex_prefix_and_encode(xmm1->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7385emit_int24(0x72, (0xC0 | encode), shift & 0xFF);7386}73877388void Assembler::evprolq(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7389assert(VM_Version::supports_evex(), "requires EVEX support");7390assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7391InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7392attributes.set_is_evex_instruction();7393int encode = vex_prefix_and_encode(xmm1->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7394emit_int24(0x72, (0xC0 | encode), shift & 0xFF);7395}73967397void Assembler::evprord(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7398assert(VM_Version::supports_evex(), "requires EVEX support");7399assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7400InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7401attributes.set_is_evex_instruction();7402int encode = vex_prefix_and_encode(xmm0->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7403emit_int24(0x72, (0xC0 | encode), shift & 0xFF);7404}74057406void Assembler::evprorq(XMMRegister dst, XMMRegister src, int shift, int vector_len) {7407assert(VM_Version::supports_evex(), "requires EVEX support");7408assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7409InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7410attributes.set_is_evex_instruction();7411int encode = vex_prefix_and_encode(xmm0->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);7412emit_int24(0x72, (0xC0 | encode), shift & 0xFF);7413}74147415void Assembler::evprolvd(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7416assert(VM_Version::supports_evex(), "requires EVEX support");7417assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7418InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7419attributes.set_is_evex_instruction();7420int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7421emit_int16(0x15, (unsigned char)(0xC0 | encode));7422}74237424void Assembler::evprolvq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7425assert(VM_Version::supports_evex(), "requires EVEX support");7426assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7427InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7428attributes.set_is_evex_instruction();7429int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7430emit_int16(0x15, (unsigned char)(0xC0 | encode));7431}74327433void Assembler::evprorvd(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7434assert(VM_Version::supports_evex(), "requires EVEX support");7435assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7436InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7437attributes.set_is_evex_instruction();7438int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7439emit_int16(0x14, (unsigned char)(0xC0 | encode));7440}74417442void Assembler::evprorvq(XMMRegister dst, XMMRegister src, XMMRegister shift, int vector_len) {7443assert(VM_Version::supports_evex(), "requires EVEX support");7444assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7445InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7446attributes.set_is_evex_instruction();7447int encode = vex_prefix_and_encode(dst->encoding(), src->encoding(), shift->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7448emit_int16(0x14, (unsigned char)(0xC0 | encode));7449}74507451void Assembler::vpternlogd(XMMRegister dst, int imm8, XMMRegister src2, XMMRegister src3, int vector_len) {7452assert(VM_Version::supports_evex(), "requires EVEX support");7453assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7454InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7455attributes.set_is_evex_instruction();7456int encode = vex_prefix_and_encode(dst->encoding(), src2->encoding(), src3->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7457emit_int8(0x25);7458emit_int8((unsigned char)(0xC0 | encode));7459emit_int8(imm8);7460}74617462void Assembler::vpternlogd(XMMRegister dst, int imm8, XMMRegister src2, Address src3, int vector_len) {7463assert(VM_Version::supports_evex(), "requires EVEX support");7464assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7465assert(dst != xnoreg, "sanity");7466InstructionMark im(this);7467InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7468attributes.set_is_evex_instruction();7469attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_64bit);7470vex_prefix(src3, src2->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7471emit_int8(0x25);7472emit_operand(dst, src3);7473emit_int8(imm8);7474}74757476void Assembler::vpternlogq(XMMRegister dst, int imm8, XMMRegister src2, XMMRegister src3, int vector_len) {7477assert(VM_Version::supports_evex(), "requires EVEX support");7478assert(vector_len == Assembler::AVX_512bit || VM_Version::supports_avx512vl(), "requires VL support");7479InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7480attributes.set_is_evex_instruction();7481int encode = vex_prefix_and_encode(dst->encoding(), src2->encoding(), src3->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7482emit_int8(0x25);7483emit_int8((unsigned char)(0xC0 | encode));7484emit_int8(imm8);7485}74867487// vinserti forms74887489void Assembler::vinserti128(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {7490assert(VM_Version::supports_avx2(), "");7491assert(imm8 <= 0x01, "imm8: %u", imm8);7492InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7493int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7494// last byte:7495// 0x00 - insert into lower 128 bits7496// 0x01 - insert into upper 128 bits7497emit_int24(0x38, (0xC0 | encode), imm8 & 0x01);7498}74997500void Assembler::vinserti128(XMMRegister dst, XMMRegister nds, Address src, uint8_t imm8) {7501assert(VM_Version::supports_avx2(), "");7502assert(dst != xnoreg, "sanity");7503assert(imm8 <= 0x01, "imm8: %u", imm8);7504InstructionMark im(this);7505InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7506attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);7507vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7508emit_int8(0x38);7509emit_operand(dst, src);7510// 0x00 - insert into lower 128 bits7511// 0x01 - insert into upper 128 bits7512emit_int8(imm8 & 0x01);7513}75147515void Assembler::vinserti32x4(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {7516assert(VM_Version::supports_evex(), "");7517assert(imm8 <= 0x03, "imm8: %u", imm8);7518InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7519attributes.set_is_evex_instruction();7520int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7521// imm8:7522// 0x00 - insert into q0 128 bits (0..127)7523// 0x01 - insert into q1 128 bits (128..255)7524// 0x02 - insert into q2 128 bits (256..383)7525// 0x03 - insert into q3 128 bits (384..511)7526emit_int24(0x38, (0xC0 | encode), imm8 & 0x03);7527}75287529void Assembler::vinserti32x4(XMMRegister dst, XMMRegister nds, Address src, uint8_t imm8) {7530assert(VM_Version::supports_avx(), "");7531assert(dst != xnoreg, "sanity");7532assert(imm8 <= 0x03, "imm8: %u", imm8);7533InstructionMark im(this);7534InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7535attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);7536attributes.set_is_evex_instruction();7537vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7538emit_int8(0x18);7539emit_operand(dst, src);7540// 0x00 - insert into q0 128 bits (0..127)7541// 0x01 - insert into q1 128 bits (128..255)7542// 0x02 - insert into q2 128 bits (256..383)7543// 0x03 - insert into q3 128 bits (384..511)7544emit_int8(imm8 & 0x03);7545}75467547void Assembler::vinserti64x4(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {7548assert(VM_Version::supports_evex(), "");7549assert(imm8 <= 0x01, "imm8: %u", imm8);7550InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7551attributes.set_is_evex_instruction();7552int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7553//imm8:7554// 0x00 - insert into lower 256 bits7555// 0x01 - insert into upper 256 bits7556emit_int24(0x3A, (0xC0 | encode), imm8 & 0x01);7557}755875597560// vinsertf forms75617562void Assembler::vinsertf128(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {7563assert(VM_Version::supports_avx(), "");7564assert(imm8 <= 0x01, "imm8: %u", imm8);7565InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7566int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7567// imm8:7568// 0x00 - insert into lower 128 bits7569// 0x01 - insert into upper 128 bits7570emit_int24(0x18, (0xC0 | encode), imm8 & 0x01);7571}75727573void Assembler::vinsertf128(XMMRegister dst, XMMRegister nds, Address src, uint8_t imm8) {7574assert(VM_Version::supports_avx(), "");7575assert(dst != xnoreg, "sanity");7576assert(imm8 <= 0x01, "imm8: %u", imm8);7577InstructionMark im(this);7578InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7579attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);7580vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7581emit_int8(0x18);7582emit_operand(dst, src);7583// 0x00 - insert into lower 128 bits7584// 0x01 - insert into upper 128 bits7585emit_int8(imm8 & 0x01);7586}75877588void Assembler::vinsertf32x4(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {7589assert(VM_Version::supports_avx2(), "");7590assert(imm8 <= 0x03, "imm8: %u", imm8);7591InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7592int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7593// imm8:7594// 0x00 - insert into q0 128 bits (0..127)7595// 0x01 - insert into q1 128 bits (128..255)7596// 0x02 - insert into q0 128 bits (256..383)7597// 0x03 - insert into q1 128 bits (384..512)7598emit_int24(0x18, (0xC0 | encode), imm8 & 0x03);7599}76007601void Assembler::vinsertf32x4(XMMRegister dst, XMMRegister nds, Address src, uint8_t imm8) {7602assert(VM_Version::supports_avx(), "");7603assert(dst != xnoreg, "sanity");7604assert(imm8 <= 0x03, "imm8: %u", imm8);7605InstructionMark im(this);7606InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7607attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);7608vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7609emit_int8(0x18);7610emit_operand(dst, src);7611// 0x00 - insert into q0 128 bits (0..127)7612// 0x01 - insert into q1 128 bits (128..255)7613// 0x02 - insert into q0 128 bits (256..383)7614// 0x03 - insert into q1 128 bits (384..512)7615emit_int8(imm8 & 0x03);7616}76177618void Assembler::vinsertf64x4(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {7619assert(VM_Version::supports_evex(), "");7620assert(imm8 <= 0x01, "imm8: %u", imm8);7621InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7622attributes.set_is_evex_instruction();7623int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7624// imm8:7625// 0x00 - insert into lower 256 bits7626// 0x01 - insert into upper 256 bits7627emit_int24(0x1A, (0xC0 | encode), imm8 & 0x01);7628}76297630void Assembler::vinsertf64x4(XMMRegister dst, XMMRegister nds, Address src, uint8_t imm8) {7631assert(VM_Version::supports_evex(), "");7632assert(dst != xnoreg, "sanity");7633assert(imm8 <= 0x01, "imm8: %u", imm8);7634InstructionMark im(this);7635InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7636attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_64bit);7637attributes.set_is_evex_instruction();7638vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7639emit_int8(0x1A);7640emit_operand(dst, src);7641// 0x00 - insert into lower 256 bits7642// 0x01 - insert into upper 256 bits7643emit_int8(imm8 & 0x01);7644}764576467647// vextracti forms76487649void Assembler::vextracti128(XMMRegister dst, XMMRegister src, uint8_t imm8) {7650assert(VM_Version::supports_avx2(), "");7651assert(imm8 <= 0x01, "imm8: %u", imm8);7652InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7653int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7654// imm8:7655// 0x00 - extract from lower 128 bits7656// 0x01 - extract from upper 128 bits7657emit_int24(0x39, (0xC0 | encode), imm8 & 0x01);7658}76597660void Assembler::vextracti128(Address dst, XMMRegister src, uint8_t imm8) {7661assert(VM_Version::supports_avx2(), "");7662assert(src != xnoreg, "sanity");7663assert(imm8 <= 0x01, "imm8: %u", imm8);7664InstructionMark im(this);7665InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7666attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);7667attributes.reset_is_clear_context();7668vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7669emit_int8(0x39);7670emit_operand(src, dst);7671// 0x00 - extract from lower 128 bits7672// 0x01 - extract from upper 128 bits7673emit_int8(imm8 & 0x01);7674}76757676void Assembler::vextracti32x4(XMMRegister dst, XMMRegister src, uint8_t imm8) {7677assert(VM_Version::supports_evex(), "");7678assert(imm8 <= 0x03, "imm8: %u", imm8);7679InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7680attributes.set_is_evex_instruction();7681int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7682// imm8:7683// 0x00 - extract from bits 127:07684// 0x01 - extract from bits 255:1287685// 0x02 - extract from bits 383:2567686// 0x03 - extract from bits 511:3847687emit_int24(0x39, (0xC0 | encode), imm8 & 0x03);7688}76897690void Assembler::vextracti32x4(Address dst, XMMRegister src, uint8_t imm8) {7691assert(VM_Version::supports_evex(), "");7692assert(src != xnoreg, "sanity");7693assert(imm8 <= 0x03, "imm8: %u", imm8);7694InstructionMark im(this);7695InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7696attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);7697attributes.reset_is_clear_context();7698attributes.set_is_evex_instruction();7699vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7700emit_int8(0x39);7701emit_operand(src, dst);7702// 0x00 - extract from bits 127:07703// 0x01 - extract from bits 255:1287704// 0x02 - extract from bits 383:2567705// 0x03 - extract from bits 511:3847706emit_int8(imm8 & 0x03);7707}77087709void Assembler::vextracti64x2(XMMRegister dst, XMMRegister src, uint8_t imm8) {7710assert(VM_Version::supports_avx512dq(), "");7711assert(imm8 <= 0x03, "imm8: %u", imm8);7712InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7713attributes.set_is_evex_instruction();7714int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7715// imm8:7716// 0x00 - extract from bits 127:07717// 0x01 - extract from bits 255:1287718// 0x02 - extract from bits 383:2567719// 0x03 - extract from bits 511:3847720emit_int24(0x39, (0xC0 | encode), imm8 & 0x03);7721}77227723void Assembler::vextracti64x4(XMMRegister dst, XMMRegister src, uint8_t imm8) {7724assert(VM_Version::supports_evex(), "");7725assert(imm8 <= 0x01, "imm8: %u", imm8);7726InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7727attributes.set_is_evex_instruction();7728int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7729// imm8:7730// 0x00 - extract from lower 256 bits7731// 0x01 - extract from upper 256 bits7732emit_int24(0x3B, (0xC0 | encode), imm8 & 0x01);7733}77347735void Assembler::vextracti64x4(Address dst, XMMRegister src, uint8_t imm8) {7736assert(VM_Version::supports_evex(), "");7737assert(src != xnoreg, "sanity");7738assert(imm8 <= 0x01, "imm8: %u", imm8);7739InstructionMark im(this);7740InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7741attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_64bit);7742attributes.reset_is_clear_context();7743attributes.set_is_evex_instruction();7744vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7745emit_int8(0x38);7746emit_operand(src, dst);7747// 0x00 - extract from lower 256 bits7748// 0x01 - extract from upper 256 bits7749emit_int8(imm8 & 0x01);7750}7751// vextractf forms77527753void Assembler::vextractf128(XMMRegister dst, XMMRegister src, uint8_t imm8) {7754assert(VM_Version::supports_avx(), "");7755assert(imm8 <= 0x01, "imm8: %u", imm8);7756InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7757int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7758// imm8:7759// 0x00 - extract from lower 128 bits7760// 0x01 - extract from upper 128 bits7761emit_int24(0x19, (0xC0 | encode), imm8 & 0x01);7762}77637764void Assembler::vextractf128(Address dst, XMMRegister src, uint8_t imm8) {7765assert(VM_Version::supports_avx(), "");7766assert(src != xnoreg, "sanity");7767assert(imm8 <= 0x01, "imm8: %u", imm8);7768InstructionMark im(this);7769InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7770attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);7771attributes.reset_is_clear_context();7772vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7773emit_int8(0x19);7774emit_operand(src, dst);7775// 0x00 - extract from lower 128 bits7776// 0x01 - extract from upper 128 bits7777emit_int8(imm8 & 0x01);7778}77797780void Assembler::vextractf32x4(XMMRegister dst, XMMRegister src, uint8_t imm8) {7781assert(VM_Version::supports_evex(), "");7782assert(imm8 <= 0x03, "imm8: %u", imm8);7783InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7784attributes.set_is_evex_instruction();7785int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7786// imm8:7787// 0x00 - extract from bits 127:07788// 0x01 - extract from bits 255:1287789// 0x02 - extract from bits 383:2567790// 0x03 - extract from bits 511:3847791emit_int24(0x19, (0xC0 | encode), imm8 & 0x03);7792}77937794void Assembler::vextractf32x4(Address dst, XMMRegister src, uint8_t imm8) {7795assert(VM_Version::supports_evex(), "");7796assert(src != xnoreg, "sanity");7797assert(imm8 <= 0x03, "imm8: %u", imm8);7798InstructionMark im(this);7799InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7800attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);7801attributes.reset_is_clear_context();7802attributes.set_is_evex_instruction();7803vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7804emit_int8(0x19);7805emit_operand(src, dst);7806// 0x00 - extract from bits 127:07807// 0x01 - extract from bits 255:1287808// 0x02 - extract from bits 383:2567809// 0x03 - extract from bits 511:3847810emit_int8(imm8 & 0x03);7811}78127813void Assembler::vextractf64x2(XMMRegister dst, XMMRegister src, uint8_t imm8) {7814assert(VM_Version::supports_avx512dq(), "");7815assert(imm8 <= 0x03, "imm8: %u", imm8);7816InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7817attributes.set_is_evex_instruction();7818int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7819// imm8:7820// 0x00 - extract from bits 127:07821// 0x01 - extract from bits 255:1287822// 0x02 - extract from bits 383:2567823// 0x03 - extract from bits 511:3847824emit_int24(0x19, (0xC0 | encode), imm8 & 0x03);7825}78267827void Assembler::vextractf64x4(XMMRegister dst, XMMRegister src, uint8_t imm8) {7828assert(VM_Version::supports_evex(), "");7829assert(imm8 <= 0x01, "imm8: %u", imm8);7830InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7831attributes.set_is_evex_instruction();7832int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7833// imm8:7834// 0x00 - extract from lower 256 bits7835// 0x01 - extract from upper 256 bits7836emit_int24(0x1B, (0xC0 | encode), imm8 & 0x01);7837}78387839void Assembler::vextractf64x4(Address dst, XMMRegister src, uint8_t imm8) {7840assert(VM_Version::supports_evex(), "");7841assert(src != xnoreg, "sanity");7842assert(imm8 <= 0x01, "imm8: %u", imm8);7843InstructionMark im(this);7844InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7845attributes.set_address_attributes(/* tuple_type */ EVEX_T4,/* input_size_in_bits */ EVEX_64bit);7846attributes.reset_is_clear_context();7847attributes.set_is_evex_instruction();7848vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);7849emit_int8(0x1B);7850emit_operand(src, dst);7851// 0x00 - extract from lower 256 bits7852// 0x01 - extract from upper 256 bits7853emit_int8(imm8 & 0x01);7854}78557856// duplicate 1-byte integer data from src into programmed locations in dest : requires AVX512BW and AVX512VL7857void Assembler::vpbroadcastb(XMMRegister dst, XMMRegister src, int vector_len) {7858assert(VM_Version::supports_avx2(), "");7859InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7860int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7861emit_int16(0x78, (0xC0 | encode));7862}78637864void Assembler::vpbroadcastb(XMMRegister dst, Address src, int vector_len) {7865assert(VM_Version::supports_avx2(), "");7866assert(dst != xnoreg, "sanity");7867InstructionMark im(this);7868InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7869attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_8bit);7870// swap src<->dst for encoding7871vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7872emit_int8(0x78);7873emit_operand(dst, src);7874}78757876// duplicate 2-byte integer data from src into programmed locations in dest : requires AVX512BW and AVX512VL7877void Assembler::vpbroadcastw(XMMRegister dst, XMMRegister src, int vector_len) {7878assert(VM_Version::supports_avx2(), "");7879InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7880int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7881emit_int16(0x79, (0xC0 | encode));7882}78837884void Assembler::vpbroadcastw(XMMRegister dst, Address src, int vector_len) {7885assert(VM_Version::supports_avx2(), "");7886assert(dst != xnoreg, "sanity");7887InstructionMark im(this);7888InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);7889attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_16bit);7890// swap src<->dst for encoding7891vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7892emit_int8(0x79);7893emit_operand(dst, src);7894}78957896// xmm/mem sourced byte/word/dword/qword replicate78977898// duplicate 4-byte integer data from src into programmed locations in dest : requires AVX512VL7899void Assembler::vpbroadcastd(XMMRegister dst, XMMRegister src, int vector_len) {7900assert(UseAVX >= 2, "");7901InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7902int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7903emit_int16(0x58, (0xC0 | encode));7904}79057906void Assembler::vpbroadcastd(XMMRegister dst, Address src, int vector_len) {7907assert(VM_Version::supports_avx2(), "");7908assert(dst != xnoreg, "sanity");7909InstructionMark im(this);7910InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7911attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);7912// swap src<->dst for encoding7913vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7914emit_int8(0x58);7915emit_operand(dst, src);7916}79177918// duplicate 8-byte integer data from src into programmed locations in dest : requires AVX512VL7919void Assembler::vpbroadcastq(XMMRegister dst, XMMRegister src, int vector_len) {7920assert(VM_Version::supports_avx2(), "");7921InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7922attributes.set_rex_vex_w_reverted();7923int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7924emit_int16(0x59, (0xC0 | encode));7925}79267927void Assembler::vpbroadcastq(XMMRegister dst, Address src, int vector_len) {7928assert(VM_Version::supports_avx2(), "");7929assert(dst != xnoreg, "sanity");7930InstructionMark im(this);7931InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7932attributes.set_rex_vex_w_reverted();7933attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);7934// swap src<->dst for encoding7935vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7936emit_int8(0x59);7937emit_operand(dst, src);7938}79397940void Assembler::evbroadcasti32x4(XMMRegister dst, Address src, int vector_len) {7941assert(vector_len != Assembler::AVX_128bit, "");7942assert(VM_Version::supports_avx512dq(), "");7943assert(dst != xnoreg, "sanity");7944InstructionMark im(this);7945InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7946attributes.set_rex_vex_w_reverted();7947attributes.set_address_attributes(/* tuple_type */ EVEX_T2, /* input_size_in_bits */ EVEX_64bit);7948// swap src<->dst for encoding7949vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7950emit_int8(0x5A);7951emit_operand(dst, src);7952}79537954void Assembler::evbroadcasti64x2(XMMRegister dst, XMMRegister src, int vector_len) {7955assert(vector_len != Assembler::AVX_128bit, "");7956assert(VM_Version::supports_avx512dq(), "");7957InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7958attributes.set_rex_vex_w_reverted();7959int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7960emit_int16(0x5A, (0xC0 | encode));7961}79627963void Assembler::evbroadcasti64x2(XMMRegister dst, Address src, int vector_len) {7964assert(vector_len != Assembler::AVX_128bit, "");7965assert(VM_Version::supports_avx512dq(), "");7966assert(dst != xnoreg, "sanity");7967InstructionMark im(this);7968InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7969attributes.set_rex_vex_w_reverted();7970attributes.set_address_attributes(/* tuple_type */ EVEX_T2, /* input_size_in_bits */ EVEX_64bit);7971// swap src<->dst for encoding7972vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7973emit_int8(0x5A);7974emit_operand(dst, src);7975}79767977// scalar single/double precision replicate79787979// duplicate single precision data from src into programmed locations in dest : requires AVX512VL7980void Assembler::vbroadcastss(XMMRegister dst, XMMRegister src, int vector_len) {7981assert(VM_Version::supports_avx2(), "");7982InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7983int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7984emit_int16(0x18, (0xC0 | encode));7985}79867987void Assembler::vbroadcastss(XMMRegister dst, Address src, int vector_len) {7988assert(VM_Version::supports_avx(), "");7989assert(dst != xnoreg, "sanity");7990InstructionMark im(this);7991InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);7992attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);7993// swap src<->dst for encoding7994vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);7995emit_int8(0x18);7996emit_operand(dst, src);7997}79987999// duplicate double precision data from src into programmed locations in dest : requires AVX512VL8000void Assembler::vbroadcastsd(XMMRegister dst, XMMRegister src, int vector_len) {8001assert(VM_Version::supports_avx2(), "");8002assert(vector_len == AVX_256bit || vector_len == AVX_512bit, "");8003InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);8004attributes.set_rex_vex_w_reverted();8005int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8006emit_int16(0x19, (0xC0 | encode));8007}80088009void Assembler::vbroadcastsd(XMMRegister dst, Address src, int vector_len) {8010assert(VM_Version::supports_avx(), "");8011assert(vector_len == AVX_256bit || vector_len == AVX_512bit, "");8012assert(dst != xnoreg, "sanity");8013InstructionMark im(this);8014InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);8015attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);8016attributes.set_rex_vex_w_reverted();8017// swap src<->dst for encoding8018vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8019emit_int8(0x19);8020emit_operand(dst, src);8021}80228023void Assembler::vbroadcastf128(XMMRegister dst, Address src, int vector_len) {8024assert(VM_Version::supports_avx(), "");8025assert(vector_len == AVX_256bit, "");8026assert(dst != xnoreg, "sanity");8027InstructionMark im(this);8028InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);8029attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);8030// swap src<->dst for encoding8031vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8032emit_int8(0x1A);8033emit_operand(dst, src);8034}80358036// gpr source broadcast forms80378038// duplicate 1-byte integer data from src into programmed locations in dest : requires AVX512BW and AVX512VL8039void Assembler::evpbroadcastb(XMMRegister dst, Register src, int vector_len) {8040assert(VM_Version::supports_avx512bw(), "");8041InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);8042attributes.set_is_evex_instruction();8043int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8044emit_int16(0x7A, (0xC0 | encode));8045}80468047// duplicate 2-byte integer data from src into programmed locations in dest : requires AVX512BW and AVX512VL8048void Assembler::evpbroadcastw(XMMRegister dst, Register src, int vector_len) {8049assert(VM_Version::supports_avx512bw(), "");8050InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);8051attributes.set_is_evex_instruction();8052int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8053emit_int16(0x7B, (0xC0 | encode));8054}80558056// duplicate 4-byte integer data from src into programmed locations in dest : requires AVX512VL8057void Assembler::evpbroadcastd(XMMRegister dst, Register src, int vector_len) {8058assert(VM_Version::supports_evex(), "");8059InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);8060attributes.set_is_evex_instruction();8061int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8062emit_int16(0x7C, (0xC0 | encode));8063}80648065// duplicate 8-byte integer data from src into programmed locations in dest : requires AVX512VL8066void Assembler::evpbroadcastq(XMMRegister dst, Register src, int vector_len) {8067assert(VM_Version::supports_evex(), "");8068InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);8069attributes.set_is_evex_instruction();8070int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8071emit_int16(0x7C, (0xC0 | encode));8072}80738074void Assembler::vpgatherdd(XMMRegister dst, Address src, XMMRegister mask, int vector_len) {8075assert(VM_Version::supports_avx2(), "");8076assert(vector_len == Assembler::AVX_128bit || vector_len == Assembler::AVX_256bit, "");8077assert(dst != xnoreg, "sanity");8078assert(src.isxmmindex(),"expected to be xmm index");8079assert(dst != src.xmmindex(), "instruction will #UD if dst and index are the same");8080InstructionMark im(this);8081InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);8082vex_prefix(src, mask->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8083emit_int8((unsigned char)0x90);8084emit_operand(dst, src);8085}80868087void Assembler::vpgatherdq(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 */ true, /* 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::vgatherdpd(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)0x92);8110emit_operand(dst, src);8111}81128113void Assembler::vgatherdps(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 */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* 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}8125void Assembler::evpgatherdd(XMMRegister dst, KRegister mask, Address src, int vector_len) {8126assert(VM_Version::supports_evex(), "");8127assert(dst != xnoreg, "sanity");8128assert(src.isxmmindex(),"expected to be xmm index");8129assert(dst != src.xmmindex(), "instruction will #UD if dst and index are the same");8130assert(mask != k0, "instruction will #UD if mask is in k0");8131InstructionMark im(this);8132InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);8133attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);8134attributes.reset_is_clear_context();8135attributes.set_embedded_opmask_register_specifier(mask);8136attributes.set_is_evex_instruction();8137// swap src<->dst for encoding8138vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8139emit_int8((unsigned char)0x90);8140emit_operand(dst, src);8141}81428143void Assembler::evpgatherdq(XMMRegister dst, KRegister mask, Address src, int vector_len) {8144assert(VM_Version::supports_evex(), "");8145assert(dst != xnoreg, "sanity");8146assert(src.isxmmindex(),"expected to be xmm index");8147assert(dst != src.xmmindex(), "instruction will #UD if dst and index are the same");8148assert(mask != k0, "instruction will #UD if mask is in k0");8149InstructionMark im(this);8150InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);8151attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);8152attributes.reset_is_clear_context();8153attributes.set_embedded_opmask_register_specifier(mask);8154attributes.set_is_evex_instruction();8155// swap src<->dst for encoding8156vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8157emit_int8((unsigned char)0x90);8158emit_operand(dst, src);8159}81608161void Assembler::evgatherdpd(XMMRegister dst, KRegister mask, Address src, int vector_len) {8162assert(VM_Version::supports_evex(), "");8163assert(dst != xnoreg, "sanity");8164assert(src.isxmmindex(),"expected to be xmm index");8165assert(dst != src.xmmindex(), "instruction will #UD if dst and index are the same");8166assert(mask != k0, "instruction will #UD if mask is in k0");8167InstructionMark im(this);8168InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);8169attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);8170attributes.reset_is_clear_context();8171attributes.set_embedded_opmask_register_specifier(mask);8172attributes.set_is_evex_instruction();8173// swap src<->dst for encoding8174vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8175emit_int8((unsigned char)0x92);8176emit_operand(dst, src);8177}81788179void Assembler::evgatherdps(XMMRegister dst, KRegister mask, Address src, int vector_len) {8180assert(VM_Version::supports_evex(), "");8181assert(dst != xnoreg, "sanity");8182assert(src.isxmmindex(),"expected to be xmm index");8183assert(dst != src.xmmindex(), "instruction will #UD if dst and index are the same");8184assert(mask != k0, "instruction will #UD if mask is in k0");8185InstructionMark im(this);8186InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);8187attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);8188attributes.reset_is_clear_context();8189attributes.set_embedded_opmask_register_specifier(mask);8190attributes.set_is_evex_instruction();8191// swap src<->dst for encoding8192vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8193emit_int8((unsigned char)0x92);8194emit_operand(dst, src);8195}81968197void Assembler::evpscatterdd(Address dst, KRegister mask, XMMRegister src, int vector_len) {8198assert(VM_Version::supports_evex(), "");8199assert(mask != k0, "instruction will #UD if mask is in k0");8200InstructionMark im(this);8201InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);8202attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);8203attributes.reset_is_clear_context();8204attributes.set_embedded_opmask_register_specifier(mask);8205attributes.set_is_evex_instruction();8206vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8207emit_int8((unsigned char)0xA0);8208emit_operand(src, dst);8209}82108211void Assembler::evpscatterdq(Address dst, KRegister mask, XMMRegister src, int vector_len) {8212assert(VM_Version::supports_evex(), "");8213assert(mask != k0, "instruction will #UD if mask is in k0");8214InstructionMark im(this);8215InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);8216attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);8217attributes.reset_is_clear_context();8218attributes.set_embedded_opmask_register_specifier(mask);8219attributes.set_is_evex_instruction();8220vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8221emit_int8((unsigned char)0xA0);8222emit_operand(src, dst);8223}82248225void Assembler::evscatterdps(Address dst, KRegister mask, XMMRegister src, int vector_len) {8226assert(VM_Version::supports_evex(), "");8227assert(mask != k0, "instruction will #UD if mask is in k0");8228InstructionMark im(this);8229InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);8230attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);8231attributes.reset_is_clear_context();8232attributes.set_embedded_opmask_register_specifier(mask);8233attributes.set_is_evex_instruction();8234vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8235emit_int8((unsigned char)0xA2);8236emit_operand(src, dst);8237}82388239void Assembler::evscatterdpd(Address dst, KRegister mask, XMMRegister src, int vector_len) {8240assert(VM_Version::supports_evex(), "");8241assert(mask != k0, "instruction will #UD if mask is in k0");8242InstructionMark im(this);8243InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);8244attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);8245attributes.reset_is_clear_context();8246attributes.set_embedded_opmask_register_specifier(mask);8247attributes.set_is_evex_instruction();8248vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);8249emit_int8((unsigned char)0xA2);8250emit_operand(src, dst);8251}8252// Carry-Less Multiplication Quadword8253void Assembler::pclmulqdq(XMMRegister dst, XMMRegister src, int mask) {8254assert(VM_Version::supports_clmul(), "");8255InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);8256int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);8257emit_int24(0x44, (0xC0 | encode), (unsigned char)mask);8258}82598260// Carry-Less Multiplication Quadword8261void Assembler::vpclmulqdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int mask) {8262assert(VM_Version::supports_avx() && VM_Version::supports_clmul(), "");8263InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);8264int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);8265emit_int24(0x44, (0xC0 | encode), (unsigned char)mask);8266}82678268void Assembler::evpclmulqdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int mask, int vector_len) {8269assert(VM_Version::supports_avx512_vpclmulqdq(), "Requires vector carryless multiplication support");8270InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);8271attributes.set_is_evex_instruction();8272int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);8273emit_int24(0x44, (0xC0 | encode), (unsigned char)mask);8274}82758276void Assembler::vzeroupper_uncached() {8277if (VM_Version::supports_vzeroupper()) {8278InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);8279(void)vex_prefix_and_encode(0, 0, 0, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);8280emit_int8(0x77);8281}8282}82838284void Assembler::fld_x(Address adr) {8285InstructionMark im(this);8286emit_int8((unsigned char)0xDB);8287emit_operand32(rbp, adr);8288}82898290void Assembler::fstp_x(Address adr) {8291InstructionMark im(this);8292emit_int8((unsigned char)0xDB);8293emit_operand32(rdi, adr);8294}82958296void Assembler::emit_operand32(Register reg, Address adr) {8297assert(reg->encoding() < 8, "no extended registers");8298assert(!adr.base_needs_rex() && !adr.index_needs_rex(), "no extended registers");8299emit_operand(reg, adr._base, adr._index, adr._scale, adr._disp,8300adr._rspec);8301}83028303#ifndef _LP648304// 32bit only pieces of the assembler83058306void Assembler::emms() {8307NOT_LP64(assert(VM_Version::supports_mmx(), ""));8308emit_int16(0x0F, 0x77);8309}83108311void Assembler::vzeroupper() {8312vzeroupper_uncached();8313}83148315void Assembler::cmp_literal32(Register src1, int32_t imm32, RelocationHolder const& rspec) {8316// NO PREFIX AS NEVER 64BIT8317InstructionMark im(this);8318emit_int16((unsigned char)0x81, (0xF8 | src1->encoding()));8319emit_data(imm32, rspec, 0);8320}83218322void Assembler::cmp_literal32(Address src1, int32_t imm32, RelocationHolder const& rspec) {8323// NO PREFIX AS NEVER 64BIT (not even 32bit versions of 64bit regs8324InstructionMark im(this);8325emit_int8((unsigned char)0x81);8326emit_operand(rdi, src1);8327emit_data(imm32, rspec, 0);8328}83298330// The 64-bit (32bit platform) cmpxchg compares the value at adr with the contents of rdx:rax,8331// and stores rcx:rbx into adr if so; otherwise, the value at adr is loaded8332// into rdx:rax. The ZF is set if the compared values were equal, and cleared otherwise.8333void Assembler::cmpxchg8(Address adr) {8334InstructionMark im(this);8335emit_int16(0x0F, (unsigned char)0xC7);8336emit_operand(rcx, adr);8337}83388339void Assembler::decl(Register dst) {8340// Don't use it directly. Use MacroAssembler::decrementl() instead.8341emit_int8(0x48 | dst->encoding());8342}83438344// 64bit doesn't use the x8783458346void Assembler::emit_farith(int b1, int b2, int i) {8347assert(isByte(b1) && isByte(b2), "wrong opcode");8348assert(0 <= i && i < 8, "illegal stack offset");8349emit_int16(b1, b2 + i);8350}83518352void Assembler::fabs() {8353emit_int16((unsigned char)0xD9, (unsigned char)0xE1);8354}83558356void Assembler::fadd(int i) {8357emit_farith(0xD8, 0xC0, i);8358}83598360void Assembler::fadd_d(Address src) {8361InstructionMark im(this);8362emit_int8((unsigned char)0xDC);8363emit_operand32(rax, src);8364}83658366void Assembler::fadd_s(Address src) {8367InstructionMark im(this);8368emit_int8((unsigned char)0xD8);8369emit_operand32(rax, src);8370}83718372void Assembler::fadda(int i) {8373emit_farith(0xDC, 0xC0, i);8374}83758376void Assembler::faddp(int i) {8377emit_farith(0xDE, 0xC0, i);8378}83798380void Assembler::fchs() {8381emit_int16((unsigned char)0xD9, (unsigned char)0xE0);8382}83838384void Assembler::fcom(int i) {8385emit_farith(0xD8, 0xD0, i);8386}83878388void Assembler::fcomp(int i) {8389emit_farith(0xD8, 0xD8, i);8390}83918392void Assembler::fcomp_d(Address src) {8393InstructionMark im(this);8394emit_int8((unsigned char)0xDC);8395emit_operand32(rbx, src);8396}83978398void Assembler::fcomp_s(Address src) {8399InstructionMark im(this);8400emit_int8((unsigned char)0xD8);8401emit_operand32(rbx, src);8402}84038404void Assembler::fcompp() {8405emit_int16((unsigned char)0xDE, (unsigned char)0xD9);8406}84078408void Assembler::fcos() {8409emit_int16((unsigned char)0xD9, (unsigned char)0xFF);8410}84118412void Assembler::fdecstp() {8413emit_int16((unsigned char)0xD9, (unsigned char)0xF6);8414}84158416void Assembler::fdiv(int i) {8417emit_farith(0xD8, 0xF0, i);8418}84198420void Assembler::fdiv_d(Address src) {8421InstructionMark im(this);8422emit_int8((unsigned char)0xDC);8423emit_operand32(rsi, src);8424}84258426void Assembler::fdiv_s(Address src) {8427InstructionMark im(this);8428emit_int8((unsigned char)0xD8);8429emit_operand32(rsi, src);8430}84318432void Assembler::fdiva(int i) {8433emit_farith(0xDC, 0xF8, i);8434}84358436// Note: The Intel manual (Pentium Processor User's Manual, Vol.3, 1994)8437// is erroneous for some of the floating-point instructions below.84388439void Assembler::fdivp(int i) {8440emit_farith(0xDE, 0xF8, i); // ST(0) <- ST(0) / ST(1) and pop (Intel manual wrong)8441}84428443void Assembler::fdivr(int i) {8444emit_farith(0xD8, 0xF8, i);8445}84468447void Assembler::fdivr_d(Address src) {8448InstructionMark im(this);8449emit_int8((unsigned char)0xDC);8450emit_operand32(rdi, src);8451}84528453void Assembler::fdivr_s(Address src) {8454InstructionMark im(this);8455emit_int8((unsigned char)0xD8);8456emit_operand32(rdi, src);8457}84588459void Assembler::fdivra(int i) {8460emit_farith(0xDC, 0xF0, i);8461}84628463void Assembler::fdivrp(int i) {8464emit_farith(0xDE, 0xF0, i); // ST(0) <- ST(1) / ST(0) and pop (Intel manual wrong)8465}84668467void Assembler::ffree(int i) {8468emit_farith(0xDD, 0xC0, i);8469}84708471void Assembler::fild_d(Address adr) {8472InstructionMark im(this);8473emit_int8((unsigned char)0xDF);8474emit_operand32(rbp, adr);8475}84768477void Assembler::fild_s(Address adr) {8478InstructionMark im(this);8479emit_int8((unsigned char)0xDB);8480emit_operand32(rax, adr);8481}84828483void Assembler::fincstp() {8484emit_int16((unsigned char)0xD9, (unsigned char)0xF7);8485}84868487void Assembler::finit() {8488emit_int24((unsigned char)0x9B, (unsigned char)0xDB, (unsigned char)0xE3);8489}84908491void Assembler::fist_s(Address adr) {8492InstructionMark im(this);8493emit_int8((unsigned char)0xDB);8494emit_operand32(rdx, adr);8495}84968497void Assembler::fistp_d(Address adr) {8498InstructionMark im(this);8499emit_int8((unsigned char)0xDF);8500emit_operand32(rdi, adr);8501}85028503void Assembler::fistp_s(Address adr) {8504InstructionMark im(this);8505emit_int8((unsigned char)0xDB);8506emit_operand32(rbx, adr);8507}85088509void Assembler::fld1() {8510emit_int16((unsigned char)0xD9, (unsigned char)0xE8);8511}85128513void Assembler::fld_d(Address adr) {8514InstructionMark im(this);8515emit_int8((unsigned char)0xDD);8516emit_operand32(rax, adr);8517}85188519void Assembler::fld_s(Address adr) {8520InstructionMark im(this);8521emit_int8((unsigned char)0xD9);8522emit_operand32(rax, adr);8523}852485258526void Assembler::fld_s(int index) {8527emit_farith(0xD9, 0xC0, index);8528}85298530void Assembler::fldcw(Address src) {8531InstructionMark im(this);8532emit_int8((unsigned char)0xD9);8533emit_operand32(rbp, src);8534}85358536void Assembler::fldenv(Address src) {8537InstructionMark im(this);8538emit_int8((unsigned char)0xD9);8539emit_operand32(rsp, src);8540}85418542void Assembler::fldlg2() {8543emit_int16((unsigned char)0xD9, (unsigned char)0xEC);8544}85458546void Assembler::fldln2() {8547emit_int16((unsigned char)0xD9, (unsigned char)0xED);8548}85498550void Assembler::fldz() {8551emit_int16((unsigned char)0xD9, (unsigned char)0xEE);8552}85538554void Assembler::flog() {8555fldln2();8556fxch();8557fyl2x();8558}85598560void Assembler::flog10() {8561fldlg2();8562fxch();8563fyl2x();8564}85658566void Assembler::fmul(int i) {8567emit_farith(0xD8, 0xC8, i);8568}85698570void Assembler::fmul_d(Address src) {8571InstructionMark im(this);8572emit_int8((unsigned char)0xDC);8573emit_operand32(rcx, src);8574}85758576void Assembler::fmul_s(Address src) {8577InstructionMark im(this);8578emit_int8((unsigned char)0xD8);8579emit_operand32(rcx, src);8580}85818582void Assembler::fmula(int i) {8583emit_farith(0xDC, 0xC8, i);8584}85858586void Assembler::fmulp(int i) {8587emit_farith(0xDE, 0xC8, i);8588}85898590void Assembler::fnsave(Address dst) {8591InstructionMark im(this);8592emit_int8((unsigned char)0xDD);8593emit_operand32(rsi, dst);8594}85958596void Assembler::fnstcw(Address src) {8597InstructionMark im(this);8598emit_int16((unsigned char)0x9B, (unsigned char)0xD9);8599emit_operand32(rdi, src);8600}86018602void Assembler::fnstsw_ax() {8603emit_int16((unsigned char)0xDF, (unsigned char)0xE0);8604}86058606void Assembler::fprem() {8607emit_int16((unsigned char)0xD9, (unsigned char)0xF8);8608}86098610void Assembler::fprem1() {8611emit_int16((unsigned char)0xD9, (unsigned char)0xF5);8612}86138614void Assembler::frstor(Address src) {8615InstructionMark im(this);8616emit_int8((unsigned char)0xDD);8617emit_operand32(rsp, src);8618}86198620void Assembler::fsin() {8621emit_int16((unsigned char)0xD9, (unsigned char)0xFE);8622}86238624void Assembler::fsqrt() {8625emit_int16((unsigned char)0xD9, (unsigned char)0xFA);8626}86278628void Assembler::fst_d(Address adr) {8629InstructionMark im(this);8630emit_int8((unsigned char)0xDD);8631emit_operand32(rdx, adr);8632}86338634void Assembler::fst_s(Address adr) {8635InstructionMark im(this);8636emit_int8((unsigned char)0xD9);8637emit_operand32(rdx, adr);8638}86398640void Assembler::fstp_d(Address adr) {8641InstructionMark im(this);8642emit_int8((unsigned char)0xDD);8643emit_operand32(rbx, adr);8644}86458646void Assembler::fstp_d(int index) {8647emit_farith(0xDD, 0xD8, index);8648}86498650void Assembler::fstp_s(Address adr) {8651InstructionMark im(this);8652emit_int8((unsigned char)0xD9);8653emit_operand32(rbx, adr);8654}86558656void Assembler::fsub(int i) {8657emit_farith(0xD8, 0xE0, i);8658}86598660void Assembler::fsub_d(Address src) {8661InstructionMark im(this);8662emit_int8((unsigned char)0xDC);8663emit_operand32(rsp, src);8664}86658666void Assembler::fsub_s(Address src) {8667InstructionMark im(this);8668emit_int8((unsigned char)0xD8);8669emit_operand32(rsp, src);8670}86718672void Assembler::fsuba(int i) {8673emit_farith(0xDC, 0xE8, i);8674}86758676void Assembler::fsubp(int i) {8677emit_farith(0xDE, 0xE8, i); // ST(0) <- ST(0) - ST(1) and pop (Intel manual wrong)8678}86798680void Assembler::fsubr(int i) {8681emit_farith(0xD8, 0xE8, i);8682}86838684void Assembler::fsubr_d(Address src) {8685InstructionMark im(this);8686emit_int8((unsigned char)0xDC);8687emit_operand32(rbp, src);8688}86898690void Assembler::fsubr_s(Address src) {8691InstructionMark im(this);8692emit_int8((unsigned char)0xD8);8693emit_operand32(rbp, src);8694}86958696void Assembler::fsubra(int i) {8697emit_farith(0xDC, 0xE0, i);8698}86998700void Assembler::fsubrp(int i) {8701emit_farith(0xDE, 0xE0, i); // ST(0) <- ST(1) - ST(0) and pop (Intel manual wrong)8702}87038704void Assembler::ftan() {8705emit_int32((unsigned char)0xD9, (unsigned char)0xF2, (unsigned char)0xDD, (unsigned char)0xD8);8706}87078708void Assembler::ftst() {8709emit_int16((unsigned char)0xD9, (unsigned char)0xE4);8710}87118712void Assembler::fucomi(int i) {8713// make sure the instruction is supported (introduced for P6, together with cmov)8714guarantee(VM_Version::supports_cmov(), "illegal instruction");8715emit_farith(0xDB, 0xE8, i);8716}87178718void Assembler::fucomip(int i) {8719// make sure the instruction is supported (introduced for P6, together with cmov)8720guarantee(VM_Version::supports_cmov(), "illegal instruction");8721emit_farith(0xDF, 0xE8, i);8722}87238724void Assembler::fwait() {8725emit_int8((unsigned char)0x9B);8726}87278728void Assembler::fxch(int i) {8729emit_farith(0xD9, 0xC8, i);8730}87318732void Assembler::fyl2x() {8733emit_int16((unsigned char)0xD9, (unsigned char)0xF1);8734}87358736void Assembler::frndint() {8737emit_int16((unsigned char)0xD9, (unsigned char)0xFC);8738}87398740void Assembler::f2xm1() {8741emit_int16((unsigned char)0xD9, (unsigned char)0xF0);8742}87438744void Assembler::fldl2e() {8745emit_int16((unsigned char)0xD9, (unsigned char)0xEA);8746}8747#endif // !_LP6487488749// SSE SIMD prefix byte values corresponding to VexSimdPrefix encoding.8750static int simd_pre[4] = { 0, 0x66, 0xF3, 0xF2 };8751// SSE opcode second byte values (first is 0x0F) corresponding to VexOpcode encoding.8752static int simd_opc[4] = { 0, 0, 0x38, 0x3A };87538754// Generate SSE legacy REX prefix and SIMD opcode based on VEX encoding.8755void Assembler::rex_prefix(Address adr, XMMRegister xreg, VexSimdPrefix pre, VexOpcode opc, bool rex_w) {8756if (pre > 0) {8757emit_int8(simd_pre[pre]);8758}8759if (rex_w) {8760prefixq(adr, xreg);8761} else {8762prefix(adr, xreg);8763}8764if (opc > 0) {8765emit_int8(0x0F);8766int opc2 = simd_opc[opc];8767if (opc2 > 0) {8768emit_int8(opc2);8769}8770}8771}87728773int Assembler::rex_prefix_and_encode(int dst_enc, int src_enc, VexSimdPrefix pre, VexOpcode opc, bool rex_w) {8774if (pre > 0) {8775emit_int8(simd_pre[pre]);8776}8777int encode = (rex_w) ? prefixq_and_encode(dst_enc, src_enc) : prefix_and_encode(dst_enc, src_enc);8778if (opc > 0) {8779emit_int8(0x0F);8780int opc2 = simd_opc[opc];8781if (opc2 > 0) {8782emit_int8(opc2);8783}8784}8785return encode;8786}878787888789void Assembler::vex_prefix(bool vex_r, bool vex_b, bool vex_x, int nds_enc, VexSimdPrefix pre, VexOpcode opc) {8790int vector_len = _attributes->get_vector_len();8791bool vex_w = _attributes->is_rex_vex_w();8792if (vex_b || vex_x || vex_w || (opc == VEX_OPCODE_0F_38) || (opc == VEX_OPCODE_0F_3A)) {8793int byte1 = (vex_r ? VEX_R : 0) | (vex_x ? VEX_X : 0) | (vex_b ? VEX_B : 0);8794byte1 = (~byte1) & 0xE0;8795byte1 |= opc;87968797int byte2 = ((~nds_enc) & 0xf) << 3;8798byte2 |= (vex_w ? VEX_W : 0) | ((vector_len > 0) ? 4 : 0) | pre;87998800emit_int24((unsigned char)VEX_3bytes, byte1, byte2);8801} else {8802int byte1 = vex_r ? VEX_R : 0;8803byte1 = (~byte1) & 0x80;8804byte1 |= ((~nds_enc) & 0xf) << 3;8805byte1 |= ((vector_len > 0 ) ? 4 : 0) | pre;8806emit_int16((unsigned char)VEX_2bytes, byte1);8807}8808}88098810// This is a 4 byte encoding8811void 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){8812// EVEX 0x62 prefix8813// byte1 = EVEX_4bytes;88148815bool vex_w = _attributes->is_rex_vex_w();8816int evex_encoding = (vex_w ? VEX_W : 0);8817// EVEX.b is not currently used for broadcast of single element or data rounding modes8818_attributes->set_evex_encoding(evex_encoding);88198820// P0: byte 2, initialized to RXBR`00mm8821// instead of not'd8822int byte2 = (vex_r ? VEX_R : 0) | (vex_x ? VEX_X : 0) | (vex_b ? VEX_B : 0) | (evex_r ? EVEX_Rb : 0);8823byte2 = (~byte2) & 0xF0;8824// confine opc opcode extensions in mm bits to lower two bits8825// of form {0F, 0F_38, 0F_3A}8826byte2 |= opc;88278828// P1: byte 3 as Wvvvv1pp8829int byte3 = ((~nds_enc) & 0xf) << 3;8830// p[10] is always 18831byte3 |= EVEX_F;8832byte3 |= (vex_w & 1) << 7;8833// confine pre opcode extensions in pp bits to lower two bits8834// of form {66, F3, F2}8835byte3 |= pre;88368837// P2: byte 4 as zL'Lbv'aaa8838// kregs are implemented in the low 3 bits as aaa8839int byte4 = (_attributes->is_no_reg_mask()) ?88400 :8841_attributes->get_embedded_opmask_register_specifier();8842// EVEX.v` for extending EVEX.vvvv or VIDX8843byte4 |= (evex_v ? 0: EVEX_V);8844// third EXEC.b for broadcast actions8845byte4 |= (_attributes->is_extended_context() ? EVEX_Rb : 0);8846// fourth EVEX.L'L for vector length : 0 is 128, 1 is 256, 2 is 512, currently we do not support 10248847byte4 |= ((_attributes->get_vector_len())& 0x3) << 5;8848// last is EVEX.z for zero/merge actions8849if (_attributes->is_no_reg_mask() == false &&8850_attributes->get_embedded_opmask_register_specifier() != 0) {8851byte4 |= (_attributes->is_clear_context() ? EVEX_Z : 0);8852}88538854emit_int32(EVEX_4bytes, byte2, byte3, byte4);8855}88568857void Assembler::vex_prefix(Address adr, int nds_enc, int xreg_enc, VexSimdPrefix pre, VexOpcode opc, InstructionAttr *attributes) {8858bool vex_r = (xreg_enc & 8) == 8;8859bool vex_b = adr.base_needs_rex();8860bool vex_x;8861if (adr.isxmmindex()) {8862vex_x = adr.xmmindex_needs_rex();8863} else {8864vex_x = adr.index_needs_rex();8865}8866set_attributes(attributes);8867attributes->set_current_assembler(this);88688869// For EVEX instruction (which is not marked as pure EVEX instruction) check and see if this instruction8870// is allowed in legacy mode and has resources which will fit in it.8871// Pure EVEX instructions will have is_evex_instruction set in their definition.8872if (!attributes->is_legacy_mode()) {8873if (UseAVX > 2 && !attributes->is_evex_instruction() && !is_managed()) {8874if ((attributes->get_vector_len() != AVX_512bit) && (nds_enc < 16) && (xreg_enc < 16)) {8875attributes->set_is_legacy_mode();8876}8877}8878}88798880if (UseAVX > 2) {8881assert(((!attributes->uses_vl()) ||8882(attributes->get_vector_len() == AVX_512bit) ||8883(!_legacy_mode_vl) ||8884(attributes->is_legacy_mode())),"XMM register should be 0-15");8885assert(((nds_enc < 16 && xreg_enc < 16) || (!attributes->is_legacy_mode())),"XMM register should be 0-15");8886}88878888clear_managed();8889if (UseAVX > 2 && !attributes->is_legacy_mode())8890{8891bool evex_r = (xreg_enc >= 16);8892bool evex_v;8893// EVEX.V' is set to true when VSIB is used as we may need to use higher order XMM registers (16-31)8894if (adr.isxmmindex()) {8895evex_v = ((adr._xmmindex->encoding() > 15) ? true : false);8896} else {8897evex_v = (nds_enc >= 16);8898}8899attributes->set_is_evex_instruction();8900evex_prefix(vex_r, vex_b, vex_x, evex_r, evex_v, nds_enc, pre, opc);8901} else {8902if (UseAVX > 2 && attributes->is_rex_vex_w_reverted()) {8903attributes->set_rex_vex_w(false);8904}8905vex_prefix(vex_r, vex_b, vex_x, nds_enc, pre, opc);8906}8907}89088909int Assembler::vex_prefix_and_encode(int dst_enc, int nds_enc, int src_enc, VexSimdPrefix pre, VexOpcode opc, InstructionAttr *attributes) {8910bool vex_r = (dst_enc & 8) == 8;8911bool vex_b = (src_enc & 8) == 8;8912bool vex_x = false;8913set_attributes(attributes);8914attributes->set_current_assembler(this);89158916// For EVEX instruction (which is not marked as pure EVEX instruction) check and see if this instruction8917// is allowed in legacy mode and has resources which will fit in it.8918// Pure EVEX instructions will have is_evex_instruction set in their definition.8919if (!attributes->is_legacy_mode()) {8920if (UseAVX > 2 && !attributes->is_evex_instruction() && !is_managed()) {8921if ((!attributes->uses_vl() || (attributes->get_vector_len() != AVX_512bit)) &&8922(dst_enc < 16) && (nds_enc < 16) && (src_enc < 16)) {8923attributes->set_is_legacy_mode();8924}8925}8926}89278928if (UseAVX > 2) {8929// All the scalar fp instructions (with uses_vl as false) can have legacy_mode as false8930// Instruction with uses_vl true are vector instructions8931// All the vector instructions with AVX_512bit length can have legacy_mode as false8932// All the vector instructions with < AVX_512bit length can have legacy_mode as false if AVX512vl() is supported8933// Rest all should have legacy_mode set as true8934assert(((!attributes->uses_vl()) ||8935(attributes->get_vector_len() == AVX_512bit) ||8936(!_legacy_mode_vl) ||8937(attributes->is_legacy_mode())),"XMM register should be 0-15");8938// Instruction with legacy_mode true should have dst, nds and src < 158939assert(((dst_enc < 16 && nds_enc < 16 && src_enc < 16) || (!attributes->is_legacy_mode())),"XMM register should be 0-15");8940}89418942clear_managed();8943if (UseAVX > 2 && !attributes->is_legacy_mode())8944{8945bool evex_r = (dst_enc >= 16);8946bool evex_v = (nds_enc >= 16);8947// can use vex_x as bank extender on rm encoding8948vex_x = (src_enc >= 16);8949attributes->set_is_evex_instruction();8950evex_prefix(vex_r, vex_b, vex_x, evex_r, evex_v, nds_enc, pre, opc);8951} else {8952if (UseAVX > 2 && attributes->is_rex_vex_w_reverted()) {8953attributes->set_rex_vex_w(false);8954}8955vex_prefix(vex_r, vex_b, vex_x, nds_enc, pre, opc);8956}89578958// return modrm byte components for operands8959return (((dst_enc & 7) << 3) | (src_enc & 7));8960}896189628963void Assembler::simd_prefix(XMMRegister xreg, XMMRegister nds, Address adr, VexSimdPrefix pre,8964VexOpcode opc, InstructionAttr *attributes) {8965if (UseAVX > 0) {8966int xreg_enc = xreg->encoding();8967int nds_enc = nds->is_valid() ? nds->encoding() : 0;8968vex_prefix(adr, nds_enc, xreg_enc, pre, opc, attributes);8969} else {8970assert((nds == xreg) || (nds == xnoreg), "wrong sse encoding");8971rex_prefix(adr, xreg, pre, opc, attributes->is_rex_vex_w());8972}8973}89748975int Assembler::simd_prefix_and_encode(XMMRegister dst, XMMRegister nds, XMMRegister src, VexSimdPrefix pre,8976VexOpcode opc, InstructionAttr *attributes) {8977int dst_enc = dst->encoding();8978int src_enc = src->encoding();8979if (UseAVX > 0) {8980int nds_enc = nds->is_valid() ? nds->encoding() : 0;8981return vex_prefix_and_encode(dst_enc, nds_enc, src_enc, pre, opc, attributes);8982} else {8983assert((nds == dst) || (nds == src) || (nds == xnoreg), "wrong sse encoding");8984return rex_prefix_and_encode(dst_enc, src_enc, pre, opc, attributes->is_rex_vex_w());8985}8986}89878988void Assembler::vmaxss(XMMRegister dst, XMMRegister nds, XMMRegister src) {8989assert(VM_Version::supports_avx(), "");8990InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);8991int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);8992emit_int16(0x5F, (0xC0 | encode));8993}89948995void Assembler::vmaxsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {8996assert(VM_Version::supports_avx(), "");8997InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);8998attributes.set_rex_vex_w_reverted();8999int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);9000emit_int16(0x5F, (0xC0 | encode));9001}90029003void Assembler::vminss(XMMRegister dst, XMMRegister nds, XMMRegister src) {9004assert(VM_Version::supports_avx(), "");9005InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);9006int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);9007emit_int16(0x5D, (0xC0 | encode));9008}90099010void Assembler::vminsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {9011assert(VM_Version::supports_avx(), "");9012InstructionAttr attributes(AVX_128bit, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);9013attributes.set_rex_vex_w_reverted();9014int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);9015emit_int16(0x5D, (0xC0 | encode));9016}90179018void Assembler::vcmppd(XMMRegister dst, XMMRegister nds, XMMRegister src, int cop, int vector_len) {9019assert(VM_Version::supports_avx(), "");9020assert(vector_len <= AVX_256bit, "");9021InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);9022int encode = simd_prefix_and_encode(dst, nds, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);9023emit_int24((unsigned char)0xC2, (0xC0 | encode), (0xF & cop));9024}90259026void Assembler::blendvpb(XMMRegister dst, XMMRegister nds, XMMRegister src1, XMMRegister src2, int vector_len) {9027assert(VM_Version::supports_avx(), "");9028assert(vector_len <= AVX_256bit, "");9029InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);9030int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src1->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9031int src2_enc = src2->encoding();9032emit_int24(0x4C, (0xC0 | encode), (0xF0 & src2_enc << 4));9033}90349035void Assembler::vblendvpd(XMMRegister dst, XMMRegister nds, XMMRegister src1, XMMRegister src2, int vector_len) {9036assert(UseAVX > 0 && (vector_len == AVX_128bit || vector_len == AVX_256bit), "");9037assert(vector_len <= AVX_256bit, "");9038InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);9039int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src1->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9040int src2_enc = src2->encoding();9041emit_int24(0x4B, (0xC0 | encode), (0xF0 & src2_enc << 4));9042}90439044void Assembler::vpblendd(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8, int vector_len) {9045assert(VM_Version::supports_avx2(), "");9046assert(vector_len <= AVX_256bit, "");9047InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);9048int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9049emit_int24(0x02, (0xC0 | encode), (unsigned char)imm8);9050}90519052void Assembler::vcmpps(XMMRegister dst, XMMRegister nds, XMMRegister src, int comparison, int vector_len) {9053assert(VM_Version::supports_avx(), "");9054assert(vector_len <= AVX_256bit, "");9055InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);9056int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);9057emit_int24((unsigned char)0xC2, (0xC0 | encode), (unsigned char)comparison);9058}90599060void Assembler::evcmpps(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src,9061ComparisonPredicateFP comparison, int vector_len) {9062assert(VM_Version::supports_evex(), "");9063// Encoding: EVEX.NDS.XXX.0F.W0 C2 /r ib9064InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);9065attributes.set_is_evex_instruction();9066attributes.set_embedded_opmask_register_specifier(mask);9067attributes.reset_is_clear_context();9068int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);9069emit_int24((unsigned char)0xC2, (0xC0 | encode), comparison);9070}90719072void Assembler::evcmppd(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src,9073ComparisonPredicateFP comparison, int vector_len) {9074assert(VM_Version::supports_evex(), "");9075// Encoding: EVEX.NDS.XXX.66.0F.W1 C2 /r ib9076InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);9077attributes.set_is_evex_instruction();9078attributes.set_embedded_opmask_register_specifier(mask);9079attributes.reset_is_clear_context();9080int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);9081emit_int24((unsigned char)0xC2, (0xC0 | encode), comparison);9082}90839084void Assembler::blendvps(XMMRegister dst, XMMRegister src) {9085assert(VM_Version::supports_sse4_1(), "");9086assert(UseAVX <= 0, "sse encoding is inconsistent with avx encoding");9087InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9088int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9089emit_int16(0x14, (0xC0 | encode));9090}90919092void Assembler::blendvpd(XMMRegister dst, XMMRegister src) {9093assert(VM_Version::supports_sse4_1(), "");9094assert(UseAVX <= 0, "sse encoding is inconsistent with avx encoding");9095InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9096int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9097emit_int16(0x15, (0xC0 | encode));9098}90999100void Assembler::pblendvb(XMMRegister dst, XMMRegister src) {9101assert(VM_Version::supports_sse4_1(), "");9102assert(UseAVX <= 0, "sse encoding is inconsistent with avx encoding");9103InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9104int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9105emit_int16(0x10, (0xC0 | encode));9106}91079108void Assembler::vblendvps(XMMRegister dst, XMMRegister nds, XMMRegister src1, XMMRegister src2, int vector_len) {9109assert(UseAVX > 0 && (vector_len == AVX_128bit || vector_len == AVX_256bit), "");9110InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9111int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src1->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9112int src2_enc = src2->encoding();9113emit_int24(0x4A, (0xC0 | encode), (0xF0 & src2_enc << 4));9114}91159116void Assembler::vblendps(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8, int vector_len) {9117InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9118int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9119emit_int24(0x0C, (0xC0 | encode), imm8);9120}91219122void Assembler::vpcmpgtb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {9123assert(vector_len == AVX_128bit ? VM_Version::supports_avx() : VM_Version::supports_avx2(), "");9124assert(vector_len <= AVX_256bit, "evex encoding is different - has k register as dest");9125InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9126int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);9127emit_int16(0x64, (0xC0 | encode));9128}91299130void Assembler::vpcmpgtw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {9131assert(vector_len == AVX_128bit ? VM_Version::supports_avx() : VM_Version::supports_avx2(), "");9132assert(vector_len <= AVX_256bit, "evex encoding is different - has k register as dest");9133InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9134int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);9135emit_int16(0x65, (0xC0 | encode));9136}91379138void Assembler::vpcmpgtd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {9139assert(vector_len == AVX_128bit ? VM_Version::supports_avx() : VM_Version::supports_avx2(), "");9140assert(vector_len <= AVX_256bit, "evex encoding is different - has k register as dest");9141InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9142int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);9143emit_int16(0x66, (0xC0 | encode));9144}91459146void Assembler::vpcmpgtq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {9147assert(vector_len == AVX_128bit ? VM_Version::supports_avx() : VM_Version::supports_avx2(), "");9148assert(vector_len <= AVX_256bit, "evex encoding is different - has k register as dest");9149InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9150int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9151emit_int16(0x37, (0xC0 | encode));9152}91539154void Assembler::evpcmpd(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src,9155int comparison, bool is_signed, int vector_len) {9156assert(VM_Version::supports_evex(), "");9157assert(comparison >= Assembler::eq && comparison <= Assembler::_true, "");9158// Encoding: EVEX.NDS.XXX.66.0F3A.W0 1F /r ib9159InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);9160attributes.set_is_evex_instruction();9161attributes.set_embedded_opmask_register_specifier(mask);9162attributes.reset_is_clear_context();9163int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9164int opcode = is_signed ? 0x1F : 0x1E;9165emit_int24(opcode, (0xC0 | encode), comparison);9166}91679168void Assembler::evpcmpd(KRegister kdst, KRegister mask, XMMRegister nds, Address src,9169int comparison, bool is_signed, int vector_len) {9170assert(VM_Version::supports_evex(), "");9171assert(comparison >= Assembler::eq && comparison <= Assembler::_true, "");9172// Encoding: EVEX.NDS.XXX.66.0F3A.W0 1F /r ib9173InstructionMark im(this);9174InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);9175attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_NObit);9176attributes.set_is_evex_instruction();9177attributes.set_embedded_opmask_register_specifier(mask);9178attributes.reset_is_clear_context();9179int dst_enc = kdst->encoding();9180vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9181int opcode = is_signed ? 0x1F : 0x1E;9182emit_int8((unsigned char)opcode);9183emit_operand(as_Register(dst_enc), src);9184emit_int8((unsigned char)comparison);9185}91869187void Assembler::evpcmpq(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src,9188int comparison, bool is_signed, int vector_len) {9189assert(VM_Version::supports_evex(), "");9190assert(comparison >= Assembler::eq && comparison <= Assembler::_true, "");9191// Encoding: EVEX.NDS.XXX.66.0F3A.W1 1F /r ib9192InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);9193attributes.set_is_evex_instruction();9194attributes.set_embedded_opmask_register_specifier(mask);9195attributes.reset_is_clear_context();9196int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9197int opcode = is_signed ? 0x1F : 0x1E;9198emit_int24(opcode, (0xC0 | encode), comparison);9199}92009201void Assembler::evpcmpq(KRegister kdst, KRegister mask, XMMRegister nds, Address src,9202int comparison, bool is_signed, int vector_len) {9203assert(VM_Version::supports_evex(), "");9204assert(comparison >= Assembler::eq && comparison <= Assembler::_true, "");9205// Encoding: EVEX.NDS.XXX.66.0F3A.W1 1F /r ib9206InstructionMark im(this);9207InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);9208attributes.set_address_attributes(/* tuple_type */ EVEX_FV, /* input_size_in_bits */ EVEX_NObit);9209attributes.set_is_evex_instruction();9210attributes.set_embedded_opmask_register_specifier(mask);9211attributes.reset_is_clear_context();9212int dst_enc = kdst->encoding();9213vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9214int opcode = is_signed ? 0x1F : 0x1E;9215emit_int8((unsigned char)opcode);9216emit_operand(as_Register(dst_enc), src);9217emit_int8((unsigned char)comparison);9218}92199220void Assembler::evpcmpb(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src,9221int comparison, bool is_signed, int vector_len) {9222assert(VM_Version::supports_evex(), "");9223assert(VM_Version::supports_avx512bw(), "");9224assert(comparison >= Assembler::eq && comparison <= Assembler::_true, "");9225// Encoding: EVEX.NDS.XXX.66.0F3A.W0 3F /r ib9226InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);9227attributes.set_is_evex_instruction();9228attributes.set_embedded_opmask_register_specifier(mask);9229attributes.reset_is_clear_context();9230int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9231int opcode = is_signed ? 0x3F : 0x3E;9232emit_int24(opcode, (0xC0 | encode), comparison);9233}92349235void Assembler::evpcmpb(KRegister kdst, KRegister mask, XMMRegister nds, Address src,9236int comparison, bool is_signed, int vector_len) {9237assert(VM_Version::supports_evex(), "");9238assert(VM_Version::supports_avx512bw(), "");9239assert(comparison >= Assembler::eq && comparison <= Assembler::_true, "");9240// Encoding: EVEX.NDS.XXX.66.0F3A.W0 3F /r ib9241InstructionMark im(this);9242InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);9243attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);9244attributes.set_is_evex_instruction();9245attributes.set_embedded_opmask_register_specifier(mask);9246attributes.reset_is_clear_context();9247int dst_enc = kdst->encoding();9248vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9249int opcode = is_signed ? 0x3F : 0x3E;9250emit_int8((unsigned char)opcode);9251emit_operand(as_Register(dst_enc), src);9252emit_int8((unsigned char)comparison);9253}92549255void Assembler::evpcmpw(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src,9256int comparison, bool is_signed, int vector_len) {9257assert(VM_Version::supports_evex(), "");9258assert(VM_Version::supports_avx512bw(), "");9259assert(comparison >= Assembler::eq && comparison <= Assembler::_true, "");9260// Encoding: EVEX.NDS.XXX.66.0F3A.W1 3F /r ib9261InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);9262attributes.set_is_evex_instruction();9263attributes.set_embedded_opmask_register_specifier(mask);9264attributes.reset_is_clear_context();9265int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9266int opcode = is_signed ? 0x3F : 0x3E;9267emit_int24(opcode, (0xC0 | encode), comparison);9268}92699270void Assembler::evpcmpw(KRegister kdst, KRegister mask, XMMRegister nds, Address src,9271int comparison, bool is_signed, int vector_len) {9272assert(VM_Version::supports_evex(), "");9273assert(VM_Version::supports_avx512bw(), "");9274assert(comparison >= Assembler::eq && comparison <= Assembler::_true, "");9275// Encoding: EVEX.NDS.XXX.66.0F3A.W1 3F /r ib9276InstructionMark im(this);9277InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);9278attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);9279attributes.set_is_evex_instruction();9280attributes.set_embedded_opmask_register_specifier(mask);9281attributes.reset_is_clear_context();9282int dst_enc = kdst->encoding();9283vex_prefix(src, nds->encoding(), dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9284int opcode = is_signed ? 0x3F : 0x3E;9285emit_int8((unsigned char)opcode);9286emit_operand(as_Register(dst_enc), src);9287emit_int8((unsigned char)comparison);9288}92899290void Assembler::vpblendvb(XMMRegister dst, XMMRegister nds, XMMRegister src, XMMRegister mask, int vector_len) {9291assert(VM_Version::supports_avx(), "");9292InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9293int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);9294int mask_enc = mask->encoding();9295emit_int24(0x4C, (0xC0 | encode), 0xF0 & mask_enc << 4);9296}92979298void Assembler::evblendmpd(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len) {9299assert(VM_Version::supports_evex(), "");9300// Encoding: EVEX.NDS.XXX.66.0F38.W1 65 /r9301InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);9302attributes.set_is_evex_instruction();9303attributes.set_embedded_opmask_register_specifier(mask);9304if (merge) {9305attributes.reset_is_clear_context();9306}9307int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9308emit_int16(0x65, (0xC0 | encode));9309}93109311void Assembler::evblendmps(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.W0 65 /r9314InstructionAttr attributes(vector_len, /* vex_w */ false, /* 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::evpblendmb (XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len) {9325assert(VM_Version::supports_evex(), "");9326assert(VM_Version::supports_avx512bw(), "");9327// Encoding: EVEX.NDS.512.66.0F38.W0 66 /r9328InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);9329attributes.set_is_evex_instruction();9330attributes.set_embedded_opmask_register_specifier(mask);9331if (merge) {9332attributes.reset_is_clear_context();9333}9334int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9335emit_int16(0x66, (0xC0 | encode));9336}93379338void Assembler::evpblendmw (XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len) {9339assert(VM_Version::supports_evex(), "");9340assert(VM_Version::supports_avx512bw(), "");9341// Encoding: EVEX.NDS.512.66.0F38.W1 66 /r9342InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);9343attributes.set_is_evex_instruction();9344attributes.set_embedded_opmask_register_specifier(mask);9345if (merge) {9346attributes.reset_is_clear_context();9347}9348int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9349emit_int16(0x66, (0xC0 | encode));9350}93519352void Assembler::evpblendmd (XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len) {9353assert(VM_Version::supports_evex(), "");9354//Encoding: EVEX.NDS.512.66.0F38.W0 64 /r9355InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* 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(0x64, (0xC0 | encode));9363}93649365void Assembler::evpblendmq (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.W1 64 /r9368InstructionAttr attributes(vector_len, /* vex_w */ true, /* 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::bzhiq(Register dst, Register src1, Register src2) {9379assert(VM_Version::supports_bmi2(), "bit manipulation instructions not supported");9380InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9381int encode = vex_prefix_and_encode(dst->encoding(), src2->encoding(), src1->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);9382emit_int16((unsigned char)0xF5, (0xC0 | encode));9383}93849385void Assembler::shlxl(Register dst, Register src1, Register src2) {9386assert(VM_Version::supports_bmi2(), "");9387InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);9388int encode = vex_prefix_and_encode(dst->encoding(), src2->encoding(), src1->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9389emit_int16((unsigned char)0xF7, (0xC0 | encode));9390}93919392void Assembler::shlxq(Register dst, Register src1, Register src2) {9393assert(VM_Version::supports_bmi2(), "");9394InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);9395int encode = vex_prefix_and_encode(dst->encoding(), src2->encoding(), src1->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);9396emit_int16((unsigned char)0xF7, (0xC0 | encode));9397}93989399void Assembler::shrxq(Register dst, Register src1, Register src2) {9400assert(VM_Version::supports_bmi2(), "");9401InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);9402int encode = vex_prefix_and_encode(dst->encoding(), src2->encoding(), src1->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F_38, &attributes);9403emit_int16((unsigned char)0xF7, (0xC0 | encode));9404}94059406void Assembler::evpmovb2m(KRegister dst, XMMRegister src, int vector_len) {9407assert(VM_Version::supports_avx512vlbw(), "");9408InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);9409attributes.set_is_evex_instruction();9410int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);9411emit_int16(0x29, (0xC0 | encode));9412}94139414#ifndef _LP6494159416void Assembler::incl(Register dst) {9417// Don't use it directly. Use MacroAssembler::incrementl() instead.9418emit_int8(0x40 | dst->encoding());9419}94209421void Assembler::lea(Register dst, Address src) {9422leal(dst, src);9423}94249425void Assembler::mov_literal32(Address dst, int32_t imm32, RelocationHolder const& rspec) {9426InstructionMark im(this);9427emit_int8((unsigned char)0xC7);9428emit_operand(rax, dst);9429emit_data((int)imm32, rspec, 0);9430}94319432void Assembler::mov_literal32(Register dst, int32_t imm32, RelocationHolder const& rspec) {9433InstructionMark im(this);9434int encode = prefix_and_encode(dst->encoding());9435emit_int8((0xB8 | encode));9436emit_data((int)imm32, rspec, 0);9437}94389439void Assembler::popa() { // 32bit9440emit_int8(0x61);9441}94429443void Assembler::push_literal32(int32_t imm32, RelocationHolder const& rspec) {9444InstructionMark im(this);9445emit_int8(0x68);9446emit_data(imm32, rspec, 0);9447}94489449void Assembler::pusha() { // 32bit9450emit_int8(0x60);9451}94529453void Assembler::set_byte_if_not_zero(Register dst) {9454emit_int24(0x0F, (unsigned char)0x95, (0xC0 | dst->encoding()));9455}94569457#else // LP6494589459void Assembler::set_byte_if_not_zero(Register dst) {9460int enc = prefix_and_encode(dst->encoding(), true);9461emit_int24(0x0F, (unsigned char)0x95, (0xC0 | enc));9462}94639464// 64bit only pieces of the assembler9465// This should only be used by 64bit instructions that can use rip-relative9466// it cannot be used by instructions that want an immediate value.94679468bool Assembler::reachable(AddressLiteral adr) {9469int64_t disp;9470relocInfo::relocType relocType = adr.reloc();94719472// None will force a 64bit literal to the code stream. Likely a placeholder9473// for something that will be patched later and we need to certain it will9474// always be reachable.9475if (relocType == relocInfo::none) {9476return false;9477}9478if (relocType == relocInfo::internal_word_type) {9479// This should be rip relative and easily reachable.9480return true;9481}9482if (relocType == relocInfo::virtual_call_type ||9483relocType == relocInfo::opt_virtual_call_type ||9484relocType == relocInfo::static_call_type ||9485relocType == relocInfo::static_stub_type ) {9486// This should be rip relative within the code cache and easily9487// reachable until we get huge code caches. (At which point9488// ic code is going to have issues).9489return true;9490}9491if (relocType != relocInfo::external_word_type &&9492relocType != relocInfo::poll_return_type && // these are really external_word but need special9493relocType != relocInfo::poll_type && // relocs to identify them9494relocType != relocInfo::runtime_call_type ) {9495return false;9496}94979498// Stress the correction code9499if (ForceUnreachable) {9500// Must be runtimecall reloc, see if it is in the codecache9501// Flipping stuff in the codecache to be unreachable causes issues9502// with things like inline caches where the additional instructions9503// are not handled.9504if (CodeCache::find_blob(adr._target) == NULL) {9505return false;9506}9507}9508// For external_word_type/runtime_call_type if it is reachable from where we9509// are now (possibly a temp buffer) and where we might end up9510// anywhere in the codeCache then we are always reachable.9511// This would have to change if we ever save/restore shared code9512// to be more pessimistic.9513disp = (int64_t)adr._target - ((int64_t)CodeCache::low_bound() + sizeof(int));9514if (!is_simm32(disp)) return false;9515disp = (int64_t)adr._target - ((int64_t)CodeCache::high_bound() + sizeof(int));9516if (!is_simm32(disp)) return false;95179518disp = (int64_t)adr._target - ((int64_t)pc() + sizeof(int));95199520// Because rip relative is a disp + address_of_next_instruction and we9521// don't know the value of address_of_next_instruction we apply a fudge factor9522// to make sure we will be ok no matter the size of the instruction we get placed into.9523// We don't have to fudge the checks above here because they are already worst case.95249525// 12 == override/rex byte, opcode byte, rm byte, sib byte, a 4-byte disp , 4-byte literal9526// + 4 because better safe than sorry.9527const int fudge = 12 + 4;9528if (disp < 0) {9529disp -= fudge;9530} else {9531disp += fudge;9532}9533return is_simm32(disp);9534}95359536void Assembler::emit_data64(jlong data,9537relocInfo::relocType rtype,9538int format) {9539if (rtype == relocInfo::none) {9540emit_int64(data);9541} else {9542emit_data64(data, Relocation::spec_simple(rtype), format);9543}9544}95459546void Assembler::emit_data64(jlong data,9547RelocationHolder const& rspec,9548int format) {9549assert(imm_operand == 0, "default format must be immediate in this file");9550assert(imm_operand == format, "must be immediate");9551assert(inst_mark() != NULL, "must be inside InstructionMark");9552// Do not use AbstractAssembler::relocate, which is not intended for9553// embedded words. Instead, relocate to the enclosing instruction.9554code_section()->relocate(inst_mark(), rspec, format);9555#ifdef ASSERT9556check_relocation(rspec, format);9557#endif9558emit_int64(data);9559}95609561void Assembler::prefix(Register reg) {9562if (reg->encoding() >= 8) {9563prefix(REX_B);9564}9565}95669567void Assembler::prefix(Register dst, Register src, Prefix p) {9568if (src->encoding() >= 8) {9569p = (Prefix)(p | REX_B);9570}9571if (dst->encoding() >= 8) {9572p = (Prefix)(p | REX_R);9573}9574if (p != Prefix_EMPTY) {9575// do not generate an empty prefix9576prefix(p);9577}9578}95799580void Assembler::prefix(Register dst, Address adr, Prefix p) {9581if (adr.base_needs_rex()) {9582if (adr.index_needs_rex()) {9583assert(false, "prefix(Register dst, Address adr, Prefix p) does not support handling of an X");9584} else {9585prefix(REX_B);9586}9587} else {9588if (adr.index_needs_rex()) {9589assert(false, "prefix(Register dst, Address adr, Prefix p) does not support handling of an X");9590}9591}9592if (dst->encoding() >= 8) {9593p = (Prefix)(p | REX_R);9594}9595if (p != Prefix_EMPTY) {9596// do not generate an empty prefix9597prefix(p);9598}9599}96009601void Assembler::prefix(Address adr) {9602if (adr.base_needs_rex()) {9603if (adr.index_needs_rex()) {9604prefix(REX_XB);9605} else {9606prefix(REX_B);9607}9608} else {9609if (adr.index_needs_rex()) {9610prefix(REX_X);9611}9612}9613}96149615void Assembler::prefix(Address adr, Register reg, bool byteinst) {9616if (reg->encoding() < 8) {9617if (adr.base_needs_rex()) {9618if (adr.index_needs_rex()) {9619prefix(REX_XB);9620} else {9621prefix(REX_B);9622}9623} else {9624if (adr.index_needs_rex()) {9625prefix(REX_X);9626} else if (byteinst && reg->encoding() >= 4) {9627prefix(REX);9628}9629}9630} else {9631if (adr.base_needs_rex()) {9632if (adr.index_needs_rex()) {9633prefix(REX_RXB);9634} else {9635prefix(REX_RB);9636}9637} else {9638if (adr.index_needs_rex()) {9639prefix(REX_RX);9640} else {9641prefix(REX_R);9642}9643}9644}9645}96469647void Assembler::prefix(Address adr, XMMRegister reg) {9648if (reg->encoding() < 8) {9649if (adr.base_needs_rex()) {9650if (adr.index_needs_rex()) {9651prefix(REX_XB);9652} else {9653prefix(REX_B);9654}9655} else {9656if (adr.index_needs_rex()) {9657prefix(REX_X);9658}9659}9660} else {9661if (adr.base_needs_rex()) {9662if (adr.index_needs_rex()) {9663prefix(REX_RXB);9664} else {9665prefix(REX_RB);9666}9667} else {9668if (adr.index_needs_rex()) {9669prefix(REX_RX);9670} else {9671prefix(REX_R);9672}9673}9674}9675}96769677int Assembler::prefix_and_encode(int reg_enc, bool byteinst) {9678if (reg_enc >= 8) {9679prefix(REX_B);9680reg_enc -= 8;9681} else if (byteinst && reg_enc >= 4) {9682prefix(REX);9683}9684return reg_enc;9685}96869687int Assembler::prefix_and_encode(int dst_enc, bool dst_is_byte, int src_enc, bool src_is_byte) {9688if (dst_enc < 8) {9689if (src_enc >= 8) {9690prefix(REX_B);9691src_enc -= 8;9692} else if ((src_is_byte && src_enc >= 4) || (dst_is_byte && dst_enc >= 4)) {9693prefix(REX);9694}9695} else {9696if (src_enc < 8) {9697prefix(REX_R);9698} else {9699prefix(REX_RB);9700src_enc -= 8;9701}9702dst_enc -= 8;9703}9704return dst_enc << 3 | src_enc;9705}97069707int8_t Assembler::get_prefixq(Address adr) {9708int8_t prfx = get_prefixq(adr, rax);9709assert(REX_W <= prfx && prfx <= REX_WXB, "must be");9710return prfx;9711}97129713int8_t Assembler::get_prefixq(Address adr, Register src) {9714int8_t prfx = (int8_t)(REX_W +9715((int)adr.base_needs_rex()) +9716((int)adr.index_needs_rex() << 1) +9717((int)(src->encoding() >= 8) << 2));9718#ifdef ASSERT9719if (src->encoding() < 8) {9720if (adr.base_needs_rex()) {9721if (adr.index_needs_rex()) {9722assert(prfx == REX_WXB, "must be");9723} else {9724assert(prfx == REX_WB, "must be");9725}9726} else {9727if (adr.index_needs_rex()) {9728assert(prfx == REX_WX, "must be");9729} else {9730assert(prfx == REX_W, "must be");9731}9732}9733} else {9734if (adr.base_needs_rex()) {9735if (adr.index_needs_rex()) {9736assert(prfx == REX_WRXB, "must be");9737} else {9738assert(prfx == REX_WRB, "must be");9739}9740} else {9741if (adr.index_needs_rex()) {9742assert(prfx == REX_WRX, "must be");9743} else {9744assert(prfx == REX_WR, "must be");9745}9746}9747}9748#endif9749return prfx;9750}97519752void Assembler::prefixq(Address adr) {9753emit_int8(get_prefixq(adr));9754}97559756void Assembler::prefixq(Address adr, Register src) {9757emit_int8(get_prefixq(adr, src));9758}97599760void Assembler::prefixq(Address adr, XMMRegister src) {9761if (src->encoding() < 8) {9762if (adr.base_needs_rex()) {9763if (adr.index_needs_rex()) {9764prefix(REX_WXB);9765} else {9766prefix(REX_WB);9767}9768} else {9769if (adr.index_needs_rex()) {9770prefix(REX_WX);9771} else {9772prefix(REX_W);9773}9774}9775} else {9776if (adr.base_needs_rex()) {9777if (adr.index_needs_rex()) {9778prefix(REX_WRXB);9779} else {9780prefix(REX_WRB);9781}9782} else {9783if (adr.index_needs_rex()) {9784prefix(REX_WRX);9785} else {9786prefix(REX_WR);9787}9788}9789}9790}97919792int Assembler::prefixq_and_encode(int reg_enc) {9793if (reg_enc < 8) {9794prefix(REX_W);9795} else {9796prefix(REX_WB);9797reg_enc -= 8;9798}9799return reg_enc;9800}98019802int Assembler::prefixq_and_encode(int dst_enc, int src_enc) {9803if (dst_enc < 8) {9804if (src_enc < 8) {9805prefix(REX_W);9806} else {9807prefix(REX_WB);9808src_enc -= 8;9809}9810} else {9811if (src_enc < 8) {9812prefix(REX_WR);9813} else {9814prefix(REX_WRB);9815src_enc -= 8;9816}9817dst_enc -= 8;9818}9819return dst_enc << 3 | src_enc;9820}98219822void Assembler::adcq(Register dst, int32_t imm32) {9823(void) prefixq_and_encode(dst->encoding());9824emit_arith(0x81, 0xD0, dst, imm32);9825}98269827void Assembler::adcq(Register dst, Address src) {9828InstructionMark im(this);9829emit_int16(get_prefixq(src, dst), 0x13);9830emit_operand(dst, src);9831}98329833void Assembler::adcq(Register dst, Register src) {9834(void) prefixq_and_encode(dst->encoding(), src->encoding());9835emit_arith(0x13, 0xC0, dst, src);9836}98379838void Assembler::addq(Address dst, int32_t imm32) {9839InstructionMark im(this);9840prefixq(dst);9841emit_arith_operand(0x81, rax, dst, imm32);9842}98439844void Assembler::addq(Address dst, Register src) {9845InstructionMark im(this);9846emit_int16(get_prefixq(dst, src), 0x01);9847emit_operand(src, dst);9848}98499850void Assembler::addq(Register dst, int32_t imm32) {9851(void) prefixq_and_encode(dst->encoding());9852emit_arith(0x81, 0xC0, dst, imm32);9853}98549855void Assembler::addq(Register dst, Address src) {9856InstructionMark im(this);9857emit_int16(get_prefixq(src, dst), 0x03);9858emit_operand(dst, src);9859}98609861void Assembler::addq(Register dst, Register src) {9862(void) prefixq_and_encode(dst->encoding(), src->encoding());9863emit_arith(0x03, 0xC0, dst, src);9864}98659866void Assembler::adcxq(Register dst, Register src) {9867//assert(VM_Version::supports_adx(), "adx instructions not supported");9868emit_int8(0x66);9869int encode = prefixq_and_encode(dst->encoding(), src->encoding());9870emit_int32(0x0F,98710x38,9872(unsigned char)0xF6,9873(0xC0 | encode));9874}98759876void Assembler::adoxq(Register dst, Register src) {9877//assert(VM_Version::supports_adx(), "adx instructions not supported");9878emit_int8((unsigned char)0xF3);9879int encode = prefixq_and_encode(dst->encoding(), src->encoding());9880emit_int32(0x0F,98810x38,9882(unsigned char)0xF6,9883(0xC0 | encode));9884}98859886void Assembler::andq(Address dst, int32_t imm32) {9887InstructionMark im(this);9888prefixq(dst);9889emit_arith_operand(0x81, as_Register(4), dst, imm32);9890}98919892void Assembler::andq(Register dst, int32_t imm32) {9893(void) prefixq_and_encode(dst->encoding());9894emit_arith(0x81, 0xE0, dst, imm32);9895}98969897void Assembler::andq(Register dst, Address src) {9898InstructionMark im(this);9899emit_int16(get_prefixq(src, dst), 0x23);9900emit_operand(dst, src);9901}99029903void Assembler::andq(Register dst, Register src) {9904(void) prefixq_and_encode(dst->encoding(), src->encoding());9905emit_arith(0x23, 0xC0, dst, src);9906}99079908void Assembler::andq(Address dst, Register src) {9909InstructionMark im(this);9910emit_int16(get_prefixq(dst, src), 0x21);9911emit_operand(src, dst);9912}99139914void Assembler::andnq(Register dst, Register src1, Register src2) {9915assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");9916InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9917int encode = vex_prefix_and_encode(dst->encoding(), src1->encoding(), src2->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);9918emit_int16((unsigned char)0xF2, (0xC0 | encode));9919}99209921void Assembler::andnq(Register dst, Register src1, Address src2) {9922assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");9923InstructionMark im(this);9924InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9925vex_prefix(src2, src1->encoding(), dst->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);9926emit_int8((unsigned char)0xF2);9927emit_operand(dst, src2);9928}99299930void Assembler::bsfq(Register dst, Register src) {9931int encode = prefixq_and_encode(dst->encoding(), src->encoding());9932emit_int24(0x0F, (unsigned char)0xBC, (0xC0 | encode));9933}99349935void Assembler::bsrq(Register dst, Register src) {9936int encode = prefixq_and_encode(dst->encoding(), src->encoding());9937emit_int24(0x0F, (unsigned char)0xBD, (0xC0 | encode));9938}99399940void Assembler::bswapq(Register reg) {9941int encode = prefixq_and_encode(reg->encoding());9942emit_int16(0x0F, (0xC8 | encode));9943}99449945void Assembler::blsiq(Register dst, Register src) {9946assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");9947InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9948int encode = vex_prefix_and_encode(rbx->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);9949emit_int16((unsigned char)0xF3, (0xC0 | encode));9950}99519952void Assembler::blsiq(Register dst, Address src) {9953assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");9954InstructionMark im(this);9955InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9956vex_prefix(src, dst->encoding(), rbx->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);9957emit_int8((unsigned char)0xF3);9958emit_operand(rbx, src);9959}99609961void Assembler::blsmskq(Register dst, Register src) {9962assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");9963InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9964int encode = vex_prefix_and_encode(rdx->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);9965emit_int16((unsigned char)0xF3, (0xC0 | encode));9966}99679968void Assembler::blsmskq(Register dst, Address src) {9969assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");9970InstructionMark im(this);9971InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9972vex_prefix(src, dst->encoding(), rdx->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);9973emit_int8((unsigned char)0xF3);9974emit_operand(rdx, src);9975}99769977void Assembler::blsrq(Register dst, Register src) {9978assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");9979InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9980int encode = vex_prefix_and_encode(rcx->encoding(), dst->encoding(), src->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);9981emit_int16((unsigned char)0xF3, (0xC0 | encode));9982}99839984void Assembler::blsrq(Register dst, Address src) {9985assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");9986InstructionMark im(this);9987InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);9988vex_prefix(src, dst->encoding(), rcx->encoding(), VEX_SIMD_NONE, VEX_OPCODE_0F_38, &attributes);9989emit_int8((unsigned char)0xF3);9990emit_operand(rcx, src);9991}99929993void Assembler::cdqq() {9994emit_int16(REX_W, (unsigned char)0x99);9995}99969997void Assembler::clflush(Address adr) {9998assert(VM_Version::supports_clflush(), "should do");9999prefix(adr);10000emit_int16(0x0F, (unsigned char)0xAE);10001emit_operand(rdi, adr);10002}1000310004void Assembler::clflushopt(Address adr) {10005assert(VM_Version::supports_clflushopt(), "should do!");10006// adr should be base reg only with no index or offset10007assert(adr.index() == noreg, "index should be noreg");10008assert(adr.scale() == Address::no_scale, "scale should be no_scale");10009assert(adr.disp() == 0, "displacement should be 0");10010// instruction prefix is 0x6610011emit_int8(0x66);10012prefix(adr);10013// opcode family is 0x0F 0xAE10014emit_int16(0x0F, (unsigned char)0xAE);10015// extended opcode byte is 7 == rdi10016emit_operand(rdi, adr);10017}1001810019void Assembler::clwb(Address adr) {10020assert(VM_Version::supports_clwb(), "should do!");10021// adr should be base reg only with no index or offset10022assert(adr.index() == noreg, "index should be noreg");10023assert(adr.scale() == Address::no_scale, "scale should be no_scale");10024assert(adr.disp() == 0, "displacement should be 0");10025// instruction prefix is 0x6610026emit_int8(0x66);10027prefix(adr);10028// opcode family is 0x0f 0xAE10029emit_int16(0x0F, (unsigned char)0xAE);10030// extended opcode byte is 6 == rsi10031emit_operand(rsi, adr);10032}1003310034void Assembler::cmovq(Condition cc, Register dst, Register src) {10035int encode = prefixq_and_encode(dst->encoding(), src->encoding());10036emit_int24(0x0F, (0x40 | cc), (0xC0 | encode));10037}1003810039void Assembler::cmovq(Condition cc, Register dst, Address src) {10040InstructionMark im(this);10041emit_int24(get_prefixq(src, dst), 0x0F, (0x40 | cc));10042emit_operand(dst, src);10043}1004410045void Assembler::cmpq(Address dst, int32_t imm32) {10046InstructionMark im(this);10047emit_int16(get_prefixq(dst), (unsigned char)0x81);10048emit_operand(rdi, dst, 4);10049emit_int32(imm32);10050}1005110052void Assembler::cmpq(Register dst, int32_t imm32) {10053(void) prefixq_and_encode(dst->encoding());10054emit_arith(0x81, 0xF8, dst, imm32);10055}1005610057void Assembler::cmpq(Address dst, Register src) {10058InstructionMark im(this);10059emit_int16(get_prefixq(dst, src), 0x39);10060emit_operand(src, dst);10061}1006210063void Assembler::cmpq(Register dst, Register src) {10064(void) prefixq_and_encode(dst->encoding(), src->encoding());10065emit_arith(0x3B, 0xC0, dst, src);10066}1006710068void Assembler::cmpq(Register dst, Address src) {10069InstructionMark im(this);10070emit_int16(get_prefixq(src, dst), 0x3B);10071emit_operand(dst, src);10072}1007310074void Assembler::cmpxchgq(Register reg, Address adr) {10075InstructionMark im(this);10076emit_int24(get_prefixq(adr, reg), 0x0F, (unsigned char)0xB1);10077emit_operand(reg, adr);10078}1007910080void Assembler::cvtsi2sdq(XMMRegister dst, Register src) {10081NOT_LP64(assert(VM_Version::supports_sse2(), ""));10082InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);10083int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);10084emit_int16(0x2A, (0xC0 | encode));10085}1008610087void Assembler::cvtsi2sdq(XMMRegister dst, Address src) {10088NOT_LP64(assert(VM_Version::supports_sse2(), ""));10089InstructionMark im(this);10090InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);10091attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);10092simd_prefix(dst, dst, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);10093emit_int8(0x2A);10094emit_operand(dst, src);10095}1009610097void Assembler::cvtsi2ssq(XMMRegister dst, Address src) {10098NOT_LP64(assert(VM_Version::supports_sse(), ""));10099InstructionMark im(this);10100InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);10101attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);10102simd_prefix(dst, dst, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);10103emit_int8(0x2A);10104emit_operand(dst, src);10105}1010610107void Assembler::cvttsd2siq(Register dst, Address src) {10108NOT_LP64(assert(VM_Version::supports_sse2(), ""));10109// F2 REX.W 0F 2C /r10110// CVTTSD2SI r64, xmm1/m6410111InstructionMark im(this);10112emit_int32((unsigned char)0xF2, REX_W, 0x0F, 0x2C);10113emit_operand(dst, src);10114}1011510116void Assembler::cvttsd2siq(Register dst, XMMRegister src) {10117NOT_LP64(assert(VM_Version::supports_sse2(), ""));10118InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);10119int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);10120emit_int16(0x2C, (0xC0 | encode));10121}1012210123void Assembler::cvttss2siq(Register dst, XMMRegister src) {10124NOT_LP64(assert(VM_Version::supports_sse(), ""));10125InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);10126int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_F3, VEX_OPCODE_0F, &attributes);10127emit_int16(0x2C, (0xC0 | encode));10128}1012910130void Assembler::decl(Register dst) {10131// Don't use it directly. Use MacroAssembler::decrementl() instead.10132// Use two-byte form (one-byte form is a REX prefix in 64-bit mode)10133int encode = prefix_and_encode(dst->encoding());10134emit_int16((unsigned char)0xFF, (0xC8 | encode));10135}1013610137void Assembler::decq(Register dst) {10138// Don't use it directly. Use MacroAssembler::decrementq() instead.10139// Use two-byte form (one-byte from is a REX prefix in 64-bit mode)10140int encode = prefixq_and_encode(dst->encoding());10141emit_int16((unsigned char)0xFF, 0xC8 | encode);10142}1014310144void Assembler::decq(Address dst) {10145// Don't use it directly. Use MacroAssembler::decrementq() instead.10146InstructionMark im(this);10147emit_int16(get_prefixq(dst), (unsigned char)0xFF);10148emit_operand(rcx, dst);10149}1015010151void Assembler::fxrstor(Address src) {10152emit_int24(get_prefixq(src), 0x0F, (unsigned char)0xAE);10153emit_operand(as_Register(1), src);10154}1015510156void Assembler::xrstor(Address src) {10157emit_int24(get_prefixq(src), 0x0F, (unsigned char)0xAE);10158emit_operand(as_Register(5), src);10159}1016010161void Assembler::fxsave(Address dst) {10162emit_int24(get_prefixq(dst), 0x0F, (unsigned char)0xAE);10163emit_operand(as_Register(0), dst);10164}1016510166void Assembler::xsave(Address dst) {10167emit_int24(get_prefixq(dst), 0x0F, (unsigned char)0xAE);10168emit_operand(as_Register(4), dst);10169}1017010171void Assembler::idivq(Register src) {10172int encode = prefixq_and_encode(src->encoding());10173emit_int16((unsigned char)0xF7, (0xF8 | encode));10174}1017510176void Assembler::imulq(Register dst, Register src) {10177int encode = prefixq_and_encode(dst->encoding(), src->encoding());10178emit_int24(0x0F, (unsigned char)0xAF, (0xC0 | encode));10179}1018010181void Assembler::imulq(Register src) {10182int encode = prefixq_and_encode(src->encoding());10183emit_int16((unsigned char)0xF7, (0xE8 | encode));10184}1018510186void Assembler::imulq(Register dst, Address src, int32_t value) {10187InstructionMark im(this);10188prefixq(src, dst);10189if (is8bit(value)) {10190emit_int8((unsigned char)0x6B);10191emit_operand(dst, src);10192emit_int8(value);10193} else {10194emit_int8((unsigned char)0x69);10195emit_operand(dst, src);10196emit_int32(value);10197}10198}1019910200void Assembler::imulq(Register dst, Register src, int value) {10201int encode = prefixq_and_encode(dst->encoding(), src->encoding());10202if (is8bit(value)) {10203emit_int24(0x6B, (0xC0 | encode), (value & 0xFF));10204} else {10205emit_int16(0x69, (0xC0 | encode));10206emit_int32(value);10207}10208}1020910210void Assembler::imulq(Register dst, Address src) {10211InstructionMark im(this);10212emit_int24(get_prefixq(src, dst), 0x0F, (unsigned char)0xAF);10213emit_operand(dst, src);10214}1021510216void Assembler::incl(Register dst) {10217// Don't use it directly. Use MacroAssembler::incrementl() instead.10218// Use two-byte form (one-byte from is a REX prefix in 64-bit mode)10219int encode = prefix_and_encode(dst->encoding());10220emit_int16((unsigned char)0xFF, (0xC0 | encode));10221}1022210223void Assembler::incq(Register dst) {10224// Don't use it directly. Use MacroAssembler::incrementq() instead.10225// Use two-byte form (one-byte from is a REX prefix in 64-bit mode)10226int encode = prefixq_and_encode(dst->encoding());10227emit_int16((unsigned char)0xFF, (0xC0 | encode));10228}1022910230void Assembler::incq(Address dst) {10231// Don't use it directly. Use MacroAssembler::incrementq() instead.10232InstructionMark im(this);10233emit_int16(get_prefixq(dst), (unsigned char)0xFF);10234emit_operand(rax, dst);10235}1023610237void Assembler::lea(Register dst, Address src) {10238leaq(dst, src);10239}1024010241void Assembler::leaq(Register dst, Address src) {10242InstructionMark im(this);10243emit_int16(get_prefixq(src, dst), (unsigned char)0x8D);10244emit_operand(dst, src);10245}1024610247void Assembler::mov64(Register dst, int64_t imm64) {10248InstructionMark im(this);10249int encode = prefixq_and_encode(dst->encoding());10250emit_int8(0xB8 | encode);10251emit_int64(imm64);10252}1025310254void Assembler::mov64(Register dst, int64_t imm64, relocInfo::relocType rtype, int format) {10255InstructionMark im(this);10256int encode = prefixq_and_encode(dst->encoding());10257emit_int8(0xB8 | encode);10258emit_data64(imm64, rtype, format);10259}1026010261void Assembler::mov_literal64(Register dst, intptr_t imm64, RelocationHolder const& rspec) {10262InstructionMark im(this);10263int encode = prefixq_and_encode(dst->encoding());10264emit_int8(0xB8 | encode);10265emit_data64(imm64, rspec);10266}1026710268void Assembler::mov_narrow_oop(Register dst, int32_t imm32, RelocationHolder const& rspec) {10269InstructionMark im(this);10270int encode = prefix_and_encode(dst->encoding());10271emit_int8(0xB8 | encode);10272emit_data((int)imm32, rspec, narrow_oop_operand);10273}1027410275void Assembler::mov_narrow_oop(Address dst, int32_t imm32, RelocationHolder const& rspec) {10276InstructionMark im(this);10277prefix(dst);10278emit_int8((unsigned char)0xC7);10279emit_operand(rax, dst, 4);10280emit_data((int)imm32, rspec, narrow_oop_operand);10281}1028210283void Assembler::cmp_narrow_oop(Register src1, int32_t imm32, RelocationHolder const& rspec) {10284InstructionMark im(this);10285int encode = prefix_and_encode(src1->encoding());10286emit_int16((unsigned char)0x81, (0xF8 | encode));10287emit_data((int)imm32, rspec, narrow_oop_operand);10288}1028910290void Assembler::cmp_narrow_oop(Address src1, int32_t imm32, RelocationHolder const& rspec) {10291InstructionMark im(this);10292prefix(src1);10293emit_int8((unsigned char)0x81);10294emit_operand(rax, src1, 4);10295emit_data((int)imm32, rspec, narrow_oop_operand);10296}1029710298void Assembler::lzcntq(Register dst, Register src) {10299assert(VM_Version::supports_lzcnt(), "encoding is treated as BSR");10300emit_int8((unsigned char)0xF3);10301int encode = prefixq_and_encode(dst->encoding(), src->encoding());10302emit_int24(0x0F, (unsigned char)0xBD, (0xC0 | encode));10303}1030410305void Assembler::movdq(XMMRegister dst, Register src) {10306// table D-1 says MMX/SSE210307NOT_LP64(assert(VM_Version::supports_sse2(), ""));10308InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);10309int encode = simd_prefix_and_encode(dst, xnoreg, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);10310emit_int16(0x6E, (0xC0 | encode));10311}1031210313void Assembler::movdq(Register dst, XMMRegister src) {10314// table D-1 says MMX/SSE210315NOT_LP64(assert(VM_Version::supports_sse2(), ""));10316InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);10317// swap src/dst to get correct prefix10318int encode = simd_prefix_and_encode(src, xnoreg, as_XMMRegister(dst->encoding()), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);10319emit_int16(0x7E,10320(0xC0 | encode));10321}1032210323void Assembler::movq(Register dst, Register src) {10324int encode = prefixq_and_encode(dst->encoding(), src->encoding());10325emit_int16((unsigned char)0x8B,10326(0xC0 | encode));10327}1032810329void Assembler::movq(Register dst, Address src) {10330InstructionMark im(this);10331emit_int16(get_prefixq(src, dst), (unsigned char)0x8B);10332emit_operand(dst, src);10333}1033410335void Assembler::movq(Address dst, Register src) {10336InstructionMark im(this);10337emit_int16(get_prefixq(dst, src), (unsigned char)0x89);10338emit_operand(src, dst);10339}1034010341void Assembler::movq(Address dst, int32_t imm32) {10342InstructionMark im(this);10343emit_int16(get_prefixq(dst), (unsigned char)0xC7);10344emit_operand(as_Register(0), dst);10345emit_int32(imm32);10346}1034710348void Assembler::movq(Register dst, int32_t imm32) {10349int encode = prefixq_and_encode(dst->encoding());10350emit_int16((unsigned char)0xC7, (0xC0 | encode));10351emit_int32(imm32);10352}1035310354void Assembler::movsbq(Register dst, Address src) {10355InstructionMark im(this);10356emit_int24(get_prefixq(src, dst),103570x0F,10358(unsigned char)0xBE);10359emit_operand(dst, src);10360}1036110362void Assembler::movsbq(Register dst, Register src) {10363int encode = prefixq_and_encode(dst->encoding(), src->encoding());10364emit_int24(0x0F, (unsigned char)0xBE, (0xC0 | encode));10365}1036610367void Assembler::movslq(Register dst, int32_t imm32) {10368// dbx shows movslq(rcx, 3) as movq $0x0000000049000000,(%rbx)10369// and movslq(r8, 3); as movl $0x0000000048000000,(%rbx)10370// as a result we shouldn't use until tested at runtime...10371ShouldNotReachHere();10372InstructionMark im(this);10373int encode = prefixq_and_encode(dst->encoding());10374emit_int8(0xC7 | encode);10375emit_int32(imm32);10376}1037710378void Assembler::movslq(Address dst, int32_t imm32) {10379assert(is_simm32(imm32), "lost bits");10380InstructionMark im(this);10381emit_int16(get_prefixq(dst), (unsigned char)0xC7);10382emit_operand(rax, dst, 4);10383emit_int32(imm32);10384}1038510386void Assembler::movslq(Register dst, Address src) {10387InstructionMark im(this);10388emit_int16(get_prefixq(src, dst), 0x63);10389emit_operand(dst, src);10390}1039110392void Assembler::movslq(Register dst, Register src) {10393int encode = prefixq_and_encode(dst->encoding(), src->encoding());10394emit_int16(0x63, (0xC0 | encode));10395}1039610397void Assembler::movswq(Register dst, Address src) {10398InstructionMark im(this);10399emit_int24(get_prefixq(src, dst),104000x0F,10401(unsigned char)0xBF);10402emit_operand(dst, src);10403}1040410405void Assembler::movswq(Register dst, Register src) {10406int encode = prefixq_and_encode(dst->encoding(), src->encoding());10407emit_int24(0x0F, (unsigned char)0xBF, (0xC0 | encode));10408}1040910410void Assembler::movzbq(Register dst, Address src) {10411InstructionMark im(this);10412emit_int24(get_prefixq(src, dst),104130x0F,10414(unsigned char)0xB6);10415emit_operand(dst, src);10416}1041710418void Assembler::movzbq(Register dst, Register src) {10419int encode = prefixq_and_encode(dst->encoding(), src->encoding());10420emit_int24(0x0F, (unsigned char)0xB6, (0xC0 | encode));10421}1042210423void Assembler::movzwq(Register dst, Address src) {10424InstructionMark im(this);10425emit_int24(get_prefixq(src, dst),104260x0F,10427(unsigned char)0xB7);10428emit_operand(dst, src);10429}1043010431void Assembler::movzwq(Register dst, Register src) {10432int encode = prefixq_and_encode(dst->encoding(), src->encoding());10433emit_int24(0x0F, (unsigned char)0xB7, (0xC0 | encode));10434}1043510436void Assembler::mulq(Address src) {10437InstructionMark im(this);10438emit_int16(get_prefixq(src), (unsigned char)0xF7);10439emit_operand(rsp, src);10440}1044110442void Assembler::mulq(Register src) {10443int encode = prefixq_and_encode(src->encoding());10444emit_int16((unsigned char)0xF7, (0xE0 | encode));10445}1044610447void Assembler::mulxq(Register dst1, Register dst2, Register src) {10448assert(VM_Version::supports_bmi2(), "bit manipulation instructions not supported");10449InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);10450int encode = vex_prefix_and_encode(dst1->encoding(), dst2->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F_38, &attributes);10451emit_int16((unsigned char)0xF6, (0xC0 | encode));10452}1045310454void Assembler::negq(Register dst) {10455int encode = prefixq_and_encode(dst->encoding());10456emit_int16((unsigned char)0xF7, (0xD8 | encode));10457}1045810459void Assembler::negq(Address dst) {10460InstructionMark im(this);10461emit_int16(get_prefixq(dst), (unsigned char)0xF7);10462emit_operand(as_Register(3), dst);10463}1046410465void Assembler::notq(Register dst) {10466int encode = prefixq_and_encode(dst->encoding());10467emit_int16((unsigned char)0xF7, (0xD0 | encode));10468}1046910470void Assembler::btsq(Address dst, int imm8) {10471assert(isByte(imm8), "not a byte");10472InstructionMark im(this);10473emit_int24(get_prefixq(dst),104740x0F,10475(unsigned char)0xBA);10476emit_operand(rbp /* 5 */, dst, 1);10477emit_int8(imm8);10478}1047910480void Assembler::btrq(Address dst, int imm8) {10481assert(isByte(imm8), "not a byte");10482InstructionMark im(this);10483emit_int24(get_prefixq(dst),104840x0F,10485(unsigned char)0xBA);10486emit_operand(rsi /* 6 */, dst, 1);10487emit_int8(imm8);10488}1048910490void Assembler::orq(Address dst, int32_t imm32) {10491InstructionMark im(this);10492prefixq(dst);10493emit_arith_operand(0x81, as_Register(1), dst, imm32);10494}1049510496void Assembler::orq(Address dst, Register src) {10497InstructionMark im(this);10498emit_int16(get_prefixq(dst, src), (unsigned char)0x09);10499emit_operand(src, dst);10500}1050110502void Assembler::orq(Register dst, int32_t imm32) {10503(void) prefixq_and_encode(dst->encoding());10504emit_arith(0x81, 0xC8, dst, imm32);10505}1050610507void Assembler::orq(Register dst, Address src) {10508InstructionMark im(this);10509emit_int16(get_prefixq(src, dst), 0x0B);10510emit_operand(dst, src);10511}1051210513void Assembler::orq(Register dst, Register src) {10514(void) prefixq_and_encode(dst->encoding(), src->encoding());10515emit_arith(0x0B, 0xC0, dst, src);10516}1051710518void Assembler::popcntq(Register dst, Address src) {10519assert(VM_Version::supports_popcnt(), "must support");10520InstructionMark im(this);10521emit_int32((unsigned char)0xF3,10522get_prefixq(src, dst),105230x0F,10524(unsigned char)0xB8);10525emit_operand(dst, src);10526}1052710528void Assembler::popcntq(Register dst, Register src) {10529assert(VM_Version::supports_popcnt(), "must support");10530emit_int8((unsigned char)0xF3);10531int encode = prefixq_and_encode(dst->encoding(), src->encoding());10532emit_int24(0x0F, (unsigned char)0xB8, (0xC0 | encode));10533}1053410535void Assembler::popq(Address dst) {10536InstructionMark im(this);10537emit_int16(get_prefixq(dst), (unsigned char)0x8F);10538emit_operand(rax, dst);10539}1054010541void Assembler::popq(Register dst) {10542emit_int8((unsigned char)0x58 | dst->encoding());10543}1054410545// Precomputable: popa, pusha, vzeroupper1054610547// The result of these routines are invariant from one invocation to another10548// invocation for the duration of a run. Caching the result on bootstrap10549// and copying it out on subsequent invocations can thus be beneficial10550static bool precomputed = false;1055110552static u_char* popa_code = NULL;10553static int popa_len = 0;1055410555static u_char* pusha_code = NULL;10556static int pusha_len = 0;1055710558static u_char* vzup_code = NULL;10559static int vzup_len = 0;1056010561void Assembler::precompute_instructions() {10562assert(!Universe::is_fully_initialized(), "must still be single threaded");10563guarantee(!precomputed, "only once");10564precomputed = true;10565ResourceMark rm;1056610567// Make a temporary buffer big enough for the routines we're capturing10568int size = 256;10569char* tmp_code = NEW_RESOURCE_ARRAY(char, size);10570CodeBuffer buffer((address)tmp_code, size);10571MacroAssembler masm(&buffer);1057210573address begin_popa = masm.code_section()->end();10574masm.popa_uncached();10575address end_popa = masm.code_section()->end();10576masm.pusha_uncached();10577address end_pusha = masm.code_section()->end();10578masm.vzeroupper_uncached();10579address end_vzup = masm.code_section()->end();1058010581// Save the instructions to permanent buffers.10582popa_len = (int)(end_popa - begin_popa);10583popa_code = NEW_C_HEAP_ARRAY(u_char, popa_len, mtInternal);10584memcpy(popa_code, begin_popa, popa_len);1058510586pusha_len = (int)(end_pusha - end_popa);10587pusha_code = NEW_C_HEAP_ARRAY(u_char, pusha_len, mtInternal);10588memcpy(pusha_code, end_popa, pusha_len);1058910590vzup_len = (int)(end_vzup - end_pusha);10591if (vzup_len > 0) {10592vzup_code = NEW_C_HEAP_ARRAY(u_char, vzup_len, mtInternal);10593memcpy(vzup_code, end_pusha, vzup_len);10594} else {10595vzup_code = pusha_code; // dummy10596}1059710598assert(masm.code()->total_oop_size() == 0 &&10599masm.code()->total_metadata_size() == 0 &&10600masm.code()->total_relocation_size() == 0,10601"pre-computed code can't reference oops, metadata or contain relocations");10602}1060310604static void emit_copy(CodeSection* code_section, u_char* src, int src_len) {10605assert(src != NULL, "code to copy must have been pre-computed");10606assert(code_section->limit() - code_section->end() > src_len, "code buffer not large enough");10607address end = code_section->end();10608memcpy(end, src, src_len);10609code_section->set_end(end + src_len);10610}1061110612void Assembler::popa() { // 64bit10613emit_copy(code_section(), popa_code, popa_len);10614}1061510616void Assembler::popa_uncached() { // 64bit10617movq(r15, Address(rsp, 0));10618movq(r14, Address(rsp, wordSize));10619movq(r13, Address(rsp, 2 * wordSize));10620movq(r12, Address(rsp, 3 * wordSize));10621movq(r11, Address(rsp, 4 * wordSize));10622movq(r10, Address(rsp, 5 * wordSize));10623movq(r9, Address(rsp, 6 * wordSize));10624movq(r8, Address(rsp, 7 * wordSize));10625movq(rdi, Address(rsp, 8 * wordSize));10626movq(rsi, Address(rsp, 9 * wordSize));10627movq(rbp, Address(rsp, 10 * wordSize));10628// Skip rsp as it is restored automatically to the value10629// before the corresponding pusha when popa is done.10630movq(rbx, Address(rsp, 12 * wordSize));10631movq(rdx, Address(rsp, 13 * wordSize));10632movq(rcx, Address(rsp, 14 * wordSize));10633movq(rax, Address(rsp, 15 * wordSize));1063410635addq(rsp, 16 * wordSize);10636}1063710638// Does not actually store the value of rsp on the stack.10639// The slot for rsp just contains an arbitrary value.10640void Assembler::pusha() { // 64bit10641emit_copy(code_section(), pusha_code, pusha_len);10642}1064310644// Does not actually store the value of rsp on the stack.10645// The slot for rsp just contains an arbitrary value.10646void Assembler::pusha_uncached() { // 64bit10647subq(rsp, 16 * wordSize);1064810649movq(Address(rsp, 15 * wordSize), rax);10650movq(Address(rsp, 14 * wordSize), rcx);10651movq(Address(rsp, 13 * wordSize), rdx);10652movq(Address(rsp, 12 * wordSize), rbx);10653// Skip rsp as the value is normally not used. There are a few places where10654// the original value of rsp needs to be known but that can be computed10655// from the value of rsp immediately after pusha (rsp + 16 * wordSize).10656movq(Address(rsp, 10 * wordSize), rbp);10657movq(Address(rsp, 9 * wordSize), rsi);10658movq(Address(rsp, 8 * wordSize), rdi);10659movq(Address(rsp, 7 * wordSize), r8);10660movq(Address(rsp, 6 * wordSize), r9);10661movq(Address(rsp, 5 * wordSize), r10);10662movq(Address(rsp, 4 * wordSize), r11);10663movq(Address(rsp, 3 * wordSize), r12);10664movq(Address(rsp, 2 * wordSize), r13);10665movq(Address(rsp, wordSize), r14);10666movq(Address(rsp, 0), r15);10667}1066810669void Assembler::vzeroupper() {10670emit_copy(code_section(), vzup_code, vzup_len);10671}1067210673void Assembler::pushq(Address src) {10674InstructionMark im(this);10675emit_int16(get_prefixq(src), (unsigned char)0xFF);10676emit_operand(rsi, src);10677}1067810679void Assembler::rclq(Register dst, int imm8) {10680assert(isShiftCount(imm8 >> 1), "illegal shift count");10681int encode = prefixq_and_encode(dst->encoding());10682if (imm8 == 1) {10683emit_int16((unsigned char)0xD1, (0xD0 | encode));10684} else {10685emit_int24((unsigned char)0xC1, (0xD0 | encode), imm8);10686}10687}1068810689void Assembler::rcrq(Register dst, int imm8) {10690assert(isShiftCount(imm8 >> 1), "illegal shift count");10691int encode = prefixq_and_encode(dst->encoding());10692if (imm8 == 1) {10693emit_int16((unsigned char)0xD1, (0xD8 | encode));10694} else {10695emit_int24((unsigned char)0xC1, (0xD8 | encode), imm8);10696}10697}106981069910700void Assembler::rorxq(Register dst, Register src, int imm8) {10701assert(VM_Version::supports_bmi2(), "bit manipulation instructions not supported");10702InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);10703int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F_3A, &attributes);10704emit_int24((unsigned char)0xF0, (0xC0 | encode), imm8);10705}1070610707void Assembler::rorxd(Register dst, Register src, int imm8) {10708assert(VM_Version::supports_bmi2(), "bit manipulation instructions not supported");10709InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);10710int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F_3A, &attributes);10711emit_int24((unsigned char)0xF0, (0xC0 | encode), imm8);10712}1071310714#ifdef _LP6410715void Assembler::salq(Address dst, int imm8) {10716InstructionMark im(this);10717assert(isShiftCount(imm8 >> 1), "illegal shift count");10718if (imm8 == 1) {10719emit_int16(get_prefixq(dst), (unsigned char)0xD1);10720emit_operand(as_Register(4), dst);10721}10722else {10723emit_int16(get_prefixq(dst), (unsigned char)0xC1);10724emit_operand(as_Register(4), dst);10725emit_int8(imm8);10726}10727}1072810729void Assembler::salq(Address dst) {10730InstructionMark im(this);10731emit_int16(get_prefixq(dst), (unsigned char)0xD3);10732emit_operand(as_Register(4), dst);10733}1073410735void Assembler::salq(Register dst, int imm8) {10736assert(isShiftCount(imm8 >> 1), "illegal shift count");10737int encode = prefixq_and_encode(dst->encoding());10738if (imm8 == 1) {10739emit_int16((unsigned char)0xD1, (0xE0 | encode));10740} else {10741emit_int24((unsigned char)0xC1, (0xE0 | encode), imm8);10742}10743}1074410745void Assembler::salq(Register dst) {10746int encode = prefixq_and_encode(dst->encoding());10747emit_int16((unsigned char)0xD3, (0xE0 | encode));10748}1074910750void Assembler::sarq(Address dst, int imm8) {10751InstructionMark im(this);10752assert(isShiftCount(imm8 >> 1), "illegal shift count");10753if (imm8 == 1) {10754emit_int16(get_prefixq(dst), (unsigned char)0xD1);10755emit_operand(as_Register(7), dst);10756}10757else {10758emit_int16(get_prefixq(dst), (unsigned char)0xC1);10759emit_operand(as_Register(7), dst);10760emit_int8(imm8);10761}10762}1076310764void Assembler::sarq(Address dst) {10765InstructionMark im(this);10766emit_int16(get_prefixq(dst), (unsigned char)0xD3);10767emit_operand(as_Register(7), dst);10768}1076910770void Assembler::sarq(Register dst, int imm8) {10771assert(isShiftCount(imm8 >> 1), "illegal shift count");10772int encode = prefixq_and_encode(dst->encoding());10773if (imm8 == 1) {10774emit_int16((unsigned char)0xD1, (0xF8 | encode));10775} else {10776emit_int24((unsigned char)0xC1, (0xF8 | encode), imm8);10777}10778}1077910780void Assembler::sarq(Register dst) {10781int encode = prefixq_and_encode(dst->encoding());10782emit_int16((unsigned char)0xD3, (0xF8 | encode));10783}10784#endif1078510786void Assembler::sbbq(Address dst, int32_t imm32) {10787InstructionMark im(this);10788prefixq(dst);10789emit_arith_operand(0x81, rbx, dst, imm32);10790}1079110792void Assembler::sbbq(Register dst, int32_t imm32) {10793(void) prefixq_and_encode(dst->encoding());10794emit_arith(0x81, 0xD8, dst, imm32);10795}1079610797void Assembler::sbbq(Register dst, Address src) {10798InstructionMark im(this);10799emit_int16(get_prefixq(src, dst), 0x1B);10800emit_operand(dst, src);10801}1080210803void Assembler::sbbq(Register dst, Register src) {10804(void) prefixq_and_encode(dst->encoding(), src->encoding());10805emit_arith(0x1B, 0xC0, dst, src);10806}1080710808void Assembler::shlq(Register dst, int imm8) {10809assert(isShiftCount(imm8 >> 1), "illegal shift count");10810int encode = prefixq_and_encode(dst->encoding());10811if (imm8 == 1) {10812emit_int16((unsigned char)0xD1, (0xE0 | encode));10813} else {10814emit_int24((unsigned char)0xC1, (0xE0 | encode), imm8);10815}10816}1081710818void Assembler::shlq(Register dst) {10819int encode = prefixq_and_encode(dst->encoding());10820emit_int16((unsigned char)0xD3, (0xE0 | encode));10821}1082210823void Assembler::shrq(Register dst, int imm8) {10824assert(isShiftCount(imm8 >> 1), "illegal shift count");10825int encode = prefixq_and_encode(dst->encoding());10826if (imm8 == 1) {10827emit_int16((unsigned char)0xD1, (0xE8 | encode));10828}10829else {10830emit_int24((unsigned char)0xC1, (0xE8 | encode), imm8);10831}10832}1083310834void Assembler::shrq(Register dst) {10835int encode = prefixq_and_encode(dst->encoding());10836emit_int16((unsigned char)0xD3, 0xE8 | encode);10837}1083810839void Assembler::shrq(Address dst) {10840InstructionMark im(this);10841emit_int16(get_prefixq(dst), (unsigned char)0xD3);10842emit_operand(as_Register(5), dst);10843}1084410845void Assembler::shrq(Address dst, int imm8) {10846InstructionMark im(this);10847assert(isShiftCount(imm8 >> 1), "illegal shift count");10848if (imm8 == 1) {10849emit_int16(get_prefixq(dst), (unsigned char)0xD1);10850emit_operand(as_Register(5), dst);10851}10852else {10853emit_int16(get_prefixq(dst), (unsigned char)0xC1);10854emit_operand(as_Register(5), dst);10855emit_int8(imm8);10856}10857}1085810859void Assembler::subq(Address dst, int32_t imm32) {10860InstructionMark im(this);10861prefixq(dst);10862emit_arith_operand(0x81, rbp, dst, imm32);10863}1086410865void Assembler::subq(Address dst, Register src) {10866InstructionMark im(this);10867emit_int16(get_prefixq(dst, src), 0x29);10868emit_operand(src, dst);10869}1087010871void Assembler::subq(Register dst, int32_t imm32) {10872(void) prefixq_and_encode(dst->encoding());10873emit_arith(0x81, 0xE8, dst, imm32);10874}1087510876// Force generation of a 4 byte immediate value even if it fits into 8bit10877void Assembler::subq_imm32(Register dst, int32_t imm32) {10878(void) prefixq_and_encode(dst->encoding());10879emit_arith_imm32(0x81, 0xE8, dst, imm32);10880}1088110882void Assembler::subq(Register dst, Address src) {10883InstructionMark im(this);10884emit_int16(get_prefixq(src, dst), 0x2B);10885emit_operand(dst, src);10886}1088710888void Assembler::subq(Register dst, Register src) {10889(void) prefixq_and_encode(dst->encoding(), src->encoding());10890emit_arith(0x2B, 0xC0, dst, src);10891}1089210893void Assembler::testq(Address dst, int32_t imm32) {10894InstructionMark im(this);10895emit_int16(get_prefixq(dst), (unsigned char)0xF7);10896emit_operand(as_Register(0), dst);10897emit_int32(imm32);10898}1089910900void Assembler::testq(Register dst, int32_t imm32) {10901// not using emit_arith because test10902// doesn't support sign-extension of10903// 8bit operands10904int encode = dst->encoding();10905encode = prefixq_and_encode(encode);10906emit_int16((unsigned char)0xF7, (0xC0 | encode));10907emit_int32(imm32);10908}1090910910void Assembler::testq(Register dst, Register src) {10911(void) prefixq_and_encode(dst->encoding(), src->encoding());10912emit_arith(0x85, 0xC0, dst, src);10913}1091410915void Assembler::testq(Register dst, Address src) {10916InstructionMark im(this);10917emit_int16(get_prefixq(src, dst), (unsigned char)0x85);10918emit_operand(dst, src);10919}1092010921void Assembler::xaddq(Address dst, Register src) {10922InstructionMark im(this);10923emit_int24(get_prefixq(dst, src), 0x0F, (unsigned char)0xC1);10924emit_operand(src, dst);10925}1092610927void Assembler::xchgq(Register dst, Address src) {10928InstructionMark im(this);10929emit_int16(get_prefixq(src, dst), (unsigned char)0x87);10930emit_operand(dst, src);10931}1093210933void Assembler::xchgq(Register dst, Register src) {10934int encode = prefixq_and_encode(dst->encoding(), src->encoding());10935emit_int16((unsigned char)0x87, (0xc0 | encode));10936}1093710938void Assembler::xorq(Register dst, Register src) {10939(void) prefixq_and_encode(dst->encoding(), src->encoding());10940emit_arith(0x33, 0xC0, dst, src);10941}1094210943void Assembler::xorq(Register dst, Address src) {10944InstructionMark im(this);10945emit_int16(get_prefixq(src, dst), 0x33);10946emit_operand(dst, src);10947}1094810949void Assembler::xorq(Register dst, int32_t imm32) {10950(void) prefixq_and_encode(dst->encoding());10951emit_arith(0x81, 0xF0, dst, imm32);10952}1095310954void Assembler::xorq(Address dst, int32_t imm32) {10955InstructionMark im(this);10956prefixq(dst);10957emit_arith_operand(0x81, as_Register(6), dst, imm32);10958}1095910960void Assembler::xorq(Address dst, Register src) {10961InstructionMark im(this);10962emit_int16(get_prefixq(dst, src), 0x31);10963emit_operand(src, dst);10964}1096510966#endif // !LP641096710968void InstructionAttr::set_address_attributes(int tuple_type, int input_size_in_bits) {10969if (VM_Version::supports_evex()) {10970_tuple_type = tuple_type;10971_input_size_in_bits = input_size_in_bits;10972}10973}109741097510976