Path: blob/jdk8u272-b10-aarch32-20201026/hotspot/src/cpu/x86/vm/assembler_x86.cpp
48785 views
/*1* Copyright (c) 1997, 2014, 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_interface/collectedHeap.inline.hpp"28#include "interpreter/interpreter.hpp"29#include "memory/cardTableModRefBS.hpp"30#include "memory/resourceArea.hpp"31#include "prims/methodHandles.hpp"32#include "runtime/biasedLocking.hpp"33#include "runtime/interfaceSupport.hpp"34#include "runtime/objectMonitor.hpp"35#include "runtime/os.hpp"36#include "runtime/sharedRuntime.hpp"37#include "runtime/stubRoutines.hpp"38#include "utilities/macros.hpp"39#if INCLUDE_ALL_GCS40#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"41#include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"42#include "gc_implementation/g1/heapRegion.hpp"43#endif // INCLUDE_ALL_GCS4445#ifdef PRODUCT46#define BLOCK_COMMENT(str) /* nothing */47#define STOP(error) stop(error)48#else49#define BLOCK_COMMENT(str) block_comment(str)50#define STOP(error) block_comment(error); stop(error)51#endif5253#define BIND(label) bind(label); BLOCK_COMMENT(#label ":")54// Implementation of AddressLiteral5556AddressLiteral::AddressLiteral(address target, relocInfo::relocType rtype) {57_is_lval = false;58_target = target;59switch (rtype) {60case relocInfo::oop_type:61case relocInfo::metadata_type:62// Oops are a special case. Normally they would be their own section63// but in cases like icBuffer they are literals in the code stream that64// we don't have a section for. We use none so that we get a literal address65// which is always patchable.66break;67case relocInfo::external_word_type:68_rspec = external_word_Relocation::spec(target);69break;70case relocInfo::internal_word_type:71_rspec = internal_word_Relocation::spec(target);72break;73case relocInfo::opt_virtual_call_type:74_rspec = opt_virtual_call_Relocation::spec();75break;76case relocInfo::static_call_type:77_rspec = static_call_Relocation::spec();78break;79case relocInfo::runtime_call_type:80_rspec = runtime_call_Relocation::spec();81break;82case relocInfo::poll_type:83case relocInfo::poll_return_type:84_rspec = Relocation::spec_simple(rtype);85break;86case relocInfo::none:87break;88default:89ShouldNotReachHere();90break;91}92}9394// Implementation of Address9596#ifdef _LP649798Address Address::make_array(ArrayAddress adr) {99// Not implementable on 64bit machines100// Should have been handled higher up the call chain.101ShouldNotReachHere();102return Address();103}104105// exceedingly dangerous constructor106Address::Address(int disp, address loc, relocInfo::relocType rtype) {107_base = noreg;108_index = noreg;109_scale = no_scale;110_disp = disp;111switch (rtype) {112case relocInfo::external_word_type:113_rspec = external_word_Relocation::spec(loc);114break;115case relocInfo::internal_word_type:116_rspec = internal_word_Relocation::spec(loc);117break;118case relocInfo::runtime_call_type:119// HMM120_rspec = runtime_call_Relocation::spec();121break;122case relocInfo::poll_type:123case relocInfo::poll_return_type:124_rspec = Relocation::spec_simple(rtype);125break;126case relocInfo::none:127break;128default:129ShouldNotReachHere();130}131}132#else // LP64133134Address Address::make_array(ArrayAddress adr) {135AddressLiteral base = adr.base();136Address index = adr.index();137assert(index._disp == 0, "must not have disp"); // maybe it can?138Address array(index._base, index._index, index._scale, (intptr_t) base.target());139array._rspec = base._rspec;140return array;141}142143// exceedingly dangerous constructor144Address::Address(address loc, RelocationHolder spec) {145_base = noreg;146_index = noreg;147_scale = no_scale;148_disp = (intptr_t) loc;149_rspec = spec;150}151152#endif // _LP64153154155156// Convert the raw encoding form into the form expected by the constructor for157// Address. An index of 4 (rsp) corresponds to having no index, so convert158// that to noreg for the Address constructor.159Address Address::make_raw(int base, int index, int scale, int disp, relocInfo::relocType disp_reloc) {160RelocationHolder rspec;161if (disp_reloc != relocInfo::none) {162rspec = Relocation::spec_simple(disp_reloc);163}164bool valid_index = index != rsp->encoding();165if (valid_index) {166Address madr(as_Register(base), as_Register(index), (Address::ScaleFactor)scale, in_ByteSize(disp));167madr._rspec = rspec;168return madr;169} else {170Address madr(as_Register(base), noreg, Address::no_scale, in_ByteSize(disp));171madr._rspec = rspec;172return madr;173}174}175176// Implementation of Assembler177178int AbstractAssembler::code_fill_byte() {179return (u_char)'\xF4'; // hlt180}181182// make this go away someday183void Assembler::emit_data(jint data, relocInfo::relocType rtype, int format) {184if (rtype == relocInfo::none)185emit_int32(data);186else emit_data(data, Relocation::spec_simple(rtype), format);187}188189void Assembler::emit_data(jint data, RelocationHolder const& rspec, int format) {190assert(imm_operand == 0, "default format must be immediate in this file");191assert(inst_mark() != NULL, "must be inside InstructionMark");192if (rspec.type() != relocInfo::none) {193#ifdef ASSERT194check_relocation(rspec, format);195#endif196// Do not use AbstractAssembler::relocate, which is not intended for197// embedded words. Instead, relocate to the enclosing instruction.198199// hack. call32 is too wide for mask so use disp32200if (format == call32_operand)201code_section()->relocate(inst_mark(), rspec, disp32_operand);202else203code_section()->relocate(inst_mark(), rspec, format);204}205emit_int32(data);206}207208static int encode(Register r) {209int enc = r->encoding();210if (enc >= 8) {211enc -= 8;212}213return enc;214}215216void Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) {217assert(dst->has_byte_register(), "must have byte register");218assert(isByte(op1) && isByte(op2), "wrong opcode");219assert(isByte(imm8), "not a byte");220assert((op1 & 0x01) == 0, "should be 8bit operation");221emit_int8(op1);222emit_int8(op2 | encode(dst));223emit_int8(imm8);224}225226227void Assembler::emit_arith(int op1, int op2, Register dst, int32_t imm32) {228assert(isByte(op1) && isByte(op2), "wrong opcode");229assert((op1 & 0x01) == 1, "should be 32bit operation");230assert((op1 & 0x02) == 0, "sign-extension bit should not be set");231if (is8bit(imm32)) {232emit_int8(op1 | 0x02); // set sign bit233emit_int8(op2 | encode(dst));234emit_int8(imm32 & 0xFF);235} else {236emit_int8(op1);237emit_int8(op2 | encode(dst));238emit_int32(imm32);239}240}241242// Force generation of a 4 byte immediate value even if it fits into 8bit243void Assembler::emit_arith_imm32(int op1, int op2, Register dst, int32_t imm32) {244assert(isByte(op1) && isByte(op2), "wrong opcode");245assert((op1 & 0x01) == 1, "should be 32bit operation");246assert((op1 & 0x02) == 0, "sign-extension bit should not be set");247emit_int8(op1);248emit_int8(op2 | encode(dst));249emit_int32(imm32);250}251252// immediate-to-memory forms253void Assembler::emit_arith_operand(int op1, Register rm, Address adr, int32_t imm32) {254assert((op1 & 0x01) == 1, "should be 32bit operation");255assert((op1 & 0x02) == 0, "sign-extension bit should not be set");256if (is8bit(imm32)) {257emit_int8(op1 | 0x02); // set sign bit258emit_operand(rm, adr, 1);259emit_int8(imm32 & 0xFF);260} else {261emit_int8(op1);262emit_operand(rm, adr, 4);263emit_int32(imm32);264}265}266267268void Assembler::emit_arith(int op1, int op2, Register dst, Register src) {269assert(isByte(op1) && isByte(op2), "wrong opcode");270emit_int8(op1);271emit_int8(op2 | encode(dst) << 3 | encode(src));272}273274275void Assembler::emit_operand(Register reg, Register base, Register index,276Address::ScaleFactor scale, int disp,277RelocationHolder const& rspec,278int rip_relative_correction) {279relocInfo::relocType rtype = (relocInfo::relocType) rspec.type();280281// Encode the registers as needed in the fields they are used in282283int regenc = encode(reg) << 3;284int indexenc = index->is_valid() ? encode(index) << 3 : 0;285int baseenc = base->is_valid() ? encode(base) : 0;286287if (base->is_valid()) {288if (index->is_valid()) {289assert(scale != Address::no_scale, "inconsistent address");290// [base + index*scale + disp]291if (disp == 0 && rtype == relocInfo::none &&292base != rbp LP64_ONLY(&& base != r13)) {293// [base + index*scale]294// [00 reg 100][ss index base]295assert(index != rsp, "illegal addressing mode");296emit_int8(0x04 | regenc);297emit_int8(scale << 6 | indexenc | baseenc);298} else if (is8bit(disp) && rtype == relocInfo::none) {299// [base + index*scale + imm8]300// [01 reg 100][ss index base] imm8301assert(index != rsp, "illegal addressing mode");302emit_int8(0x44 | regenc);303emit_int8(scale << 6 | indexenc | baseenc);304emit_int8(disp & 0xFF);305} else {306// [base + index*scale + disp32]307// [10 reg 100][ss index base] disp32308assert(index != rsp, "illegal addressing mode");309emit_int8(0x84 | regenc);310emit_int8(scale << 6 | indexenc | baseenc);311emit_data(disp, rspec, disp32_operand);312}313} else if (base == rsp LP64_ONLY(|| base == r12)) {314// [rsp + disp]315if (disp == 0 && rtype == relocInfo::none) {316// [rsp]317// [00 reg 100][00 100 100]318emit_int8(0x04 | regenc);319emit_int8(0x24);320} else if (is8bit(disp) && rtype == relocInfo::none) {321// [rsp + imm8]322// [01 reg 100][00 100 100] disp8323emit_int8(0x44 | regenc);324emit_int8(0x24);325emit_int8(disp & 0xFF);326} else {327// [rsp + imm32]328// [10 reg 100][00 100 100] disp32329emit_int8(0x84 | regenc);330emit_int8(0x24);331emit_data(disp, rspec, disp32_operand);332}333} else {334// [base + disp]335assert(base != rsp LP64_ONLY(&& base != r12), "illegal addressing mode");336if (disp == 0 && rtype == relocInfo::none &&337base != rbp LP64_ONLY(&& base != r13)) {338// [base]339// [00 reg base]340emit_int8(0x00 | regenc | baseenc);341} else if (is8bit(disp) && rtype == relocInfo::none) {342// [base + disp8]343// [01 reg base] disp8344emit_int8(0x40 | regenc | baseenc);345emit_int8(disp & 0xFF);346} else {347// [base + disp32]348// [10 reg base] disp32349emit_int8(0x80 | regenc | baseenc);350emit_data(disp, rspec, disp32_operand);351}352}353} else {354if (index->is_valid()) {355assert(scale != Address::no_scale, "inconsistent address");356// [index*scale + disp]357// [00 reg 100][ss index 101] disp32358assert(index != rsp, "illegal addressing mode");359emit_int8(0x04 | regenc);360emit_int8(scale << 6 | indexenc | 0x05);361emit_data(disp, rspec, disp32_operand);362} else if (rtype != relocInfo::none ) {363// [disp] (64bit) RIP-RELATIVE (32bit) abs364// [00 000 101] disp32365366emit_int8(0x05 | regenc);367// Note that the RIP-rel. correction applies to the generated368// disp field, but _not_ to the target address in the rspec.369370// disp was created by converting the target address minus the pc371// at the start of the instruction. That needs more correction here.372// intptr_t disp = target - next_ip;373assert(inst_mark() != NULL, "must be inside InstructionMark");374address next_ip = pc() + sizeof(int32_t) + rip_relative_correction;375int64_t adjusted = disp;376// Do rip-rel adjustment for 64bit377LP64_ONLY(adjusted -= (next_ip - inst_mark()));378assert(is_simm32(adjusted),379"must be 32bit offset (RIP relative address)");380emit_data((int32_t) adjusted, rspec, disp32_operand);381382} else {383// 32bit never did this, did everything as the rip-rel/disp code above384// [disp] ABSOLUTE385// [00 reg 100][00 100 101] disp32386emit_int8(0x04 | regenc);387emit_int8(0x25);388emit_data(disp, rspec, disp32_operand);389}390}391}392393void Assembler::emit_operand(XMMRegister reg, Register base, Register index,394Address::ScaleFactor scale, int disp,395RelocationHolder const& rspec) {396emit_operand((Register)reg, base, index, scale, disp, rspec);397}398399// Secret local extension to Assembler::WhichOperand:400#define end_pc_operand (_WhichOperand_limit)401402address Assembler::locate_operand(address inst, WhichOperand which) {403// Decode the given instruction, and return the address of404// an embedded 32-bit operand word.405406// If "which" is disp32_operand, selects the displacement portion407// of an effective address specifier.408// If "which" is imm64_operand, selects the trailing immediate constant.409// If "which" is call32_operand, selects the displacement of a call or jump.410// Caller is responsible for ensuring that there is such an operand,411// and that it is 32/64 bits wide.412413// If "which" is end_pc_operand, find the end of the instruction.414415address ip = inst;416bool is_64bit = false;417418debug_only(bool has_disp32 = false);419int tail_size = 0; // other random bytes (#32, #16, etc.) at end of insn420421again_after_prefix:422switch (0xFF & *ip++) {423424// These convenience macros generate groups of "case" labels for the switch.425#define REP4(x) (x)+0: case (x)+1: case (x)+2: case (x)+3426#define REP8(x) (x)+0: case (x)+1: case (x)+2: case (x)+3: \427case (x)+4: case (x)+5: case (x)+6: case (x)+7428#define REP16(x) REP8((x)+0): \429case REP8((x)+8)430431case CS_segment:432case SS_segment:433case DS_segment:434case ES_segment:435case FS_segment:436case GS_segment:437// Seems dubious438LP64_ONLY(assert(false, "shouldn't have that prefix"));439assert(ip == inst+1, "only one prefix allowed");440goto again_after_prefix;441442case 0x67:443case REX:444case REX_B:445case REX_X:446case REX_XB:447case REX_R:448case REX_RB:449case REX_RX:450case REX_RXB:451NOT_LP64(assert(false, "64bit prefixes"));452goto again_after_prefix;453454case REX_W:455case REX_WB:456case REX_WX:457case REX_WXB:458case REX_WR:459case REX_WRB:460case REX_WRX:461case REX_WRXB:462NOT_LP64(assert(false, "64bit prefixes"));463is_64bit = true;464goto again_after_prefix;465466case 0xFF: // pushq a; decl a; incl a; call a; jmp a467case 0x88: // movb a, r468case 0x89: // movl a, r469case 0x8A: // movb r, a470case 0x8B: // movl r, a471case 0x8F: // popl a472debug_only(has_disp32 = true);473break;474475case 0x68: // pushq #32476if (which == end_pc_operand) {477return ip + 4;478}479assert(which == imm_operand && !is_64bit, "pushl has no disp32 or 64bit immediate");480return ip; // not produced by emit_operand481482case 0x66: // movw ... (size prefix)483again_after_size_prefix2:484switch (0xFF & *ip++) {485case REX:486case REX_B:487case REX_X:488case REX_XB:489case REX_R:490case REX_RB:491case REX_RX:492case REX_RXB:493case REX_W:494case REX_WB:495case REX_WX:496case REX_WXB:497case REX_WR:498case REX_WRB:499case REX_WRX:500case REX_WRXB:501NOT_LP64(assert(false, "64bit prefix found"));502goto again_after_size_prefix2;503case 0x8B: // movw r, a504case 0x89: // movw a, r505debug_only(has_disp32 = true);506break;507case 0xC7: // movw a, #16508debug_only(has_disp32 = true);509tail_size = 2; // the imm16510break;511case 0x0F: // several SSE/SSE2 variants512ip--; // reparse the 0x0F513goto again_after_prefix;514default:515ShouldNotReachHere();516}517break;518519case REP8(0xB8): // movl/q r, #32/#64(oop?)520if (which == end_pc_operand) return ip + (is_64bit ? 8 : 4);521// these asserts are somewhat nonsensical522#ifndef _LP64523assert(which == imm_operand || which == disp32_operand,524err_msg("which %d is_64_bit %d ip " INTPTR_FORMAT, which, is_64bit, p2i(ip)));525#else526assert((which == call32_operand || which == imm_operand) && is_64bit ||527which == narrow_oop_operand && !is_64bit,528err_msg("which %d is_64_bit %d ip " INTPTR_FORMAT, which, is_64bit, p2i(ip)));529#endif // _LP64530return ip;531532case 0x69: // imul r, a, #32533case 0xC7: // movl a, #32(oop?)534tail_size = 4;535debug_only(has_disp32 = true); // has both kinds of operands!536break;537538case 0x0F: // movx..., etc.539switch (0xFF & *ip++) {540case 0x3A: // pcmpestri541tail_size = 1;542case 0x38: // ptest, pmovzxbw543ip++; // skip opcode544debug_only(has_disp32 = true); // has both kinds of operands!545break;546547case 0x70: // pshufd r, r/a, #8548debug_only(has_disp32 = true); // has both kinds of operands!549case 0x73: // psrldq r, #8550tail_size = 1;551break;552553case 0x12: // movlps554case 0x28: // movaps555case 0x2E: // ucomiss556case 0x2F: // comiss557case 0x54: // andps558case 0x55: // andnps559case 0x56: // orps560case 0x57: // xorps561case 0x6E: // movd562case 0x7E: // movd563case 0xAE: // ldmxcsr, stmxcsr, fxrstor, fxsave, clflush564debug_only(has_disp32 = true);565break;566567case 0xAD: // shrd r, a, %cl568case 0xAF: // imul r, a569case 0xBE: // movsbl r, a (movsxb)570case 0xBF: // movswl r, a (movsxw)571case 0xB6: // movzbl r, a (movzxb)572case 0xB7: // movzwl r, a (movzxw)573case REP16(0x40): // cmovl cc, r, a574case 0xB0: // cmpxchgb575case 0xB1: // cmpxchg576case 0xC1: // xaddl577case 0xC7: // cmpxchg8578case REP16(0x90): // setcc a579debug_only(has_disp32 = true);580// fall out of the switch to decode the address581break;582583case 0xC4: // pinsrw r, a, #8584debug_only(has_disp32 = true);585case 0xC5: // pextrw r, r, #8586tail_size = 1; // the imm8587break;588589case 0xAC: // shrd r, a, #8590debug_only(has_disp32 = true);591tail_size = 1; // the imm8592break;593594case REP16(0x80): // jcc rdisp32595if (which == end_pc_operand) return ip + 4;596assert(which == call32_operand, "jcc has no disp32 or imm");597return ip;598default:599ShouldNotReachHere();600}601break;602603case 0x81: // addl a, #32; addl r, #32604// also: orl, adcl, sbbl, andl, subl, xorl, cmpl605// on 32bit in the case of cmpl, the imm might be an oop606tail_size = 4;607debug_only(has_disp32 = true); // has both kinds of operands!608break;609610case 0x83: // addl a, #8; addl r, #8611// also: orl, adcl, sbbl, andl, subl, xorl, cmpl612debug_only(has_disp32 = true); // has both kinds of operands!613tail_size = 1;614break;615616case 0x9B:617switch (0xFF & *ip++) {618case 0xD9: // fnstcw a619debug_only(has_disp32 = true);620break;621default:622ShouldNotReachHere();623}624break;625626case REP4(0x00): // addb a, r; addl a, r; addb r, a; addl r, a627case REP4(0x10): // adc...628case REP4(0x20): // and...629case REP4(0x30): // xor...630case REP4(0x08): // or...631case REP4(0x18): // sbb...632case REP4(0x28): // sub...633case 0xF7: // mull a634case 0x8D: // lea r, a635case 0x87: // xchg r, a636case REP4(0x38): // cmp...637case 0x85: // test r, a638debug_only(has_disp32 = true); // has both kinds of operands!639break;640641case 0xC1: // sal a, #8; sar a, #8; shl a, #8; shr a, #8642case 0xC6: // movb a, #8643case 0x80: // cmpb a, #8644case 0x6B: // imul r, a, #8645debug_only(has_disp32 = true); // has both kinds of operands!646tail_size = 1; // the imm8647break;648649case 0xC4: // VEX_3bytes650case 0xC5: // VEX_2bytes651assert((UseAVX > 0), "shouldn't have VEX prefix");652assert(ip == inst+1, "no prefixes allowed");653// C4 and C5 are also used as opcodes for PINSRW and PEXTRW instructions654// but they have prefix 0x0F and processed when 0x0F processed above.655//656// In 32-bit mode the VEX first byte C4 and C5 alias onto LDS and LES657// instructions (these instructions are not supported in 64-bit mode).658// To distinguish them bits [7:6] are set in the VEX second byte since659// ModRM byte can not be of the form 11xxxxxx in 32-bit mode. To set660// those VEX bits REX and vvvv bits are inverted.661//662// Fortunately C2 doesn't generate these instructions so we don't need663// to check for them in product version.664665// Check second byte666NOT_LP64(assert((0xC0 & *ip) == 0xC0, "shouldn't have LDS and LES instructions"));667668// First byte669if ((0xFF & *inst) == VEX_3bytes) {670ip++; // third byte671is_64bit = ((VEX_W & *ip) == VEX_W);672}673ip++; // opcode674// To find the end of instruction (which == end_pc_operand).675switch (0xFF & *ip) {676case 0x61: // pcmpestri r, r/a, #8677case 0x70: // pshufd r, r/a, #8678case 0x73: // psrldq r, #8679tail_size = 1; // the imm8680break;681default:682break;683}684ip++; // skip opcode685debug_only(has_disp32 = true); // has both kinds of operands!686break;687688case 0xD1: // sal a, 1; sar a, 1; shl a, 1; shr a, 1689case 0xD3: // sal a, %cl; sar a, %cl; shl a, %cl; shr a, %cl690case 0xD9: // fld_s a; fst_s a; fstp_s a; fldcw a691case 0xDD: // fld_d a; fst_d a; fstp_d a692case 0xDB: // fild_s a; fistp_s a; fld_x a; fstp_x a693case 0xDF: // fild_d a; fistp_d a694case 0xD8: // fadd_s a; fsubr_s a; fmul_s a; fdivr_s a; fcomp_s a695case 0xDC: // fadd_d a; fsubr_d a; fmul_d a; fdivr_d a; fcomp_d a696case 0xDE: // faddp_d a; fsubrp_d a; fmulp_d a; fdivrp_d a; fcompp_d a697debug_only(has_disp32 = true);698break;699700case 0xE8: // call rdisp32701case 0xE9: // jmp rdisp32702if (which == end_pc_operand) return ip + 4;703assert(which == call32_operand, "call has no disp32 or imm");704return ip;705706case 0xF0: // Lock707assert(os::is_MP(), "only on MP");708goto again_after_prefix;709710case 0xF3: // For SSE711case 0xF2: // For SSE2712switch (0xFF & *ip++) {713case REX:714case REX_B:715case REX_X:716case REX_XB:717case REX_R:718case REX_RB:719case REX_RX:720case REX_RXB:721case REX_W:722case REX_WB:723case REX_WX:724case REX_WXB:725case REX_WR:726case REX_WRB:727case REX_WRX:728case REX_WRXB:729NOT_LP64(assert(false, "found 64bit prefix"));730ip++;731default:732ip++;733}734debug_only(has_disp32 = true); // has both kinds of operands!735break;736737default:738ShouldNotReachHere();739740#undef REP8741#undef REP16742}743744assert(which != call32_operand, "instruction is not a call, jmp, or jcc");745#ifdef _LP64746assert(which != imm_operand, "instruction is not a movq reg, imm64");747#else748// assert(which != imm_operand || has_imm32, "instruction has no imm32 field");749assert(which != imm_operand || has_disp32, "instruction has no imm32 field");750#endif // LP64751assert(which != disp32_operand || has_disp32, "instruction has no disp32 field");752753// parse the output of emit_operand754int op2 = 0xFF & *ip++;755int base = op2 & 0x07;756int op3 = -1;757const int b100 = 4;758const int b101 = 5;759if (base == b100 && (op2 >> 6) != 3) {760op3 = 0xFF & *ip++;761base = op3 & 0x07; // refetch the base762}763// now ip points at the disp (if any)764765switch (op2 >> 6) {766case 0:767// [00 reg 100][ss index base]768// [00 reg 100][00 100 esp]769// [00 reg base]770// [00 reg 100][ss index 101][disp32]771// [00 reg 101] [disp32]772773if (base == b101) {774if (which == disp32_operand)775return ip; // caller wants the disp32776ip += 4; // skip the disp32777}778break;779780case 1:781// [01 reg 100][ss index base][disp8]782// [01 reg 100][00 100 esp][disp8]783// [01 reg base] [disp8]784ip += 1; // skip the disp8785break;786787case 2:788// [10 reg 100][ss index base][disp32]789// [10 reg 100][00 100 esp][disp32]790// [10 reg base] [disp32]791if (which == disp32_operand)792return ip; // caller wants the disp32793ip += 4; // skip the disp32794break;795796case 3:797// [11 reg base] (not a memory addressing mode)798break;799}800801if (which == end_pc_operand) {802return ip + tail_size;803}804805#ifdef _LP64806assert(which == narrow_oop_operand && !is_64bit, "instruction is not a movl adr, imm32");807#else808assert(which == imm_operand, "instruction has only an imm field");809#endif // LP64810return ip;811}812813address Assembler::locate_next_instruction(address inst) {814// Secretly share code with locate_operand:815return locate_operand(inst, end_pc_operand);816}817818819#ifdef ASSERT820void Assembler::check_relocation(RelocationHolder const& rspec, int format) {821address inst = inst_mark();822assert(inst != NULL && inst < pc(), "must point to beginning of instruction");823address opnd;824825Relocation* r = rspec.reloc();826if (r->type() == relocInfo::none) {827return;828} else if (r->is_call() || format == call32_operand) {829// assert(format == imm32_operand, "cannot specify a nonzero format");830opnd = locate_operand(inst, call32_operand);831} else if (r->is_data()) {832assert(format == imm_operand || format == disp32_operand833LP64_ONLY(|| format == narrow_oop_operand), "format ok");834opnd = locate_operand(inst, (WhichOperand)format);835} else {836assert(format == imm_operand, "cannot specify a format");837return;838}839assert(opnd == pc(), "must put operand where relocs can find it");840}841#endif // ASSERT842843void Assembler::emit_operand32(Register reg, Address adr) {844assert(reg->encoding() < 8, "no extended registers");845assert(!adr.base_needs_rex() && !adr.index_needs_rex(), "no extended registers");846emit_operand(reg, adr._base, adr._index, adr._scale, adr._disp,847adr._rspec);848}849850void Assembler::emit_operand(Register reg, Address adr,851int rip_relative_correction) {852emit_operand(reg, adr._base, adr._index, adr._scale, adr._disp,853adr._rspec,854rip_relative_correction);855}856857void Assembler::emit_operand(XMMRegister reg, Address adr) {858emit_operand(reg, adr._base, adr._index, adr._scale, adr._disp,859adr._rspec);860}861862// MMX operations863void Assembler::emit_operand(MMXRegister reg, Address adr) {864assert(!adr.base_needs_rex() && !adr.index_needs_rex(), "no extended registers");865emit_operand((Register)reg, adr._base, adr._index, adr._scale, adr._disp, adr._rspec);866}867868// work around gcc (3.2.1-7a) bug869void Assembler::emit_operand(Address adr, MMXRegister reg) {870assert(!adr.base_needs_rex() && !adr.index_needs_rex(), "no extended registers");871emit_operand((Register)reg, adr._base, adr._index, adr._scale, adr._disp, adr._rspec);872}873874875void Assembler::emit_farith(int b1, int b2, int i) {876assert(isByte(b1) && isByte(b2), "wrong opcode");877assert(0 <= i && i < 8, "illegal stack offset");878emit_int8(b1);879emit_int8(b2 + i);880}881882883// Now the Assembler instructions (identical for 32/64 bits)884885void Assembler::adcl(Address dst, int32_t imm32) {886InstructionMark im(this);887prefix(dst);888emit_arith_operand(0x81, rdx, dst, imm32);889}890891void Assembler::adcl(Address dst, Register src) {892InstructionMark im(this);893prefix(dst, src);894emit_int8(0x11);895emit_operand(src, dst);896}897898void Assembler::adcl(Register dst, int32_t imm32) {899prefix(dst);900emit_arith(0x81, 0xD0, dst, imm32);901}902903void Assembler::adcl(Register dst, Address src) {904InstructionMark im(this);905prefix(src, dst);906emit_int8(0x13);907emit_operand(dst, src);908}909910void Assembler::adcl(Register dst, Register src) {911(void) prefix_and_encode(dst->encoding(), src->encoding());912emit_arith(0x13, 0xC0, dst, src);913}914915void Assembler::addl(Address dst, int32_t imm32) {916InstructionMark im(this);917prefix(dst);918emit_arith_operand(0x81, rax, dst, imm32);919}920921void Assembler::addl(Address dst, Register src) {922InstructionMark im(this);923prefix(dst, src);924emit_int8(0x01);925emit_operand(src, dst);926}927928void Assembler::addl(Register dst, int32_t imm32) {929prefix(dst);930emit_arith(0x81, 0xC0, dst, imm32);931}932933void Assembler::addl(Register dst, Address src) {934InstructionMark im(this);935prefix(src, dst);936emit_int8(0x03);937emit_operand(dst, src);938}939940void Assembler::addl(Register dst, Register src) {941(void) prefix_and_encode(dst->encoding(), src->encoding());942emit_arith(0x03, 0xC0, dst, src);943}944945void Assembler::addr_nop_4() {946assert(UseAddressNop, "no CPU support");947// 4 bytes: NOP DWORD PTR [EAX+0]948emit_int8(0x0F);949emit_int8(0x1F);950emit_int8(0x40); // emit_rm(cbuf, 0x1, EAX_enc, EAX_enc);951emit_int8(0); // 8-bits offset (1 byte)952}953954void Assembler::addr_nop_5() {955assert(UseAddressNop, "no CPU support");956// 5 bytes: NOP DWORD PTR [EAX+EAX*0+0] 8-bits offset957emit_int8(0x0F);958emit_int8(0x1F);959emit_int8(0x44); // emit_rm(cbuf, 0x1, EAX_enc, 0x4);960emit_int8(0x00); // emit_rm(cbuf, 0x0, EAX_enc, EAX_enc);961emit_int8(0); // 8-bits offset (1 byte)962}963964void Assembler::addr_nop_7() {965assert(UseAddressNop, "no CPU support");966// 7 bytes: NOP DWORD PTR [EAX+0] 32-bits offset967emit_int8(0x0F);968emit_int8(0x1F);969emit_int8((unsigned char)0x80);970// emit_rm(cbuf, 0x2, EAX_enc, EAX_enc);971emit_int32(0); // 32-bits offset (4 bytes)972}973974void Assembler::addr_nop_8() {975assert(UseAddressNop, "no CPU support");976// 8 bytes: NOP DWORD PTR [EAX+EAX*0+0] 32-bits offset977emit_int8(0x0F);978emit_int8(0x1F);979emit_int8((unsigned char)0x84);980// emit_rm(cbuf, 0x2, EAX_enc, 0x4);981emit_int8(0x00); // emit_rm(cbuf, 0x0, EAX_enc, EAX_enc);982emit_int32(0); // 32-bits offset (4 bytes)983}984985void Assembler::addsd(XMMRegister dst, XMMRegister src) {986NOT_LP64(assert(VM_Version::supports_sse2(), ""));987emit_simd_arith(0x58, dst, src, VEX_SIMD_F2);988}989990void Assembler::addsd(XMMRegister dst, Address src) {991NOT_LP64(assert(VM_Version::supports_sse2(), ""));992emit_simd_arith(0x58, dst, src, VEX_SIMD_F2);993}994995void Assembler::addss(XMMRegister dst, XMMRegister src) {996NOT_LP64(assert(VM_Version::supports_sse(), ""));997emit_simd_arith(0x58, dst, src, VEX_SIMD_F3);998}9991000void Assembler::addss(XMMRegister dst, Address src) {1001NOT_LP64(assert(VM_Version::supports_sse(), ""));1002emit_simd_arith(0x58, dst, src, VEX_SIMD_F3);1003}10041005void Assembler::aesdec(XMMRegister dst, Address src) {1006assert(VM_Version::supports_aes(), "");1007InstructionMark im(this);1008simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38);1009emit_int8((unsigned char)0xDE);1010emit_operand(dst, src);1011}10121013void Assembler::aesdec(XMMRegister dst, XMMRegister src) {1014assert(VM_Version::supports_aes(), "");1015int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38);1016emit_int8((unsigned char)0xDE);1017emit_int8(0xC0 | encode);1018}10191020void Assembler::aesdeclast(XMMRegister dst, Address src) {1021assert(VM_Version::supports_aes(), "");1022InstructionMark im(this);1023simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38);1024emit_int8((unsigned char)0xDF);1025emit_operand(dst, src);1026}10271028void Assembler::aesdeclast(XMMRegister dst, XMMRegister src) {1029assert(VM_Version::supports_aes(), "");1030int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38);1031emit_int8((unsigned char)0xDF);1032emit_int8((unsigned char)(0xC0 | encode));1033}10341035void Assembler::aesenc(XMMRegister dst, Address src) {1036assert(VM_Version::supports_aes(), "");1037InstructionMark im(this);1038simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38);1039emit_int8((unsigned char)0xDC);1040emit_operand(dst, src);1041}10421043void Assembler::aesenc(XMMRegister dst, XMMRegister src) {1044assert(VM_Version::supports_aes(), "");1045int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38);1046emit_int8((unsigned char)0xDC);1047emit_int8(0xC0 | encode);1048}10491050void Assembler::aesenclast(XMMRegister dst, Address src) {1051assert(VM_Version::supports_aes(), "");1052InstructionMark im(this);1053simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38);1054emit_int8((unsigned char)0xDD);1055emit_operand(dst, src);1056}10571058void Assembler::aesenclast(XMMRegister dst, XMMRegister src) {1059assert(VM_Version::supports_aes(), "");1060int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38);1061emit_int8((unsigned char)0xDD);1062emit_int8((unsigned char)(0xC0 | encode));1063}106410651066void Assembler::andl(Address dst, int32_t imm32) {1067InstructionMark im(this);1068prefix(dst);1069emit_int8((unsigned char)0x81);1070emit_operand(rsp, dst, 4);1071emit_int32(imm32);1072}10731074void Assembler::andl(Register dst, int32_t imm32) {1075prefix(dst);1076emit_arith(0x81, 0xE0, dst, imm32);1077}10781079void Assembler::andl(Register dst, Address src) {1080InstructionMark im(this);1081prefix(src, dst);1082emit_int8(0x23);1083emit_operand(dst, src);1084}10851086void Assembler::andl(Register dst, Register src) {1087(void) prefix_and_encode(dst->encoding(), src->encoding());1088emit_arith(0x23, 0xC0, dst, src);1089}10901091void Assembler::andnl(Register dst, Register src1, Register src2) {1092assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");1093int encode = vex_prefix_0F38_and_encode(dst, src1, src2);1094emit_int8((unsigned char)0xF2);1095emit_int8((unsigned char)(0xC0 | encode));1096}10971098void Assembler::andnl(Register dst, Register src1, Address src2) {1099InstructionMark im(this);1100assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");1101vex_prefix_0F38(dst, src1, src2);1102emit_int8((unsigned char)0xF2);1103emit_operand(dst, src2);1104}11051106void Assembler::bsfl(Register dst, Register src) {1107int encode = prefix_and_encode(dst->encoding(), src->encoding());1108emit_int8(0x0F);1109emit_int8((unsigned char)0xBC);1110emit_int8((unsigned char)(0xC0 | encode));1111}11121113void Assembler::bsrl(Register dst, Register src) {1114int encode = prefix_and_encode(dst->encoding(), src->encoding());1115emit_int8(0x0F);1116emit_int8((unsigned char)0xBD);1117emit_int8((unsigned char)(0xC0 | encode));1118}11191120void Assembler::bswapl(Register reg) { // bswap1121int encode = prefix_and_encode(reg->encoding());1122emit_int8(0x0F);1123emit_int8((unsigned char)(0xC8 | encode));1124}11251126void Assembler::blsil(Register dst, Register src) {1127assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");1128int encode = vex_prefix_0F38_and_encode(rbx, dst, src);1129emit_int8((unsigned char)0xF3);1130emit_int8((unsigned char)(0xC0 | encode));1131}11321133void Assembler::blsil(Register dst, Address src) {1134InstructionMark im(this);1135assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");1136vex_prefix_0F38(rbx, dst, src);1137emit_int8((unsigned char)0xF3);1138emit_operand(rbx, src);1139}11401141void Assembler::blsmskl(Register dst, Register src) {1142assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");1143int encode = vex_prefix_0F38_and_encode(rdx, dst, src);1144emit_int8((unsigned char)0xF3);1145emit_int8((unsigned char)(0xC0 | encode));1146}11471148void Assembler::blsmskl(Register dst, Address src) {1149InstructionMark im(this);1150assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");1151vex_prefix_0F38(rdx, dst, src);1152emit_int8((unsigned char)0xF3);1153emit_operand(rdx, src);1154}11551156void Assembler::blsrl(Register dst, Register src) {1157assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");1158int encode = vex_prefix_0F38_and_encode(rcx, dst, src);1159emit_int8((unsigned char)0xF3);1160emit_int8((unsigned char)(0xC0 | encode));1161}11621163void Assembler::blsrl(Register dst, Address src) {1164InstructionMark im(this);1165assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");1166vex_prefix_0F38(rcx, dst, src);1167emit_int8((unsigned char)0xF3);1168emit_operand(rcx, src);1169}11701171void Assembler::call(Label& L, relocInfo::relocType rtype) {1172// suspect disp32 is always good1173int operand = LP64_ONLY(disp32_operand) NOT_LP64(imm_operand);11741175if (L.is_bound()) {1176const int long_size = 5;1177int offs = (int)( target(L) - pc() );1178assert(offs <= 0, "assembler error");1179InstructionMark im(this);1180// 1110 1000 #32-bit disp1181emit_int8((unsigned char)0xE8);1182emit_data(offs - long_size, rtype, operand);1183} else {1184InstructionMark im(this);1185// 1110 1000 #32-bit disp1186L.add_patch_at(code(), locator());11871188emit_int8((unsigned char)0xE8);1189emit_data(int(0), rtype, operand);1190}1191}11921193void Assembler::call(Register dst) {1194int encode = prefix_and_encode(dst->encoding());1195emit_int8((unsigned char)0xFF);1196emit_int8((unsigned char)(0xD0 | encode));1197}119811991200void Assembler::call(Address adr) {1201InstructionMark im(this);1202prefix(adr);1203emit_int8((unsigned char)0xFF);1204emit_operand(rdx, adr);1205}12061207void Assembler::call_literal(address entry, RelocationHolder const& rspec) {1208assert(entry != NULL, "call most probably wrong");1209InstructionMark im(this);1210emit_int8((unsigned char)0xE8);1211intptr_t disp = entry - (pc() + sizeof(int32_t));1212assert(is_simm32(disp), "must be 32bit offset (call2)");1213// Technically, should use call32_operand, but this format is1214// implied by the fact that we're emitting a call instruction.12151216int operand = LP64_ONLY(disp32_operand) NOT_LP64(call32_operand);1217emit_data((int) disp, rspec, operand);1218}12191220void Assembler::cdql() {1221emit_int8((unsigned char)0x99);1222}12231224void Assembler::cld() {1225emit_int8((unsigned char)0xFC);1226}12271228void Assembler::cmovl(Condition cc, Register dst, Register src) {1229NOT_LP64(guarantee(VM_Version::supports_cmov(), "illegal instruction"));1230int encode = prefix_and_encode(dst->encoding(), src->encoding());1231emit_int8(0x0F);1232emit_int8(0x40 | cc);1233emit_int8((unsigned char)(0xC0 | encode));1234}123512361237void Assembler::cmovl(Condition cc, Register dst, Address src) {1238NOT_LP64(guarantee(VM_Version::supports_cmov(), "illegal instruction"));1239prefix(src, dst);1240emit_int8(0x0F);1241emit_int8(0x40 | cc);1242emit_operand(dst, src);1243}12441245void Assembler::cmpb(Address dst, int imm8) {1246InstructionMark im(this);1247prefix(dst);1248emit_int8((unsigned char)0x80);1249emit_operand(rdi, dst, 1);1250emit_int8(imm8);1251}12521253void Assembler::cmpl(Address dst, int32_t imm32) {1254InstructionMark im(this);1255prefix(dst);1256emit_int8((unsigned char)0x81);1257emit_operand(rdi, dst, 4);1258emit_int32(imm32);1259}12601261void Assembler::cmpl(Register dst, int32_t imm32) {1262prefix(dst);1263emit_arith(0x81, 0xF8, dst, imm32);1264}12651266void Assembler::cmpl(Register dst, Register src) {1267(void) prefix_and_encode(dst->encoding(), src->encoding());1268emit_arith(0x3B, 0xC0, dst, src);1269}127012711272void Assembler::cmpl(Register dst, Address src) {1273InstructionMark im(this);1274prefix(src, dst);1275emit_int8((unsigned char)0x3B);1276emit_operand(dst, src);1277}12781279void Assembler::cmpw(Address dst, int imm16) {1280InstructionMark im(this);1281assert(!dst.base_needs_rex() && !dst.index_needs_rex(), "no extended registers");1282emit_int8(0x66);1283emit_int8((unsigned char)0x81);1284emit_operand(rdi, dst, 2);1285emit_int16(imm16);1286}12871288// The 32-bit cmpxchg compares the value at adr with the contents of rax,1289// and stores reg into adr if so; otherwise, the value at adr is loaded into rax,.1290// The ZF is set if the compared values were equal, and cleared otherwise.1291void Assembler::cmpxchgl(Register reg, Address adr) { // cmpxchg1292InstructionMark im(this);1293prefix(adr, reg);1294emit_int8(0x0F);1295emit_int8((unsigned char)0xB1);1296emit_operand(reg, adr);1297}12981299void Assembler::comisd(XMMRegister dst, Address src) {1300// NOTE: dbx seems to decode this as comiss even though the1301// 0x66 is there. Strangly ucomisd comes out correct1302NOT_LP64(assert(VM_Version::supports_sse2(), ""));1303emit_simd_arith_nonds(0x2F, dst, src, VEX_SIMD_66);1304}13051306void Assembler::comisd(XMMRegister dst, XMMRegister src) {1307NOT_LP64(assert(VM_Version::supports_sse2(), ""));1308emit_simd_arith_nonds(0x2F, dst, src, VEX_SIMD_66);1309}13101311void Assembler::comiss(XMMRegister dst, Address src) {1312NOT_LP64(assert(VM_Version::supports_sse(), ""));1313emit_simd_arith_nonds(0x2F, dst, src, VEX_SIMD_NONE);1314}13151316void Assembler::comiss(XMMRegister dst, XMMRegister src) {1317NOT_LP64(assert(VM_Version::supports_sse(), ""));1318emit_simd_arith_nonds(0x2F, dst, src, VEX_SIMD_NONE);1319}13201321void Assembler::cpuid() {1322emit_int8(0x0F);1323emit_int8((unsigned char)0xA2);1324}13251326void Assembler::cvtdq2pd(XMMRegister dst, XMMRegister src) {1327NOT_LP64(assert(VM_Version::supports_sse2(), ""));1328emit_simd_arith_nonds(0xE6, dst, src, VEX_SIMD_F3);1329}13301331void Assembler::cvtdq2ps(XMMRegister dst, XMMRegister src) {1332NOT_LP64(assert(VM_Version::supports_sse2(), ""));1333emit_simd_arith_nonds(0x5B, dst, src, VEX_SIMD_NONE);1334}13351336void Assembler::cvtsd2ss(XMMRegister dst, XMMRegister src) {1337NOT_LP64(assert(VM_Version::supports_sse2(), ""));1338emit_simd_arith(0x5A, dst, src, VEX_SIMD_F2);1339}13401341void Assembler::cvtsd2ss(XMMRegister dst, Address src) {1342NOT_LP64(assert(VM_Version::supports_sse2(), ""));1343emit_simd_arith(0x5A, dst, src, VEX_SIMD_F2);1344}13451346void Assembler::cvtsi2sdl(XMMRegister dst, Register src) {1347NOT_LP64(assert(VM_Version::supports_sse2(), ""));1348int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F2);1349emit_int8(0x2A);1350emit_int8((unsigned char)(0xC0 | encode));1351}13521353void Assembler::cvtsi2sdl(XMMRegister dst, Address src) {1354NOT_LP64(assert(VM_Version::supports_sse2(), ""));1355emit_simd_arith(0x2A, dst, src, VEX_SIMD_F2);1356}13571358void Assembler::cvtsi2ssl(XMMRegister dst, Register src) {1359NOT_LP64(assert(VM_Version::supports_sse(), ""));1360int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_F3);1361emit_int8(0x2A);1362emit_int8((unsigned char)(0xC0 | encode));1363}13641365void Assembler::cvtsi2ssl(XMMRegister dst, Address src) {1366NOT_LP64(assert(VM_Version::supports_sse(), ""));1367emit_simd_arith(0x2A, dst, src, VEX_SIMD_F3);1368}13691370void Assembler::cvtss2sd(XMMRegister dst, XMMRegister src) {1371NOT_LP64(assert(VM_Version::supports_sse2(), ""));1372emit_simd_arith(0x5A, dst, src, VEX_SIMD_F3);1373}13741375void Assembler::cvtss2sd(XMMRegister dst, Address src) {1376NOT_LP64(assert(VM_Version::supports_sse2(), ""));1377emit_simd_arith(0x5A, dst, src, VEX_SIMD_F3);1378}137913801381void Assembler::cvttsd2sil(Register dst, XMMRegister src) {1382NOT_LP64(assert(VM_Version::supports_sse2(), ""));1383int encode = simd_prefix_and_encode(dst, src, VEX_SIMD_F2);1384emit_int8(0x2C);1385emit_int8((unsigned char)(0xC0 | encode));1386}13871388void Assembler::cvttss2sil(Register dst, XMMRegister src) {1389NOT_LP64(assert(VM_Version::supports_sse(), ""));1390int encode = simd_prefix_and_encode(dst, src, VEX_SIMD_F3);1391emit_int8(0x2C);1392emit_int8((unsigned char)(0xC0 | encode));1393}13941395void Assembler::decl(Address dst) {1396// Don't use it directly. Use MacroAssembler::decrement() instead.1397InstructionMark im(this);1398prefix(dst);1399emit_int8((unsigned char)0xFF);1400emit_operand(rcx, dst);1401}14021403void Assembler::divsd(XMMRegister dst, Address src) {1404NOT_LP64(assert(VM_Version::supports_sse2(), ""));1405emit_simd_arith(0x5E, dst, src, VEX_SIMD_F2);1406}14071408void Assembler::divsd(XMMRegister dst, XMMRegister src) {1409NOT_LP64(assert(VM_Version::supports_sse2(), ""));1410emit_simd_arith(0x5E, dst, src, VEX_SIMD_F2);1411}14121413void Assembler::divss(XMMRegister dst, Address src) {1414NOT_LP64(assert(VM_Version::supports_sse(), ""));1415emit_simd_arith(0x5E, dst, src, VEX_SIMD_F3);1416}14171418void Assembler::divss(XMMRegister dst, XMMRegister src) {1419NOT_LP64(assert(VM_Version::supports_sse(), ""));1420emit_simd_arith(0x5E, dst, src, VEX_SIMD_F3);1421}14221423void Assembler::emms() {1424NOT_LP64(assert(VM_Version::supports_mmx(), ""));1425emit_int8(0x0F);1426emit_int8(0x77);1427}14281429void Assembler::hlt() {1430emit_int8((unsigned char)0xF4);1431}14321433void Assembler::idivl(Register src) {1434int encode = prefix_and_encode(src->encoding());1435emit_int8((unsigned char)0xF7);1436emit_int8((unsigned char)(0xF8 | encode));1437}14381439void Assembler::divl(Register src) { // Unsigned1440int encode = prefix_and_encode(src->encoding());1441emit_int8((unsigned char)0xF7);1442emit_int8((unsigned char)(0xF0 | encode));1443}14441445void Assembler::imull(Register dst, Register src) {1446int encode = prefix_and_encode(dst->encoding(), src->encoding());1447emit_int8(0x0F);1448emit_int8((unsigned char)0xAF);1449emit_int8((unsigned char)(0xC0 | encode));1450}145114521453void Assembler::imull(Register dst, Register src, int value) {1454int encode = prefix_and_encode(dst->encoding(), src->encoding());1455if (is8bit(value)) {1456emit_int8(0x6B);1457emit_int8((unsigned char)(0xC0 | encode));1458emit_int8(value & 0xFF);1459} else {1460emit_int8(0x69);1461emit_int8((unsigned char)(0xC0 | encode));1462emit_int32(value);1463}1464}14651466void Assembler::imull(Register dst, Address src) {1467InstructionMark im(this);1468prefix(src, dst);1469emit_int8(0x0F);1470emit_int8((unsigned char) 0xAF);1471emit_operand(dst, src);1472}147314741475void Assembler::incl(Address dst) {1476// Don't use it directly. Use MacroAssembler::increment() instead.1477InstructionMark im(this);1478prefix(dst);1479emit_int8((unsigned char)0xFF);1480emit_operand(rax, dst);1481}14821483void Assembler::jcc(Condition cc, Label& L, bool maybe_short) {1484InstructionMark im(this);1485assert((0 <= cc) && (cc < 16), "illegal cc");1486if (L.is_bound()) {1487address dst = target(L);1488assert(dst != NULL, "jcc most probably wrong");14891490const int short_size = 2;1491const int long_size = 6;1492intptr_t offs = (intptr_t)dst - (intptr_t)pc();1493if (maybe_short && is8bit(offs - short_size)) {1494// 0111 tttn #8-bit disp1495emit_int8(0x70 | cc);1496emit_int8((offs - short_size) & 0xFF);1497} else {1498// 0000 1111 1000 tttn #32-bit disp1499assert(is_simm32(offs - long_size),1500"must be 32bit offset (call4)");1501emit_int8(0x0F);1502emit_int8((unsigned char)(0x80 | cc));1503emit_int32(offs - long_size);1504}1505} else {1506// Note: could eliminate cond. jumps to this jump if condition1507// is the same however, seems to be rather unlikely case.1508// Note: use jccb() if label to be bound is very close to get1509// an 8-bit displacement1510L.add_patch_at(code(), locator());1511emit_int8(0x0F);1512emit_int8((unsigned char)(0x80 | cc));1513emit_int32(0);1514}1515}15161517void Assembler::jccb(Condition cc, Label& L) {1518if (L.is_bound()) {1519const int short_size = 2;1520address entry = target(L);1521#ifdef ASSERT1522intptr_t dist = (intptr_t)entry - ((intptr_t)pc() + short_size);1523intptr_t delta = short_branch_delta();1524if (delta != 0) {1525dist += (dist < 0 ? (-delta) :delta);1526}1527assert(is8bit(dist), "Dispacement too large for a short jmp");1528#endif1529intptr_t offs = (intptr_t)entry - (intptr_t)pc();1530// 0111 tttn #8-bit disp1531emit_int8(0x70 | cc);1532emit_int8((offs - short_size) & 0xFF);1533} else {1534InstructionMark im(this);1535L.add_patch_at(code(), locator());1536emit_int8(0x70 | cc);1537emit_int8(0);1538}1539}15401541void Assembler::jmp(Address adr) {1542InstructionMark im(this);1543prefix(adr);1544emit_int8((unsigned char)0xFF);1545emit_operand(rsp, adr);1546}15471548void Assembler::jmp(Label& L, bool maybe_short) {1549if (L.is_bound()) {1550address entry = target(L);1551assert(entry != NULL, "jmp most probably wrong");1552InstructionMark im(this);1553const int short_size = 2;1554const int long_size = 5;1555intptr_t offs = entry - pc();1556if (maybe_short && is8bit(offs - short_size)) {1557emit_int8((unsigned char)0xEB);1558emit_int8((offs - short_size) & 0xFF);1559} else {1560emit_int8((unsigned char)0xE9);1561emit_int32(offs - long_size);1562}1563} else {1564// By default, forward jumps are always 32-bit displacements, since1565// we can't yet know where the label will be bound. If you're sure that1566// the forward jump will not run beyond 256 bytes, use jmpb to1567// force an 8-bit displacement.1568InstructionMark im(this);1569L.add_patch_at(code(), locator());1570emit_int8((unsigned char)0xE9);1571emit_int32(0);1572}1573}15741575void Assembler::jmp(Register entry) {1576int encode = prefix_and_encode(entry->encoding());1577emit_int8((unsigned char)0xFF);1578emit_int8((unsigned char)(0xE0 | encode));1579}15801581void Assembler::jmp_literal(address dest, RelocationHolder const& rspec) {1582InstructionMark im(this);1583emit_int8((unsigned char)0xE9);1584assert(dest != NULL, "must have a target");1585intptr_t disp = dest - (pc() + sizeof(int32_t));1586assert(is_simm32(disp), "must be 32bit offset (jmp)");1587emit_data(disp, rspec.reloc(), call32_operand);1588}15891590void Assembler::jmpb(Label& L) {1591if (L.is_bound()) {1592const int short_size = 2;1593address entry = target(L);1594assert(entry != NULL, "jmp most probably wrong");1595#ifdef ASSERT1596intptr_t dist = (intptr_t)entry - ((intptr_t)pc() + short_size);1597intptr_t delta = short_branch_delta();1598if (delta != 0) {1599dist += (dist < 0 ? (-delta) :delta);1600}1601assert(is8bit(dist), "Dispacement too large for a short jmp");1602#endif1603intptr_t offs = entry - pc();1604emit_int8((unsigned char)0xEB);1605emit_int8((offs - short_size) & 0xFF);1606} else {1607InstructionMark im(this);1608L.add_patch_at(code(), locator());1609emit_int8((unsigned char)0xEB);1610emit_int8(0);1611}1612}16131614void Assembler::ldmxcsr( Address src) {1615NOT_LP64(assert(VM_Version::supports_sse(), ""));1616InstructionMark im(this);1617prefix(src);1618emit_int8(0x0F);1619emit_int8((unsigned char)0xAE);1620emit_operand(as_Register(2), src);1621}16221623void Assembler::leal(Register dst, Address src) {1624InstructionMark im(this);1625#ifdef _LP641626emit_int8(0x67); // addr321627prefix(src, dst);1628#endif // LP641629emit_int8((unsigned char)0x8D);1630emit_operand(dst, src);1631}16321633void Assembler::lfence() {1634emit_int8(0x0F);1635emit_int8((unsigned char)0xAE);1636emit_int8((unsigned char)0xE8);1637}16381639void Assembler::lock() {1640emit_int8((unsigned char)0xF0);1641}16421643void Assembler::lzcntl(Register dst, Register src) {1644assert(VM_Version::supports_lzcnt(), "encoding is treated as BSR");1645emit_int8((unsigned char)0xF3);1646int encode = prefix_and_encode(dst->encoding(), src->encoding());1647emit_int8(0x0F);1648emit_int8((unsigned char)0xBD);1649emit_int8((unsigned char)(0xC0 | encode));1650}16511652// Emit mfence instruction1653void Assembler::mfence() {1654NOT_LP64(assert(VM_Version::supports_sse2(), "unsupported");)1655emit_int8(0x0F);1656emit_int8((unsigned char)0xAE);1657emit_int8((unsigned char)0xF0);1658}16591660void Assembler::mov(Register dst, Register src) {1661LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));1662}16631664void Assembler::movapd(XMMRegister dst, XMMRegister src) {1665NOT_LP64(assert(VM_Version::supports_sse2(), ""));1666emit_simd_arith_nonds(0x28, dst, src, VEX_SIMD_66);1667}16681669void Assembler::movaps(XMMRegister dst, XMMRegister src) {1670NOT_LP64(assert(VM_Version::supports_sse(), ""));1671emit_simd_arith_nonds(0x28, dst, src, VEX_SIMD_NONE);1672}16731674void Assembler::movlhps(XMMRegister dst, XMMRegister src) {1675NOT_LP64(assert(VM_Version::supports_sse(), ""));1676int encode = simd_prefix_and_encode(dst, src, src, VEX_SIMD_NONE);1677emit_int8(0x16);1678emit_int8((unsigned char)(0xC0 | encode));1679}16801681void Assembler::movb(Register dst, Address src) {1682NOT_LP64(assert(dst->has_byte_register(), "must have byte register"));1683InstructionMark im(this);1684prefix(src, dst, true);1685emit_int8((unsigned char)0x8A);1686emit_operand(dst, src);1687}168816891690void Assembler::movb(Address dst, int imm8) {1691InstructionMark im(this);1692prefix(dst);1693emit_int8((unsigned char)0xC6);1694emit_operand(rax, dst, 1);1695emit_int8(imm8);1696}169716981699void Assembler::movb(Address dst, Register src) {1700assert(src->has_byte_register(), "must have byte register");1701InstructionMark im(this);1702prefix(dst, src, true);1703emit_int8((unsigned char)0x88);1704emit_operand(src, dst);1705}17061707void Assembler::movdl(XMMRegister dst, Register src) {1708NOT_LP64(assert(VM_Version::supports_sse2(), ""));1709int encode = simd_prefix_and_encode(dst, src, VEX_SIMD_66);1710emit_int8(0x6E);1711emit_int8((unsigned char)(0xC0 | encode));1712}17131714void Assembler::movdl(Register dst, XMMRegister src) {1715NOT_LP64(assert(VM_Version::supports_sse2(), ""));1716// swap src/dst to get correct prefix1717int encode = simd_prefix_and_encode(src, dst, VEX_SIMD_66);1718emit_int8(0x7E);1719emit_int8((unsigned char)(0xC0 | encode));1720}17211722void Assembler::movdl(XMMRegister dst, Address src) {1723NOT_LP64(assert(VM_Version::supports_sse2(), ""));1724InstructionMark im(this);1725simd_prefix(dst, src, VEX_SIMD_66);1726emit_int8(0x6E);1727emit_operand(dst, src);1728}17291730void Assembler::movdl(Address dst, XMMRegister src) {1731NOT_LP64(assert(VM_Version::supports_sse2(), ""));1732InstructionMark im(this);1733simd_prefix(dst, src, VEX_SIMD_66);1734emit_int8(0x7E);1735emit_operand(src, dst);1736}17371738void Assembler::movdqa(XMMRegister dst, XMMRegister src) {1739NOT_LP64(assert(VM_Version::supports_sse2(), ""));1740emit_simd_arith_nonds(0x6F, dst, src, VEX_SIMD_66);1741}17421743void Assembler::movdqa(XMMRegister dst, Address src) {1744NOT_LP64(assert(VM_Version::supports_sse2(), ""));1745emit_simd_arith_nonds(0x6F, dst, src, VEX_SIMD_66);1746}17471748void Assembler::movdqu(XMMRegister dst, Address src) {1749NOT_LP64(assert(VM_Version::supports_sse2(), ""));1750emit_simd_arith_nonds(0x6F, dst, src, VEX_SIMD_F3);1751}17521753void Assembler::movdqu(XMMRegister dst, XMMRegister src) {1754NOT_LP64(assert(VM_Version::supports_sse2(), ""));1755emit_simd_arith_nonds(0x6F, dst, src, VEX_SIMD_F3);1756}17571758void Assembler::movdqu(Address dst, XMMRegister src) {1759NOT_LP64(assert(VM_Version::supports_sse2(), ""));1760InstructionMark im(this);1761simd_prefix(dst, src, VEX_SIMD_F3);1762emit_int8(0x7F);1763emit_operand(src, dst);1764}17651766// Move Unaligned 256bit Vector1767void Assembler::vmovdqu(XMMRegister dst, XMMRegister src) {1768assert(UseAVX > 0, "");1769bool vector256 = true;1770int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_F3, vector256);1771emit_int8(0x6F);1772emit_int8((unsigned char)(0xC0 | encode));1773}17741775void Assembler::vmovdqu(XMMRegister dst, Address src) {1776assert(UseAVX > 0, "");1777InstructionMark im(this);1778bool vector256 = true;1779vex_prefix(dst, xnoreg, src, VEX_SIMD_F3, vector256);1780emit_int8(0x6F);1781emit_operand(dst, src);1782}17831784void Assembler::vmovdqu(Address dst, XMMRegister src) {1785assert(UseAVX > 0, "");1786InstructionMark im(this);1787bool vector256 = true;1788// swap src<->dst for encoding1789assert(src != xnoreg, "sanity");1790vex_prefix(src, xnoreg, dst, VEX_SIMD_F3, vector256);1791emit_int8(0x7F);1792emit_operand(src, dst);1793}17941795// Uses zero extension on 64bit17961797void Assembler::movl(Register dst, int32_t imm32) {1798int encode = prefix_and_encode(dst->encoding());1799emit_int8((unsigned char)(0xB8 | encode));1800emit_int32(imm32);1801}18021803void Assembler::movl(Register dst, Register src) {1804int encode = prefix_and_encode(dst->encoding(), src->encoding());1805emit_int8((unsigned char)0x8B);1806emit_int8((unsigned char)(0xC0 | encode));1807}18081809void Assembler::movl(Register dst, Address src) {1810InstructionMark im(this);1811prefix(src, dst);1812emit_int8((unsigned char)0x8B);1813emit_operand(dst, src);1814}18151816void Assembler::movl(Address dst, int32_t imm32) {1817InstructionMark im(this);1818prefix(dst);1819emit_int8((unsigned char)0xC7);1820emit_operand(rax, dst, 4);1821emit_int32(imm32);1822}18231824void Assembler::movl(Address dst, Register src) {1825InstructionMark im(this);1826prefix(dst, src);1827emit_int8((unsigned char)0x89);1828emit_operand(src, dst);1829}18301831// New cpus require to use movsd and movss to avoid partial register stall1832// when loading from memory. But for old Opteron use movlpd instead of movsd.1833// The selection is done in MacroAssembler::movdbl() and movflt().1834void Assembler::movlpd(XMMRegister dst, Address src) {1835NOT_LP64(assert(VM_Version::supports_sse2(), ""));1836emit_simd_arith(0x12, dst, src, VEX_SIMD_66);1837}18381839void Assembler::movq( MMXRegister dst, Address src ) {1840assert( VM_Version::supports_mmx(), "" );1841emit_int8(0x0F);1842emit_int8(0x6F);1843emit_operand(dst, src);1844}18451846void Assembler::movq( Address dst, MMXRegister src ) {1847assert( VM_Version::supports_mmx(), "" );1848emit_int8(0x0F);1849emit_int8(0x7F);1850// workaround gcc (3.2.1-7a) bug1851// In that version of gcc with only an emit_operand(MMX, Address)1852// gcc will tail jump and try and reverse the parameters completely1853// obliterating dst in the process. By having a version available1854// that doesn't need to swap the args at the tail jump the bug is1855// avoided.1856emit_operand(dst, src);1857}18581859void Assembler::movq(XMMRegister dst, Address src) {1860NOT_LP64(assert(VM_Version::supports_sse2(), ""));1861InstructionMark im(this);1862simd_prefix(dst, src, VEX_SIMD_F3);1863emit_int8(0x7E);1864emit_operand(dst, src);1865}18661867void Assembler::movq(Address dst, XMMRegister src) {1868NOT_LP64(assert(VM_Version::supports_sse2(), ""));1869InstructionMark im(this);1870simd_prefix(dst, src, VEX_SIMD_66);1871emit_int8((unsigned char)0xD6);1872emit_operand(src, dst);1873}18741875void Assembler::movsbl(Register dst, Address src) { // movsxb1876InstructionMark im(this);1877prefix(src, dst);1878emit_int8(0x0F);1879emit_int8((unsigned char)0xBE);1880emit_operand(dst, src);1881}18821883void Assembler::movsbl(Register dst, Register src) { // movsxb1884NOT_LP64(assert(src->has_byte_register(), "must have byte register"));1885int encode = prefix_and_encode(dst->encoding(), src->encoding(), true);1886emit_int8(0x0F);1887emit_int8((unsigned char)0xBE);1888emit_int8((unsigned char)(0xC0 | encode));1889}18901891void Assembler::movsd(XMMRegister dst, XMMRegister src) {1892NOT_LP64(assert(VM_Version::supports_sse2(), ""));1893emit_simd_arith(0x10, dst, src, VEX_SIMD_F2);1894}18951896void Assembler::movsd(XMMRegister dst, Address src) {1897NOT_LP64(assert(VM_Version::supports_sse2(), ""));1898emit_simd_arith_nonds(0x10, dst, src, VEX_SIMD_F2);1899}19001901void Assembler::movsd(Address dst, XMMRegister src) {1902NOT_LP64(assert(VM_Version::supports_sse2(), ""));1903InstructionMark im(this);1904simd_prefix(dst, src, VEX_SIMD_F2);1905emit_int8(0x11);1906emit_operand(src, dst);1907}19081909void Assembler::movss(XMMRegister dst, XMMRegister src) {1910NOT_LP64(assert(VM_Version::supports_sse(), ""));1911emit_simd_arith(0x10, dst, src, VEX_SIMD_F3);1912}19131914void Assembler::movss(XMMRegister dst, Address src) {1915NOT_LP64(assert(VM_Version::supports_sse(), ""));1916emit_simd_arith_nonds(0x10, dst, src, VEX_SIMD_F3);1917}19181919void Assembler::movss(Address dst, XMMRegister src) {1920NOT_LP64(assert(VM_Version::supports_sse(), ""));1921InstructionMark im(this);1922simd_prefix(dst, src, VEX_SIMD_F3);1923emit_int8(0x11);1924emit_operand(src, dst);1925}19261927void Assembler::movswl(Register dst, Address src) { // movsxw1928InstructionMark im(this);1929prefix(src, dst);1930emit_int8(0x0F);1931emit_int8((unsigned char)0xBF);1932emit_operand(dst, src);1933}19341935void Assembler::movswl(Register dst, Register src) { // movsxw1936int encode = prefix_and_encode(dst->encoding(), src->encoding());1937emit_int8(0x0F);1938emit_int8((unsigned char)0xBF);1939emit_int8((unsigned char)(0xC0 | encode));1940}19411942void Assembler::movw(Address dst, int imm16) {1943InstructionMark im(this);19441945emit_int8(0x66); // switch to 16-bit mode1946prefix(dst);1947emit_int8((unsigned char)0xC7);1948emit_operand(rax, dst, 2);1949emit_int16(imm16);1950}19511952void Assembler::movw(Register dst, Address src) {1953InstructionMark im(this);1954emit_int8(0x66);1955prefix(src, dst);1956emit_int8((unsigned char)0x8B);1957emit_operand(dst, src);1958}19591960void Assembler::movw(Address dst, Register src) {1961InstructionMark im(this);1962emit_int8(0x66);1963prefix(dst, src);1964emit_int8((unsigned char)0x89);1965emit_operand(src, dst);1966}19671968void Assembler::movzbl(Register dst, Address src) { // movzxb1969InstructionMark im(this);1970prefix(src, dst);1971emit_int8(0x0F);1972emit_int8((unsigned char)0xB6);1973emit_operand(dst, src);1974}19751976void Assembler::movzbl(Register dst, Register src) { // movzxb1977NOT_LP64(assert(src->has_byte_register(), "must have byte register"));1978int encode = prefix_and_encode(dst->encoding(), src->encoding(), true);1979emit_int8(0x0F);1980emit_int8((unsigned char)0xB6);1981emit_int8(0xC0 | encode);1982}19831984void Assembler::movzwl(Register dst, Address src) { // movzxw1985InstructionMark im(this);1986prefix(src, dst);1987emit_int8(0x0F);1988emit_int8((unsigned char)0xB7);1989emit_operand(dst, src);1990}19911992void Assembler::movzwl(Register dst, Register src) { // movzxw1993int encode = prefix_and_encode(dst->encoding(), src->encoding());1994emit_int8(0x0F);1995emit_int8((unsigned char)0xB7);1996emit_int8(0xC0 | encode);1997}19981999void Assembler::mull(Address src) {2000InstructionMark im(this);2001prefix(src);2002emit_int8((unsigned char)0xF7);2003emit_operand(rsp, src);2004}20052006void Assembler::mull(Register src) {2007int encode = prefix_and_encode(src->encoding());2008emit_int8((unsigned char)0xF7);2009emit_int8((unsigned char)(0xE0 | encode));2010}20112012void Assembler::mulsd(XMMRegister dst, Address src) {2013NOT_LP64(assert(VM_Version::supports_sse2(), ""));2014emit_simd_arith(0x59, dst, src, VEX_SIMD_F2);2015}20162017void Assembler::mulsd(XMMRegister dst, XMMRegister src) {2018NOT_LP64(assert(VM_Version::supports_sse2(), ""));2019emit_simd_arith(0x59, dst, src, VEX_SIMD_F2);2020}20212022void Assembler::mulss(XMMRegister dst, Address src) {2023NOT_LP64(assert(VM_Version::supports_sse(), ""));2024emit_simd_arith(0x59, dst, src, VEX_SIMD_F3);2025}20262027void Assembler::mulss(XMMRegister dst, XMMRegister src) {2028NOT_LP64(assert(VM_Version::supports_sse(), ""));2029emit_simd_arith(0x59, dst, src, VEX_SIMD_F3);2030}20312032void Assembler::negl(Register dst) {2033int encode = prefix_and_encode(dst->encoding());2034emit_int8((unsigned char)0xF7);2035emit_int8((unsigned char)(0xD8 | encode));2036}20372038void Assembler::nop(int i) {2039#ifdef ASSERT2040assert(i > 0, " ");2041// The fancy nops aren't currently recognized by debuggers making it a2042// pain to disassemble code while debugging. If asserts are on clearly2043// speed is not an issue so simply use the single byte traditional nop2044// to do alignment.20452046for (; i > 0 ; i--) emit_int8((unsigned char)0x90);2047return;20482049#endif // ASSERT20502051if (UseAddressNop && VM_Version::is_intel()) {2052//2053// Using multi-bytes nops "0x0F 0x1F [address]" for Intel2054// 1: 0x902055// 2: 0x66 0x902056// 3: 0x66 0x66 0x90 (don't use "0x0F 0x1F 0x00" - need patching safe padding)2057// 4: 0x0F 0x1F 0x40 0x002058// 5: 0x0F 0x1F 0x44 0x00 0x002059// 6: 0x66 0x0F 0x1F 0x44 0x00 0x002060// 7: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x002061// 8: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x002062// 9: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x002063// 10: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x002064// 11: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x0020652066// The rest coding is Intel specific - don't use consecutive address nops20672068// 12: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x902069// 13: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x902070// 14: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x902071// 15: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x9020722073while(i >= 15) {2074// For Intel don't generate consecutive addess nops (mix with regular nops)2075i -= 15;2076emit_int8(0x66); // size prefix2077emit_int8(0x66); // size prefix2078emit_int8(0x66); // size prefix2079addr_nop_8();2080emit_int8(0x66); // size prefix2081emit_int8(0x66); // size prefix2082emit_int8(0x66); // size prefix2083emit_int8((unsigned char)0x90);2084// nop2085}2086switch (i) {2087case 14:2088emit_int8(0x66); // size prefix2089case 13:2090emit_int8(0x66); // size prefix2091case 12:2092addr_nop_8();2093emit_int8(0x66); // size prefix2094emit_int8(0x66); // size prefix2095emit_int8(0x66); // size prefix2096emit_int8((unsigned char)0x90);2097// nop2098break;2099case 11:2100emit_int8(0x66); // size prefix2101case 10:2102emit_int8(0x66); // size prefix2103case 9:2104emit_int8(0x66); // size prefix2105case 8:2106addr_nop_8();2107break;2108case 7:2109addr_nop_7();2110break;2111case 6:2112emit_int8(0x66); // size prefix2113case 5:2114addr_nop_5();2115break;2116case 4:2117addr_nop_4();2118break;2119case 3:2120// Don't use "0x0F 0x1F 0x00" - need patching safe padding2121emit_int8(0x66); // size prefix2122case 2:2123emit_int8(0x66); // size prefix2124case 1:2125emit_int8((unsigned char)0x90);2126// nop2127break;2128default:2129assert(i == 0, " ");2130}2131return;2132}2133if (UseAddressNop && VM_Version::is_amd()) {2134//2135// Using multi-bytes nops "0x0F 0x1F [address]" for AMD.2136// 1: 0x902137// 2: 0x66 0x902138// 3: 0x66 0x66 0x90 (don't use "0x0F 0x1F 0x00" - need patching safe padding)2139// 4: 0x0F 0x1F 0x40 0x002140// 5: 0x0F 0x1F 0x44 0x00 0x002141// 6: 0x66 0x0F 0x1F 0x44 0x00 0x002142// 7: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x002143// 8: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x002144// 9: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x002145// 10: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x002146// 11: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x0021472148// The rest coding is AMD specific - use consecutive address nops21492150// 12: 0x66 0x0F 0x1F 0x44 0x00 0x00 0x66 0x0F 0x1F 0x44 0x00 0x002151// 13: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00 0x66 0x0F 0x1F 0x44 0x00 0x002152// 14: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00 0x0F 0x1F 0x80 0x00 0x00 0x00 0x002153// 15: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x0F 0x1F 0x80 0x00 0x00 0x00 0x002154// 16: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x002155// Size prefixes (0x66) are added for larger sizes21562157while(i >= 22) {2158i -= 11;2159emit_int8(0x66); // size prefix2160emit_int8(0x66); // size prefix2161emit_int8(0x66); // size prefix2162addr_nop_8();2163}2164// Generate first nop for size between 21-122165switch (i) {2166case 21:2167i -= 1;2168emit_int8(0x66); // size prefix2169case 20:2170case 19:2171i -= 1;2172emit_int8(0x66); // size prefix2173case 18:2174case 17:2175i -= 1;2176emit_int8(0x66); // size prefix2177case 16:2178case 15:2179i -= 8;2180addr_nop_8();2181break;2182case 14:2183case 13:2184i -= 7;2185addr_nop_7();2186break;2187case 12:2188i -= 6;2189emit_int8(0x66); // size prefix2190addr_nop_5();2191break;2192default:2193assert(i < 12, " ");2194}21952196// Generate second nop for size between 11-12197switch (i) {2198case 11:2199emit_int8(0x66); // size prefix2200case 10:2201emit_int8(0x66); // size prefix2202case 9:2203emit_int8(0x66); // size prefix2204case 8:2205addr_nop_8();2206break;2207case 7:2208addr_nop_7();2209break;2210case 6:2211emit_int8(0x66); // size prefix2212case 5:2213addr_nop_5();2214break;2215case 4:2216addr_nop_4();2217break;2218case 3:2219// Don't use "0x0F 0x1F 0x00" - need patching safe padding2220emit_int8(0x66); // size prefix2221case 2:2222emit_int8(0x66); // size prefix2223case 1:2224emit_int8((unsigned char)0x90);2225// nop2226break;2227default:2228assert(i == 0, " ");2229}2230return;2231}22322233// Using nops with size prefixes "0x66 0x90".2234// From AMD Optimization Guide:2235// 1: 0x902236// 2: 0x66 0x902237// 3: 0x66 0x66 0x902238// 4: 0x66 0x66 0x66 0x902239// 5: 0x66 0x66 0x90 0x66 0x902240// 6: 0x66 0x66 0x90 0x66 0x66 0x902241// 7: 0x66 0x66 0x66 0x90 0x66 0x66 0x902242// 8: 0x66 0x66 0x66 0x90 0x66 0x66 0x66 0x902243// 9: 0x66 0x66 0x90 0x66 0x66 0x90 0x66 0x66 0x902244// 10: 0x66 0x66 0x66 0x90 0x66 0x66 0x90 0x66 0x66 0x902245//2246while(i > 12) {2247i -= 4;2248emit_int8(0x66); // size prefix2249emit_int8(0x66);2250emit_int8(0x66);2251emit_int8((unsigned char)0x90);2252// nop2253}2254// 1 - 12 nops2255if(i > 8) {2256if(i > 9) {2257i -= 1;2258emit_int8(0x66);2259}2260i -= 3;2261emit_int8(0x66);2262emit_int8(0x66);2263emit_int8((unsigned char)0x90);2264}2265// 1 - 8 nops2266if(i > 4) {2267if(i > 6) {2268i -= 1;2269emit_int8(0x66);2270}2271i -= 3;2272emit_int8(0x66);2273emit_int8(0x66);2274emit_int8((unsigned char)0x90);2275}2276switch (i) {2277case 4:2278emit_int8(0x66);2279case 3:2280emit_int8(0x66);2281case 2:2282emit_int8(0x66);2283case 1:2284emit_int8((unsigned char)0x90);2285break;2286default:2287assert(i == 0, " ");2288}2289}22902291void Assembler::notl(Register dst) {2292int encode = prefix_and_encode(dst->encoding());2293emit_int8((unsigned char)0xF7);2294emit_int8((unsigned char)(0xD0 | encode));2295}22962297void Assembler::orl(Address dst, int32_t imm32) {2298InstructionMark im(this);2299prefix(dst);2300emit_arith_operand(0x81, rcx, dst, imm32);2301}23022303void Assembler::orl(Register dst, int32_t imm32) {2304prefix(dst);2305emit_arith(0x81, 0xC8, dst, imm32);2306}23072308void Assembler::orl(Register dst, Address src) {2309InstructionMark im(this);2310prefix(src, dst);2311emit_int8(0x0B);2312emit_operand(dst, src);2313}23142315void Assembler::orl(Register dst, Register src) {2316(void) prefix_and_encode(dst->encoding(), src->encoding());2317emit_arith(0x0B, 0xC0, dst, src);2318}23192320void Assembler::orl(Address dst, Register src) {2321InstructionMark im(this);2322prefix(dst, src);2323emit_int8(0x09);2324emit_operand(src, dst);2325}23262327void Assembler::packuswb(XMMRegister dst, Address src) {2328NOT_LP64(assert(VM_Version::supports_sse2(), ""));2329assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");2330emit_simd_arith(0x67, dst, src, VEX_SIMD_66);2331}23322333void Assembler::packuswb(XMMRegister dst, XMMRegister src) {2334NOT_LP64(assert(VM_Version::supports_sse2(), ""));2335emit_simd_arith(0x67, dst, src, VEX_SIMD_66);2336}23372338void Assembler::vpackuswb(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {2339assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");2340emit_vex_arith(0x67, dst, nds, src, VEX_SIMD_66, vector256);2341}23422343void Assembler::vpermq(XMMRegister dst, XMMRegister src, int imm8, bool vector256) {2344assert(VM_Version::supports_avx2(), "");2345int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, true, vector256);2346emit_int8(0x00);2347emit_int8(0xC0 | encode);2348emit_int8(imm8);2349}23502351void Assembler::pause() {2352emit_int8((unsigned char)0xF3);2353emit_int8((unsigned char)0x90);2354}23552356void Assembler::pcmpestri(XMMRegister dst, Address src, int imm8) {2357assert(VM_Version::supports_sse4_2(), "");2358InstructionMark im(this);2359simd_prefix(dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A);2360emit_int8(0x61);2361emit_operand(dst, src);2362emit_int8(imm8);2363}23642365void Assembler::pcmpestri(XMMRegister dst, XMMRegister src, int imm8) {2366assert(VM_Version::supports_sse4_2(), "");2367int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_3A);2368emit_int8(0x61);2369emit_int8((unsigned char)(0xC0 | encode));2370emit_int8(imm8);2371}23722373void Assembler::pextrd(Register dst, XMMRegister src, int imm8) {2374assert(VM_Version::supports_sse4_1(), "");2375int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, false);2376emit_int8(0x16);2377emit_int8((unsigned char)(0xC0 | encode));2378emit_int8(imm8);2379}23802381void Assembler::pextrq(Register dst, XMMRegister src, int imm8) {2382assert(VM_Version::supports_sse4_1(), "");2383int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, true);2384emit_int8(0x16);2385emit_int8((unsigned char)(0xC0 | encode));2386emit_int8(imm8);2387}23882389void Assembler::pinsrd(XMMRegister dst, Register src, int imm8) {2390assert(VM_Version::supports_sse4_1(), "");2391int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, false);2392emit_int8(0x22);2393emit_int8((unsigned char)(0xC0 | encode));2394emit_int8(imm8);2395}23962397void Assembler::pinsrq(XMMRegister dst, Register src, int imm8) {2398assert(VM_Version::supports_sse4_1(), "");2399int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, true);2400emit_int8(0x22);2401emit_int8((unsigned char)(0xC0 | encode));2402emit_int8(imm8);2403}24042405void Assembler::pmovzxbw(XMMRegister dst, Address src) {2406assert(VM_Version::supports_sse4_1(), "");2407InstructionMark im(this);2408simd_prefix(dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38);2409emit_int8(0x30);2410emit_operand(dst, src);2411}24122413void Assembler::pmovzxbw(XMMRegister dst, XMMRegister src) {2414assert(VM_Version::supports_sse4_1(), "");2415int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38);2416emit_int8(0x30);2417emit_int8((unsigned char)(0xC0 | encode));2418}24192420// generic2421void Assembler::pop(Register dst) {2422int encode = prefix_and_encode(dst->encoding());2423emit_int8(0x58 | encode);2424}24252426void Assembler::popcntl(Register dst, Address src) {2427assert(VM_Version::supports_popcnt(), "must support");2428InstructionMark im(this);2429emit_int8((unsigned char)0xF3);2430prefix(src, dst);2431emit_int8(0x0F);2432emit_int8((unsigned char)0xB8);2433emit_operand(dst, src);2434}24352436void Assembler::popcntl(Register dst, Register src) {2437assert(VM_Version::supports_popcnt(), "must support");2438emit_int8((unsigned char)0xF3);2439int encode = prefix_and_encode(dst->encoding(), src->encoding());2440emit_int8(0x0F);2441emit_int8((unsigned char)0xB8);2442emit_int8((unsigned char)(0xC0 | encode));2443}24442445void Assembler::popf() {2446emit_int8((unsigned char)0x9D);2447}24482449#ifndef _LP64 // no 32bit push/pop on amd642450void Assembler::popl(Address dst) {2451// NOTE: this will adjust stack by 8byte on 64bits2452InstructionMark im(this);2453prefix(dst);2454emit_int8((unsigned char)0x8F);2455emit_operand(rax, dst);2456}2457#endif24582459void Assembler::prefetch_prefix(Address src) {2460prefix(src);2461emit_int8(0x0F);2462}24632464void Assembler::prefetchnta(Address src) {2465NOT_LP64(assert(VM_Version::supports_sse(), "must support"));2466InstructionMark im(this);2467prefetch_prefix(src);2468emit_int8(0x18);2469emit_operand(rax, src); // 0, src2470}24712472void Assembler::prefetchr(Address src) {2473assert(VM_Version::supports_3dnow_prefetch(), "must support");2474InstructionMark im(this);2475prefetch_prefix(src);2476emit_int8(0x0D);2477emit_operand(rax, src); // 0, src2478}24792480void Assembler::prefetcht0(Address src) {2481NOT_LP64(assert(VM_Version::supports_sse(), "must support"));2482InstructionMark im(this);2483prefetch_prefix(src);2484emit_int8(0x18);2485emit_operand(rcx, src); // 1, src2486}24872488void Assembler::prefetcht1(Address src) {2489NOT_LP64(assert(VM_Version::supports_sse(), "must support"));2490InstructionMark im(this);2491prefetch_prefix(src);2492emit_int8(0x18);2493emit_operand(rdx, src); // 2, src2494}24952496void Assembler::prefetcht2(Address src) {2497NOT_LP64(assert(VM_Version::supports_sse(), "must support"));2498InstructionMark im(this);2499prefetch_prefix(src);2500emit_int8(0x18);2501emit_operand(rbx, src); // 3, src2502}25032504void Assembler::prefetchw(Address src) {2505assert(VM_Version::supports_3dnow_prefetch(), "must support");2506InstructionMark im(this);2507prefetch_prefix(src);2508emit_int8(0x0D);2509emit_operand(rcx, src); // 1, src2510}25112512void Assembler::prefix(Prefix p) {2513emit_int8(p);2514}25152516void Assembler::pshufb(XMMRegister dst, XMMRegister src) {2517assert(VM_Version::supports_ssse3(), "");2518int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38);2519emit_int8(0x00);2520emit_int8((unsigned char)(0xC0 | encode));2521}25222523void Assembler::pshufb(XMMRegister dst, Address src) {2524assert(VM_Version::supports_ssse3(), "");2525InstructionMark im(this);2526simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38);2527emit_int8(0x00);2528emit_operand(dst, src);2529}25302531void Assembler::pshufd(XMMRegister dst, XMMRegister src, int mode) {2532assert(isByte(mode), "invalid value");2533NOT_LP64(assert(VM_Version::supports_sse2(), ""));2534emit_simd_arith_nonds(0x70, dst, src, VEX_SIMD_66);2535emit_int8(mode & 0xFF);25362537}25382539void Assembler::pshufd(XMMRegister dst, Address src, int mode) {2540assert(isByte(mode), "invalid value");2541NOT_LP64(assert(VM_Version::supports_sse2(), ""));2542assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");2543InstructionMark im(this);2544simd_prefix(dst, src, VEX_SIMD_66);2545emit_int8(0x70);2546emit_operand(dst, src);2547emit_int8(mode & 0xFF);2548}25492550void Assembler::pshuflw(XMMRegister dst, XMMRegister src, int mode) {2551assert(isByte(mode), "invalid value");2552NOT_LP64(assert(VM_Version::supports_sse2(), ""));2553emit_simd_arith_nonds(0x70, dst, src, VEX_SIMD_F2);2554emit_int8(mode & 0xFF);2555}25562557void Assembler::pshuflw(XMMRegister dst, Address src, int mode) {2558assert(isByte(mode), "invalid value");2559NOT_LP64(assert(VM_Version::supports_sse2(), ""));2560assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");2561InstructionMark im(this);2562simd_prefix(dst, src, VEX_SIMD_F2);2563emit_int8(0x70);2564emit_operand(dst, src);2565emit_int8(mode & 0xFF);2566}25672568void Assembler::psrldq(XMMRegister dst, int shift) {2569// Shift 128 bit value in xmm register by number of bytes.2570NOT_LP64(assert(VM_Version::supports_sse2(), ""));2571int encode = simd_prefix_and_encode(xmm3, dst, dst, VEX_SIMD_66);2572emit_int8(0x73);2573emit_int8((unsigned char)(0xC0 | encode));2574emit_int8(shift);2575}25762577void Assembler::pslldq(XMMRegister dst, int shift) {2578// Shift left 128 bit value in xmm register by number of bytes.2579NOT_LP64(assert(VM_Version::supports_sse2(), ""));2580int encode = simd_prefix_and_encode(xmm7, dst, dst, VEX_SIMD_66);2581emit_int8(0x73);2582emit_int8((unsigned char)(0xC0 | encode));2583emit_int8(shift);2584}25852586void Assembler::ptest(XMMRegister dst, Address src) {2587assert(VM_Version::supports_sse4_1(), "");2588assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");2589InstructionMark im(this);2590simd_prefix(dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38);2591emit_int8(0x17);2592emit_operand(dst, src);2593}25942595void Assembler::ptest(XMMRegister dst, XMMRegister src) {2596assert(VM_Version::supports_sse4_1(), "");2597int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38);2598emit_int8(0x17);2599emit_int8((unsigned char)(0xC0 | encode));2600}26012602void Assembler::vptest(XMMRegister dst, Address src) {2603assert(VM_Version::supports_avx(), "");2604InstructionMark im(this);2605bool vector256 = true;2606assert(dst != xnoreg, "sanity");2607int dst_enc = dst->encoding();2608// swap src<->dst for encoding2609vex_prefix(src, 0, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, false, vector256);2610emit_int8(0x17);2611emit_operand(dst, src);2612}26132614void Assembler::vptest(XMMRegister dst, XMMRegister src) {2615assert(VM_Version::supports_avx(), "");2616bool vector256 = true;2617int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_38);2618emit_int8(0x17);2619emit_int8((unsigned char)(0xC0 | encode));2620}26212622void Assembler::punpcklbw(XMMRegister dst, Address src) {2623NOT_LP64(assert(VM_Version::supports_sse2(), ""));2624assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");2625emit_simd_arith(0x60, dst, src, VEX_SIMD_66);2626}26272628void Assembler::punpcklbw(XMMRegister dst, XMMRegister src) {2629NOT_LP64(assert(VM_Version::supports_sse2(), ""));2630emit_simd_arith(0x60, dst, src, VEX_SIMD_66);2631}26322633void Assembler::punpckldq(XMMRegister dst, Address src) {2634NOT_LP64(assert(VM_Version::supports_sse2(), ""));2635assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");2636emit_simd_arith(0x62, dst, src, VEX_SIMD_66);2637}26382639void Assembler::punpckldq(XMMRegister dst, XMMRegister src) {2640NOT_LP64(assert(VM_Version::supports_sse2(), ""));2641emit_simd_arith(0x62, dst, src, VEX_SIMD_66);2642}26432644void Assembler::punpcklqdq(XMMRegister dst, XMMRegister src) {2645NOT_LP64(assert(VM_Version::supports_sse2(), ""));2646emit_simd_arith(0x6C, dst, src, VEX_SIMD_66);2647}26482649void Assembler::push(int32_t imm32) {2650// in 64bits we push 64bits onto the stack but only2651// take a 32bit immediate2652emit_int8(0x68);2653emit_int32(imm32);2654}26552656void Assembler::push(Register src) {2657int encode = prefix_and_encode(src->encoding());26582659emit_int8(0x50 | encode);2660}26612662void Assembler::pushf() {2663emit_int8((unsigned char)0x9C);2664}26652666#ifndef _LP64 // no 32bit push/pop on amd642667void Assembler::pushl(Address src) {2668// Note this will push 64bit on 64bit2669InstructionMark im(this);2670prefix(src);2671emit_int8((unsigned char)0xFF);2672emit_operand(rsi, src);2673}2674#endif26752676void Assembler::rcll(Register dst, int imm8) {2677assert(isShiftCount(imm8), "illegal shift count");2678int encode = prefix_and_encode(dst->encoding());2679if (imm8 == 1) {2680emit_int8((unsigned char)0xD1);2681emit_int8((unsigned char)(0xD0 | encode));2682} else {2683emit_int8((unsigned char)0xC1);2684emit_int8((unsigned char)0xD0 | encode);2685emit_int8(imm8);2686}2687}26882689void Assembler::rdtsc() {2690emit_int8((unsigned char)0x0F);2691emit_int8((unsigned char)0x31);2692}26932694// copies data from [esi] to [edi] using rcx pointer sized words2695// generic2696void Assembler::rep_mov() {2697emit_int8((unsigned char)0xF3);2698// MOVSQ2699LP64_ONLY(prefix(REX_W));2700emit_int8((unsigned char)0xA5);2701}27022703// sets rcx bytes with rax, value at [edi]2704void Assembler::rep_stosb() {2705emit_int8((unsigned char)0xF3); // REP2706LP64_ONLY(prefix(REX_W));2707emit_int8((unsigned char)0xAA); // STOSB2708}27092710// sets rcx pointer sized words with rax, value at [edi]2711// generic2712void Assembler::rep_stos() {2713emit_int8((unsigned char)0xF3); // REP2714LP64_ONLY(prefix(REX_W)); // LP64:STOSQ, LP32:STOSD2715emit_int8((unsigned char)0xAB);2716}27172718// scans rcx pointer sized words at [edi] for occurance of rax,2719// generic2720void Assembler::repne_scan() { // repne_scan2721emit_int8((unsigned char)0xF2);2722// SCASQ2723LP64_ONLY(prefix(REX_W));2724emit_int8((unsigned char)0xAF);2725}27262727#ifdef _LP642728// scans rcx 4 byte words at [edi] for occurance of rax,2729// generic2730void Assembler::repne_scanl() { // repne_scan2731emit_int8((unsigned char)0xF2);2732// SCASL2733emit_int8((unsigned char)0xAF);2734}2735#endif27362737void Assembler::ret(int imm16) {2738if (imm16 == 0) {2739emit_int8((unsigned char)0xC3);2740} else {2741emit_int8((unsigned char)0xC2);2742emit_int16(imm16);2743}2744}27452746void Assembler::sahf() {2747#ifdef _LP642748// Not supported in 64bit mode2749ShouldNotReachHere();2750#endif2751emit_int8((unsigned char)0x9E);2752}27532754void Assembler::sarl(Register dst, int imm8) {2755int encode = prefix_and_encode(dst->encoding());2756assert(isShiftCount(imm8), "illegal shift count");2757if (imm8 == 1) {2758emit_int8((unsigned char)0xD1);2759emit_int8((unsigned char)(0xF8 | encode));2760} else {2761emit_int8((unsigned char)0xC1);2762emit_int8((unsigned char)(0xF8 | encode));2763emit_int8(imm8);2764}2765}27662767void Assembler::sarl(Register dst) {2768int encode = prefix_and_encode(dst->encoding());2769emit_int8((unsigned char)0xD3);2770emit_int8((unsigned char)(0xF8 | encode));2771}27722773void Assembler::sbbl(Address dst, int32_t imm32) {2774InstructionMark im(this);2775prefix(dst);2776emit_arith_operand(0x81, rbx, dst, imm32);2777}27782779void Assembler::sbbl(Register dst, int32_t imm32) {2780prefix(dst);2781emit_arith(0x81, 0xD8, dst, imm32);2782}278327842785void Assembler::sbbl(Register dst, Address src) {2786InstructionMark im(this);2787prefix(src, dst);2788emit_int8(0x1B);2789emit_operand(dst, src);2790}27912792void Assembler::sbbl(Register dst, Register src) {2793(void) prefix_and_encode(dst->encoding(), src->encoding());2794emit_arith(0x1B, 0xC0, dst, src);2795}27962797void Assembler::setb(Condition cc, Register dst) {2798assert(0 <= cc && cc < 16, "illegal cc");2799int encode = prefix_and_encode(dst->encoding(), true);2800emit_int8(0x0F);2801emit_int8((unsigned char)0x90 | cc);2802emit_int8((unsigned char)(0xC0 | encode));2803}28042805void Assembler::shll(Register dst, int imm8) {2806assert(isShiftCount(imm8), "illegal shift count");2807int encode = prefix_and_encode(dst->encoding());2808if (imm8 == 1 ) {2809emit_int8((unsigned char)0xD1);2810emit_int8((unsigned char)(0xE0 | encode));2811} else {2812emit_int8((unsigned char)0xC1);2813emit_int8((unsigned char)(0xE0 | encode));2814emit_int8(imm8);2815}2816}28172818void Assembler::shll(Register dst) {2819int encode = prefix_and_encode(dst->encoding());2820emit_int8((unsigned char)0xD3);2821emit_int8((unsigned char)(0xE0 | encode));2822}28232824void Assembler::shrl(Register dst, int imm8) {2825assert(isShiftCount(imm8), "illegal shift count");2826int encode = prefix_and_encode(dst->encoding());2827emit_int8((unsigned char)0xC1);2828emit_int8((unsigned char)(0xE8 | encode));2829emit_int8(imm8);2830}28312832void Assembler::shrl(Register dst) {2833int encode = prefix_and_encode(dst->encoding());2834emit_int8((unsigned char)0xD3);2835emit_int8((unsigned char)(0xE8 | encode));2836}28372838// copies a single word from [esi] to [edi]2839void Assembler::smovl() {2840emit_int8((unsigned char)0xA5);2841}28422843void Assembler::sqrtsd(XMMRegister dst, XMMRegister src) {2844NOT_LP64(assert(VM_Version::supports_sse2(), ""));2845emit_simd_arith(0x51, dst, src, VEX_SIMD_F2);2846}28472848void Assembler::sqrtsd(XMMRegister dst, Address src) {2849NOT_LP64(assert(VM_Version::supports_sse2(), ""));2850emit_simd_arith(0x51, dst, src, VEX_SIMD_F2);2851}28522853void Assembler::sqrtss(XMMRegister dst, XMMRegister src) {2854NOT_LP64(assert(VM_Version::supports_sse(), ""));2855emit_simd_arith(0x51, dst, src, VEX_SIMD_F3);2856}28572858void Assembler::std() {2859emit_int8((unsigned char)0xFD);2860}28612862void Assembler::sqrtss(XMMRegister dst, Address src) {2863NOT_LP64(assert(VM_Version::supports_sse(), ""));2864emit_simd_arith(0x51, dst, src, VEX_SIMD_F3);2865}28662867void Assembler::stmxcsr( Address dst) {2868NOT_LP64(assert(VM_Version::supports_sse(), ""));2869InstructionMark im(this);2870prefix(dst);2871emit_int8(0x0F);2872emit_int8((unsigned char)0xAE);2873emit_operand(as_Register(3), dst);2874}28752876void Assembler::subl(Address dst, int32_t imm32) {2877InstructionMark im(this);2878prefix(dst);2879emit_arith_operand(0x81, rbp, dst, imm32);2880}28812882void Assembler::subl(Address dst, Register src) {2883InstructionMark im(this);2884prefix(dst, src);2885emit_int8(0x29);2886emit_operand(src, dst);2887}28882889void Assembler::subl(Register dst, int32_t imm32) {2890prefix(dst);2891emit_arith(0x81, 0xE8, dst, imm32);2892}28932894// Force generation of a 4 byte immediate value even if it fits into 8bit2895void Assembler::subl_imm32(Register dst, int32_t imm32) {2896prefix(dst);2897emit_arith_imm32(0x81, 0xE8, dst, imm32);2898}28992900void Assembler::subl(Register dst, Address src) {2901InstructionMark im(this);2902prefix(src, dst);2903emit_int8(0x2B);2904emit_operand(dst, src);2905}29062907void Assembler::subl(Register dst, Register src) {2908(void) prefix_and_encode(dst->encoding(), src->encoding());2909emit_arith(0x2B, 0xC0, dst, src);2910}29112912void Assembler::subsd(XMMRegister dst, XMMRegister src) {2913NOT_LP64(assert(VM_Version::supports_sse2(), ""));2914emit_simd_arith(0x5C, dst, src, VEX_SIMD_F2);2915}29162917void Assembler::subsd(XMMRegister dst, Address src) {2918NOT_LP64(assert(VM_Version::supports_sse2(), ""));2919emit_simd_arith(0x5C, dst, src, VEX_SIMD_F2);2920}29212922void Assembler::subss(XMMRegister dst, XMMRegister src) {2923NOT_LP64(assert(VM_Version::supports_sse(), ""));2924emit_simd_arith(0x5C, dst, src, VEX_SIMD_F3);2925}29262927void Assembler::subss(XMMRegister dst, Address src) {2928NOT_LP64(assert(VM_Version::supports_sse(), ""));2929emit_simd_arith(0x5C, dst, src, VEX_SIMD_F3);2930}29312932void Assembler::testb(Register dst, int imm8) {2933NOT_LP64(assert(dst->has_byte_register(), "must have byte register"));2934(void) prefix_and_encode(dst->encoding(), true);2935emit_arith_b(0xF6, 0xC0, dst, imm8);2936}29372938void Assembler::testl(Register dst, int32_t imm32) {2939// not using emit_arith because test2940// doesn't support sign-extension of2941// 8bit operands2942int encode = dst->encoding();2943if (encode == 0) {2944emit_int8((unsigned char)0xA9);2945} else {2946encode = prefix_and_encode(encode);2947emit_int8((unsigned char)0xF7);2948emit_int8((unsigned char)(0xC0 | encode));2949}2950emit_int32(imm32);2951}29522953void Assembler::testl(Register dst, Register src) {2954(void) prefix_and_encode(dst->encoding(), src->encoding());2955emit_arith(0x85, 0xC0, dst, src);2956}29572958void Assembler::testl(Register dst, Address src) {2959InstructionMark im(this);2960prefix(src, dst);2961emit_int8((unsigned char)0x85);2962emit_operand(dst, src);2963}29642965void Assembler::tzcntl(Register dst, Register src) {2966assert(VM_Version::supports_bmi1(), "tzcnt instruction not supported");2967emit_int8((unsigned char)0xF3);2968int encode = prefix_and_encode(dst->encoding(), src->encoding());2969emit_int8(0x0F);2970emit_int8((unsigned char)0xBC);2971emit_int8((unsigned char)0xC0 | encode);2972}29732974void Assembler::tzcntq(Register dst, Register src) {2975assert(VM_Version::supports_bmi1(), "tzcnt instruction not supported");2976emit_int8((unsigned char)0xF3);2977int encode = prefixq_and_encode(dst->encoding(), src->encoding());2978emit_int8(0x0F);2979emit_int8((unsigned char)0xBC);2980emit_int8((unsigned char)(0xC0 | encode));2981}29822983void Assembler::ucomisd(XMMRegister dst, Address src) {2984NOT_LP64(assert(VM_Version::supports_sse2(), ""));2985emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_66);2986}29872988void Assembler::ucomisd(XMMRegister dst, XMMRegister src) {2989NOT_LP64(assert(VM_Version::supports_sse2(), ""));2990emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_66);2991}29922993void Assembler::ucomiss(XMMRegister dst, Address src) {2994NOT_LP64(assert(VM_Version::supports_sse(), ""));2995emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_NONE);2996}29972998void Assembler::ucomiss(XMMRegister dst, XMMRegister src) {2999NOT_LP64(assert(VM_Version::supports_sse(), ""));3000emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_NONE);3001}30023003void Assembler::xabort(int8_t imm8) {3004emit_int8((unsigned char)0xC6);3005emit_int8((unsigned char)0xF8);3006emit_int8((unsigned char)(imm8 & 0xFF));3007}30083009void Assembler::xaddl(Address dst, Register src) {3010InstructionMark im(this);3011prefix(dst, src);3012emit_int8(0x0F);3013emit_int8((unsigned char)0xC1);3014emit_operand(src, dst);3015}30163017void Assembler::xbegin(Label& abort, relocInfo::relocType rtype) {3018InstructionMark im(this);3019relocate(rtype);3020if (abort.is_bound()) {3021address entry = target(abort);3022assert(entry != NULL, "abort entry NULL");3023intptr_t offset = entry - pc();3024emit_int8((unsigned char)0xC7);3025emit_int8((unsigned char)0xF8);3026emit_int32(offset - 6); // 2 opcode + 4 address3027} else {3028abort.add_patch_at(code(), locator());3029emit_int8((unsigned char)0xC7);3030emit_int8((unsigned char)0xF8);3031emit_int32(0);3032}3033}30343035void Assembler::xchgl(Register dst, Address src) { // xchg3036InstructionMark im(this);3037prefix(src, dst);3038emit_int8((unsigned char)0x87);3039emit_operand(dst, src);3040}30413042void Assembler::xchgl(Register dst, Register src) {3043int encode = prefix_and_encode(dst->encoding(), src->encoding());3044emit_int8((unsigned char)0x87);3045emit_int8((unsigned char)(0xC0 | encode));3046}30473048void Assembler::xend() {3049emit_int8((unsigned char)0x0F);3050emit_int8((unsigned char)0x01);3051emit_int8((unsigned char)0xD5);3052}30533054void Assembler::xgetbv() {3055emit_int8(0x0F);3056emit_int8(0x01);3057emit_int8((unsigned char)0xD0);3058}30593060void Assembler::xorl(Register dst, int32_t imm32) {3061prefix(dst);3062emit_arith(0x81, 0xF0, dst, imm32);3063}30643065void Assembler::xorl(Register dst, Address src) {3066InstructionMark im(this);3067prefix(src, dst);3068emit_int8(0x33);3069emit_operand(dst, src);3070}30713072void Assembler::xorl(Register dst, Register src) {3073(void) prefix_and_encode(dst->encoding(), src->encoding());3074emit_arith(0x33, 0xC0, dst, src);3075}307630773078// AVX 3-operands scalar float-point arithmetic instructions30793080void Assembler::vaddsd(XMMRegister dst, XMMRegister nds, Address src) {3081assert(VM_Version::supports_avx(), "");3082emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_F2, /* vector256 */ false);3083}30843085void Assembler::vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {3086assert(VM_Version::supports_avx(), "");3087emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_F2, /* vector256 */ false);3088}30893090void Assembler::vaddss(XMMRegister dst, XMMRegister nds, Address src) {3091assert(VM_Version::supports_avx(), "");3092emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_F3, /* vector256 */ false);3093}30943095void Assembler::vaddss(XMMRegister dst, XMMRegister nds, XMMRegister src) {3096assert(VM_Version::supports_avx(), "");3097emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_F3, /* vector256 */ false);3098}30993100void Assembler::vdivsd(XMMRegister dst, XMMRegister nds, Address src) {3101assert(VM_Version::supports_avx(), "");3102emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_F2, /* vector256 */ false);3103}31043105void Assembler::vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {3106assert(VM_Version::supports_avx(), "");3107emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_F2, /* vector256 */ false);3108}31093110void Assembler::vdivss(XMMRegister dst, XMMRegister nds, Address src) {3111assert(VM_Version::supports_avx(), "");3112emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_F3, /* vector256 */ false);3113}31143115void Assembler::vdivss(XMMRegister dst, XMMRegister nds, XMMRegister src) {3116assert(VM_Version::supports_avx(), "");3117emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_F3, /* vector256 */ false);3118}31193120void Assembler::vmulsd(XMMRegister dst, XMMRegister nds, Address src) {3121assert(VM_Version::supports_avx(), "");3122emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_F2, /* vector256 */ false);3123}31243125void Assembler::vmulsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {3126assert(VM_Version::supports_avx(), "");3127emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_F2, /* vector256 */ false);3128}31293130void Assembler::vmulss(XMMRegister dst, XMMRegister nds, Address src) {3131assert(VM_Version::supports_avx(), "");3132emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_F3, /* vector256 */ false);3133}31343135void Assembler::vmulss(XMMRegister dst, XMMRegister nds, XMMRegister src) {3136assert(VM_Version::supports_avx(), "");3137emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_F3, /* vector256 */ false);3138}31393140void Assembler::vsubsd(XMMRegister dst, XMMRegister nds, Address src) {3141assert(VM_Version::supports_avx(), "");3142emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_F2, /* vector256 */ false);3143}31443145void Assembler::vsubsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {3146assert(VM_Version::supports_avx(), "");3147emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_F2, /* vector256 */ false);3148}31493150void Assembler::vsubss(XMMRegister dst, XMMRegister nds, Address src) {3151assert(VM_Version::supports_avx(), "");3152emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_F3, /* vector256 */ false);3153}31543155void Assembler::vsubss(XMMRegister dst, XMMRegister nds, XMMRegister src) {3156assert(VM_Version::supports_avx(), "");3157emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_F3, /* vector256 */ false);3158}31593160//====================VECTOR ARITHMETIC=====================================31613162// Float-point vector arithmetic31633164void Assembler::addpd(XMMRegister dst, XMMRegister src) {3165NOT_LP64(assert(VM_Version::supports_sse2(), ""));3166emit_simd_arith(0x58, dst, src, VEX_SIMD_66);3167}31683169void Assembler::addps(XMMRegister dst, XMMRegister src) {3170NOT_LP64(assert(VM_Version::supports_sse2(), ""));3171emit_simd_arith(0x58, dst, src, VEX_SIMD_NONE);3172}31733174void Assembler::vaddpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3175assert(VM_Version::supports_avx(), "");3176emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_66, vector256);3177}31783179void Assembler::vaddps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3180assert(VM_Version::supports_avx(), "");3181emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_NONE, vector256);3182}31833184void Assembler::vaddpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3185assert(VM_Version::supports_avx(), "");3186emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_66, vector256);3187}31883189void Assembler::vaddps(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3190assert(VM_Version::supports_avx(), "");3191emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_NONE, vector256);3192}31933194void Assembler::subpd(XMMRegister dst, XMMRegister src) {3195NOT_LP64(assert(VM_Version::supports_sse2(), ""));3196emit_simd_arith(0x5C, dst, src, VEX_SIMD_66);3197}31983199void Assembler::subps(XMMRegister dst, XMMRegister src) {3200NOT_LP64(assert(VM_Version::supports_sse2(), ""));3201emit_simd_arith(0x5C, dst, src, VEX_SIMD_NONE);3202}32033204void Assembler::vsubpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3205assert(VM_Version::supports_avx(), "");3206emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_66, vector256);3207}32083209void Assembler::vsubps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3210assert(VM_Version::supports_avx(), "");3211emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_NONE, vector256);3212}32133214void Assembler::vsubpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3215assert(VM_Version::supports_avx(), "");3216emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_66, vector256);3217}32183219void Assembler::vsubps(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3220assert(VM_Version::supports_avx(), "");3221emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_NONE, vector256);3222}32233224void Assembler::mulpd(XMMRegister dst, XMMRegister src) {3225NOT_LP64(assert(VM_Version::supports_sse2(), ""));3226emit_simd_arith(0x59, dst, src, VEX_SIMD_66);3227}32283229void Assembler::mulps(XMMRegister dst, XMMRegister src) {3230NOT_LP64(assert(VM_Version::supports_sse2(), ""));3231emit_simd_arith(0x59, dst, src, VEX_SIMD_NONE);3232}32333234void Assembler::vmulpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3235assert(VM_Version::supports_avx(), "");3236emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_66, vector256);3237}32383239void Assembler::vmulps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3240assert(VM_Version::supports_avx(), "");3241emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_NONE, vector256);3242}32433244void Assembler::vmulpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3245assert(VM_Version::supports_avx(), "");3246emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_66, vector256);3247}32483249void Assembler::vmulps(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3250assert(VM_Version::supports_avx(), "");3251emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_NONE, vector256);3252}32533254void Assembler::divpd(XMMRegister dst, XMMRegister src) {3255NOT_LP64(assert(VM_Version::supports_sse2(), ""));3256emit_simd_arith(0x5E, dst, src, VEX_SIMD_66);3257}32583259void Assembler::divps(XMMRegister dst, XMMRegister src) {3260NOT_LP64(assert(VM_Version::supports_sse2(), ""));3261emit_simd_arith(0x5E, dst, src, VEX_SIMD_NONE);3262}32633264void Assembler::vdivpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3265assert(VM_Version::supports_avx(), "");3266emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_66, vector256);3267}32683269void Assembler::vdivps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3270assert(VM_Version::supports_avx(), "");3271emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_NONE, vector256);3272}32733274void Assembler::vdivpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3275assert(VM_Version::supports_avx(), "");3276emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_66, vector256);3277}32783279void Assembler::vdivps(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3280assert(VM_Version::supports_avx(), "");3281emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_NONE, vector256);3282}32833284void Assembler::andpd(XMMRegister dst, XMMRegister src) {3285NOT_LP64(assert(VM_Version::supports_sse2(), ""));3286emit_simd_arith(0x54, dst, src, VEX_SIMD_66);3287}32883289void Assembler::andps(XMMRegister dst, XMMRegister src) {3290NOT_LP64(assert(VM_Version::supports_sse(), ""));3291emit_simd_arith(0x54, dst, src, VEX_SIMD_NONE);3292}32933294void Assembler::andps(XMMRegister dst, Address src) {3295NOT_LP64(assert(VM_Version::supports_sse(), ""));3296emit_simd_arith(0x54, dst, src, VEX_SIMD_NONE);3297}32983299void Assembler::andpd(XMMRegister dst, Address src) {3300NOT_LP64(assert(VM_Version::supports_sse2(), ""));3301emit_simd_arith(0x54, dst, src, VEX_SIMD_66);3302}33033304void Assembler::vandpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3305assert(VM_Version::supports_avx(), "");3306emit_vex_arith(0x54, dst, nds, src, VEX_SIMD_66, vector256);3307}33083309void Assembler::vandps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3310assert(VM_Version::supports_avx(), "");3311emit_vex_arith(0x54, dst, nds, src, VEX_SIMD_NONE, vector256);3312}33133314void Assembler::vandpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3315assert(VM_Version::supports_avx(), "");3316emit_vex_arith(0x54, dst, nds, src, VEX_SIMD_66, vector256);3317}33183319void Assembler::vandps(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3320assert(VM_Version::supports_avx(), "");3321emit_vex_arith(0x54, dst, nds, src, VEX_SIMD_NONE, vector256);3322}33233324void Assembler::xorpd(XMMRegister dst, XMMRegister src) {3325NOT_LP64(assert(VM_Version::supports_sse2(), ""));3326emit_simd_arith(0x57, dst, src, VEX_SIMD_66);3327}33283329void Assembler::xorps(XMMRegister dst, XMMRegister src) {3330NOT_LP64(assert(VM_Version::supports_sse(), ""));3331emit_simd_arith(0x57, dst, src, VEX_SIMD_NONE);3332}33333334void Assembler::xorpd(XMMRegister dst, Address src) {3335NOT_LP64(assert(VM_Version::supports_sse2(), ""));3336emit_simd_arith(0x57, dst, src, VEX_SIMD_66);3337}33383339void Assembler::xorps(XMMRegister dst, Address src) {3340NOT_LP64(assert(VM_Version::supports_sse(), ""));3341emit_simd_arith(0x57, dst, src, VEX_SIMD_NONE);3342}33433344void Assembler::vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3345assert(VM_Version::supports_avx(), "");3346emit_vex_arith(0x57, dst, nds, src, VEX_SIMD_66, vector256);3347}33483349void Assembler::vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3350assert(VM_Version::supports_avx(), "");3351emit_vex_arith(0x57, dst, nds, src, VEX_SIMD_NONE, vector256);3352}33533354void Assembler::vxorpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3355assert(VM_Version::supports_avx(), "");3356emit_vex_arith(0x57, dst, nds, src, VEX_SIMD_66, vector256);3357}33583359void Assembler::vxorps(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3360assert(VM_Version::supports_avx(), "");3361emit_vex_arith(0x57, dst, nds, src, VEX_SIMD_NONE, vector256);3362}336333643365// Integer vector arithmetic3366void Assembler::paddb(XMMRegister dst, XMMRegister src) {3367NOT_LP64(assert(VM_Version::supports_sse2(), ""));3368emit_simd_arith(0xFC, dst, src, VEX_SIMD_66);3369}33703371void Assembler::paddw(XMMRegister dst, XMMRegister src) {3372NOT_LP64(assert(VM_Version::supports_sse2(), ""));3373emit_simd_arith(0xFD, dst, src, VEX_SIMD_66);3374}33753376void Assembler::paddd(XMMRegister dst, XMMRegister src) {3377NOT_LP64(assert(VM_Version::supports_sse2(), ""));3378emit_simd_arith(0xFE, dst, src, VEX_SIMD_66);3379}33803381void Assembler::paddq(XMMRegister dst, XMMRegister src) {3382NOT_LP64(assert(VM_Version::supports_sse2(), ""));3383emit_simd_arith(0xD4, dst, src, VEX_SIMD_66);3384}33853386void Assembler::vpaddb(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3387assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3388emit_vex_arith(0xFC, dst, nds, src, VEX_SIMD_66, vector256);3389}33903391void Assembler::vpaddw(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3392assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3393emit_vex_arith(0xFD, dst, nds, src, VEX_SIMD_66, vector256);3394}33953396void Assembler::vpaddd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3397assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3398emit_vex_arith(0xFE, dst, nds, src, VEX_SIMD_66, vector256);3399}34003401void Assembler::vpaddq(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3402assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3403emit_vex_arith(0xD4, dst, nds, src, VEX_SIMD_66, vector256);3404}34053406void Assembler::vpaddb(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3407assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3408emit_vex_arith(0xFC, dst, nds, src, VEX_SIMD_66, vector256);3409}34103411void Assembler::vpaddw(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3412assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3413emit_vex_arith(0xFD, dst, nds, src, VEX_SIMD_66, vector256);3414}34153416void Assembler::vpaddd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3417assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3418emit_vex_arith(0xFE, dst, nds, src, VEX_SIMD_66, vector256);3419}34203421void Assembler::vpaddq(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3422assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3423emit_vex_arith(0xD4, dst, nds, src, VEX_SIMD_66, vector256);3424}34253426void Assembler::psubb(XMMRegister dst, XMMRegister src) {3427NOT_LP64(assert(VM_Version::supports_sse2(), ""));3428emit_simd_arith(0xF8, dst, src, VEX_SIMD_66);3429}34303431void Assembler::psubw(XMMRegister dst, XMMRegister src) {3432NOT_LP64(assert(VM_Version::supports_sse2(), ""));3433emit_simd_arith(0xF9, dst, src, VEX_SIMD_66);3434}34353436void Assembler::psubd(XMMRegister dst, XMMRegister src) {3437NOT_LP64(assert(VM_Version::supports_sse2(), ""));3438emit_simd_arith(0xFA, dst, src, VEX_SIMD_66);3439}34403441void Assembler::psubq(XMMRegister dst, XMMRegister src) {3442NOT_LP64(assert(VM_Version::supports_sse2(), ""));3443emit_simd_arith(0xFB, dst, src, VEX_SIMD_66);3444}34453446void Assembler::vpsubb(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3447assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3448emit_vex_arith(0xF8, dst, nds, src, VEX_SIMD_66, vector256);3449}34503451void Assembler::vpsubw(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3452assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3453emit_vex_arith(0xF9, dst, nds, src, VEX_SIMD_66, vector256);3454}34553456void Assembler::vpsubd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3457assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3458emit_vex_arith(0xFA, dst, nds, src, VEX_SIMD_66, vector256);3459}34603461void Assembler::vpsubq(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3462assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3463emit_vex_arith(0xFB, dst, nds, src, VEX_SIMD_66, vector256);3464}34653466void Assembler::vpsubb(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3467assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3468emit_vex_arith(0xF8, dst, nds, src, VEX_SIMD_66, vector256);3469}34703471void Assembler::vpsubw(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3472assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3473emit_vex_arith(0xF9, dst, nds, src, VEX_SIMD_66, vector256);3474}34753476void Assembler::vpsubd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3477assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3478emit_vex_arith(0xFA, dst, nds, src, VEX_SIMD_66, vector256);3479}34803481void Assembler::vpsubq(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3482assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3483emit_vex_arith(0xFB, dst, nds, src, VEX_SIMD_66, vector256);3484}34853486void Assembler::pmullw(XMMRegister dst, XMMRegister src) {3487NOT_LP64(assert(VM_Version::supports_sse2(), ""));3488emit_simd_arith(0xD5, dst, src, VEX_SIMD_66);3489}34903491void Assembler::pmulld(XMMRegister dst, XMMRegister src) {3492assert(VM_Version::supports_sse4_1(), "");3493int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38);3494emit_int8(0x40);3495emit_int8((unsigned char)(0xC0 | encode));3496}34973498void Assembler::vpmullw(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3499assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3500emit_vex_arith(0xD5, dst, nds, src, VEX_SIMD_66, vector256);3501}35023503void Assembler::vpmulld(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3504assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3505int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_38);3506emit_int8(0x40);3507emit_int8((unsigned char)(0xC0 | encode));3508}35093510void Assembler::vpmullw(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3511assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3512emit_vex_arith(0xD5, dst, nds, src, VEX_SIMD_66, vector256);3513}35143515void Assembler::vpmulld(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3516assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3517InstructionMark im(this);3518int dst_enc = dst->encoding();3519int nds_enc = nds->is_valid() ? nds->encoding() : 0;3520vex_prefix(src, nds_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, false, vector256);3521emit_int8(0x40);3522emit_operand(dst, src);3523}35243525// Shift packed integers left by specified number of bits.3526void Assembler::psllw(XMMRegister dst, int shift) {3527NOT_LP64(assert(VM_Version::supports_sse2(), ""));3528// XMM6 is for /6 encoding: 66 0F 71 /6 ib3529int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66);3530emit_int8(0x71);3531emit_int8((unsigned char)(0xC0 | encode));3532emit_int8(shift & 0xFF);3533}35343535void Assembler::pslld(XMMRegister dst, int shift) {3536NOT_LP64(assert(VM_Version::supports_sse2(), ""));3537// XMM6 is for /6 encoding: 66 0F 72 /6 ib3538int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66);3539emit_int8(0x72);3540emit_int8((unsigned char)(0xC0 | encode));3541emit_int8(shift & 0xFF);3542}35433544void Assembler::psllq(XMMRegister dst, int shift) {3545NOT_LP64(assert(VM_Version::supports_sse2(), ""));3546// XMM6 is for /6 encoding: 66 0F 73 /6 ib3547int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66);3548emit_int8(0x73);3549emit_int8((unsigned char)(0xC0 | encode));3550emit_int8(shift & 0xFF);3551}35523553void Assembler::psllw(XMMRegister dst, XMMRegister shift) {3554NOT_LP64(assert(VM_Version::supports_sse2(), ""));3555emit_simd_arith(0xF1, dst, shift, VEX_SIMD_66);3556}35573558void Assembler::pslld(XMMRegister dst, XMMRegister shift) {3559NOT_LP64(assert(VM_Version::supports_sse2(), ""));3560emit_simd_arith(0xF2, dst, shift, VEX_SIMD_66);3561}35623563void Assembler::psllq(XMMRegister dst, XMMRegister shift) {3564NOT_LP64(assert(VM_Version::supports_sse2(), ""));3565emit_simd_arith(0xF3, dst, shift, VEX_SIMD_66);3566}35673568void Assembler::vpsllw(XMMRegister dst, XMMRegister src, int shift, bool vector256) {3569assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3570// XMM6 is for /6 encoding: 66 0F 71 /6 ib3571emit_vex_arith(0x71, xmm6, dst, src, VEX_SIMD_66, vector256);3572emit_int8(shift & 0xFF);3573}35743575void Assembler::vpslld(XMMRegister dst, XMMRegister src, int shift, bool vector256) {3576assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3577// XMM6 is for /6 encoding: 66 0F 72 /6 ib3578emit_vex_arith(0x72, xmm6, dst, src, VEX_SIMD_66, vector256);3579emit_int8(shift & 0xFF);3580}35813582void Assembler::vpsllq(XMMRegister dst, XMMRegister src, int shift, bool vector256) {3583assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3584// XMM6 is for /6 encoding: 66 0F 73 /6 ib3585emit_vex_arith(0x73, xmm6, dst, src, VEX_SIMD_66, vector256);3586emit_int8(shift & 0xFF);3587}35883589void Assembler::vpsllw(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256) {3590assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3591emit_vex_arith(0xF1, dst, src, shift, VEX_SIMD_66, vector256);3592}35933594void Assembler::vpslld(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256) {3595assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3596emit_vex_arith(0xF2, dst, src, shift, VEX_SIMD_66, vector256);3597}35983599void Assembler::vpsllq(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256) {3600assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3601emit_vex_arith(0xF3, dst, src, shift, VEX_SIMD_66, vector256);3602}36033604// Shift packed integers logically right by specified number of bits.3605void Assembler::psrlw(XMMRegister dst, int shift) {3606NOT_LP64(assert(VM_Version::supports_sse2(), ""));3607// XMM2 is for /2 encoding: 66 0F 71 /2 ib3608int encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66);3609emit_int8(0x71);3610emit_int8((unsigned char)(0xC0 | encode));3611emit_int8(shift & 0xFF);3612}36133614void Assembler::psrld(XMMRegister dst, int shift) {3615NOT_LP64(assert(VM_Version::supports_sse2(), ""));3616// XMM2 is for /2 encoding: 66 0F 72 /2 ib3617int encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66);3618emit_int8(0x72);3619emit_int8((unsigned char)(0xC0 | encode));3620emit_int8(shift & 0xFF);3621}36223623void Assembler::psrlq(XMMRegister dst, int shift) {3624// Do not confuse it with psrldq SSE2 instruction which3625// shifts 128 bit value in xmm register by number of bytes.3626NOT_LP64(assert(VM_Version::supports_sse2(), ""));3627// XMM2 is for /2 encoding: 66 0F 73 /2 ib3628int encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66);3629emit_int8(0x73);3630emit_int8((unsigned char)(0xC0 | encode));3631emit_int8(shift & 0xFF);3632}36333634void Assembler::psrlw(XMMRegister dst, XMMRegister shift) {3635NOT_LP64(assert(VM_Version::supports_sse2(), ""));3636emit_simd_arith(0xD1, dst, shift, VEX_SIMD_66);3637}36383639void Assembler::psrld(XMMRegister dst, XMMRegister shift) {3640NOT_LP64(assert(VM_Version::supports_sse2(), ""));3641emit_simd_arith(0xD2, dst, shift, VEX_SIMD_66);3642}36433644void Assembler::psrlq(XMMRegister dst, XMMRegister shift) {3645NOT_LP64(assert(VM_Version::supports_sse2(), ""));3646emit_simd_arith(0xD3, dst, shift, VEX_SIMD_66);3647}36483649void Assembler::vpsrlw(XMMRegister dst, XMMRegister src, int shift, bool vector256) {3650assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3651// XMM2 is for /2 encoding: 66 0F 73 /2 ib3652emit_vex_arith(0x71, xmm2, dst, src, VEX_SIMD_66, vector256);3653emit_int8(shift & 0xFF);3654}36553656void Assembler::vpsrld(XMMRegister dst, XMMRegister src, int shift, bool vector256) {3657assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3658// XMM2 is for /2 encoding: 66 0F 73 /2 ib3659emit_vex_arith(0x72, xmm2, dst, src, VEX_SIMD_66, vector256);3660emit_int8(shift & 0xFF);3661}36623663void Assembler::vpsrlq(XMMRegister dst, XMMRegister src, int shift, bool vector256) {3664assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3665// XMM2 is for /2 encoding: 66 0F 73 /2 ib3666emit_vex_arith(0x73, xmm2, dst, src, VEX_SIMD_66, vector256);3667emit_int8(shift & 0xFF);3668}36693670void Assembler::vpsrlw(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256) {3671assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3672emit_vex_arith(0xD1, dst, src, shift, VEX_SIMD_66, vector256);3673}36743675void Assembler::vpsrld(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256) {3676assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3677emit_vex_arith(0xD2, dst, src, shift, VEX_SIMD_66, vector256);3678}36793680void Assembler::vpsrlq(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256) {3681assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3682emit_vex_arith(0xD3, dst, src, shift, VEX_SIMD_66, vector256);3683}36843685// Shift packed integers arithmetically right by specified number of bits.3686void Assembler::psraw(XMMRegister dst, int shift) {3687NOT_LP64(assert(VM_Version::supports_sse2(), ""));3688// XMM4 is for /4 encoding: 66 0F 71 /4 ib3689int encode = simd_prefix_and_encode(xmm4, dst, dst, VEX_SIMD_66);3690emit_int8(0x71);3691emit_int8((unsigned char)(0xC0 | encode));3692emit_int8(shift & 0xFF);3693}36943695void Assembler::psrad(XMMRegister dst, int shift) {3696NOT_LP64(assert(VM_Version::supports_sse2(), ""));3697// XMM4 is for /4 encoding: 66 0F 72 /4 ib3698int encode = simd_prefix_and_encode(xmm4, dst, dst, VEX_SIMD_66);3699emit_int8(0x72);3700emit_int8((unsigned char)(0xC0 | encode));3701emit_int8(shift & 0xFF);3702}37033704void Assembler::psraw(XMMRegister dst, XMMRegister shift) {3705NOT_LP64(assert(VM_Version::supports_sse2(), ""));3706emit_simd_arith(0xE1, dst, shift, VEX_SIMD_66);3707}37083709void Assembler::psrad(XMMRegister dst, XMMRegister shift) {3710NOT_LP64(assert(VM_Version::supports_sse2(), ""));3711emit_simd_arith(0xE2, dst, shift, VEX_SIMD_66);3712}37133714void Assembler::vpsraw(XMMRegister dst, XMMRegister src, int shift, bool vector256) {3715assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3716// XMM4 is for /4 encoding: 66 0F 71 /4 ib3717emit_vex_arith(0x71, xmm4, dst, src, VEX_SIMD_66, vector256);3718emit_int8(shift & 0xFF);3719}37203721void Assembler::vpsrad(XMMRegister dst, XMMRegister src, int shift, bool vector256) {3722assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3723// XMM4 is for /4 encoding: 66 0F 71 /4 ib3724emit_vex_arith(0x72, xmm4, dst, src, VEX_SIMD_66, vector256);3725emit_int8(shift & 0xFF);3726}37273728void Assembler::vpsraw(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256) {3729assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3730emit_vex_arith(0xE1, dst, src, shift, VEX_SIMD_66, vector256);3731}37323733void Assembler::vpsrad(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256) {3734assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3735emit_vex_arith(0xE2, dst, src, shift, VEX_SIMD_66, vector256);3736}373737383739// AND packed integers3740void Assembler::pand(XMMRegister dst, XMMRegister src) {3741NOT_LP64(assert(VM_Version::supports_sse2(), ""));3742emit_simd_arith(0xDB, dst, src, VEX_SIMD_66);3743}37443745void Assembler::vpand(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3746assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3747emit_vex_arith(0xDB, dst, nds, src, VEX_SIMD_66, vector256);3748}37493750void Assembler::vpand(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3751assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3752emit_vex_arith(0xDB, dst, nds, src, VEX_SIMD_66, vector256);3753}37543755void Assembler::por(XMMRegister dst, XMMRegister src) {3756NOT_LP64(assert(VM_Version::supports_sse2(), ""));3757emit_simd_arith(0xEB, dst, src, VEX_SIMD_66);3758}37593760void Assembler::vpor(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3761assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3762emit_vex_arith(0xEB, dst, nds, src, VEX_SIMD_66, vector256);3763}37643765void Assembler::vpor(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3766assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3767emit_vex_arith(0xEB, dst, nds, src, VEX_SIMD_66, vector256);3768}37693770void Assembler::pxor(XMMRegister dst, XMMRegister src) {3771NOT_LP64(assert(VM_Version::supports_sse2(), ""));3772emit_simd_arith(0xEF, dst, src, VEX_SIMD_66);3773}37743775void Assembler::vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3776assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3777emit_vex_arith(0xEF, dst, nds, src, VEX_SIMD_66, vector256);3778}37793780void Assembler::vpxor(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3781assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3782emit_vex_arith(0xEF, dst, nds, src, VEX_SIMD_66, vector256);3783}378437853786void Assembler::vinsertf128h(XMMRegister dst, XMMRegister nds, XMMRegister src) {3787assert(VM_Version::supports_avx(), "");3788bool vector256 = true;3789int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_3A);3790emit_int8(0x18);3791emit_int8((unsigned char)(0xC0 | encode));3792// 0x00 - insert into lower 128 bits3793// 0x01 - insert into upper 128 bits3794emit_int8(0x01);3795}37963797void Assembler::vinsertf128h(XMMRegister dst, Address src) {3798assert(VM_Version::supports_avx(), "");3799InstructionMark im(this);3800bool vector256 = true;3801assert(dst != xnoreg, "sanity");3802int dst_enc = dst->encoding();3803// swap src<->dst for encoding3804vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, false, vector256);3805emit_int8(0x18);3806emit_operand(dst, src);3807// 0x01 - insert into upper 128 bits3808emit_int8(0x01);3809}38103811void Assembler::vextractf128h(Address dst, XMMRegister src) {3812assert(VM_Version::supports_avx(), "");3813InstructionMark im(this);3814bool vector256 = true;3815assert(src != xnoreg, "sanity");3816int src_enc = src->encoding();3817vex_prefix(dst, 0, src_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, false, vector256);3818emit_int8(0x19);3819emit_operand(src, dst);3820// 0x01 - extract from upper 128 bits3821emit_int8(0x01);3822}38233824void Assembler::vinserti128h(XMMRegister dst, XMMRegister nds, XMMRegister src) {3825assert(VM_Version::supports_avx2(), "");3826bool vector256 = true;3827int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_3A);3828emit_int8(0x38);3829emit_int8((unsigned char)(0xC0 | encode));3830// 0x00 - insert into lower 128 bits3831// 0x01 - insert into upper 128 bits3832emit_int8(0x01);3833}38343835void Assembler::vinserti128h(XMMRegister dst, Address src) {3836assert(VM_Version::supports_avx2(), "");3837InstructionMark im(this);3838bool vector256 = true;3839assert(dst != xnoreg, "sanity");3840int dst_enc = dst->encoding();3841// swap src<->dst for encoding3842vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, false, vector256);3843emit_int8(0x38);3844emit_operand(dst, src);3845// 0x01 - insert into upper 128 bits3846emit_int8(0x01);3847}38483849void Assembler::vextracti128h(Address dst, XMMRegister src) {3850assert(VM_Version::supports_avx2(), "");3851InstructionMark im(this);3852bool vector256 = true;3853assert(src != xnoreg, "sanity");3854int src_enc = src->encoding();3855vex_prefix(dst, 0, src_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, false, vector256);3856emit_int8(0x39);3857emit_operand(src, dst);3858// 0x01 - extract from upper 128 bits3859emit_int8(0x01);3860}38613862// duplicate 4-bytes integer data from src into 8 locations in dest3863void Assembler::vpbroadcastd(XMMRegister dst, XMMRegister src) {3864assert(VM_Version::supports_avx2(), "");3865bool vector256 = true;3866int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_38);3867emit_int8(0x58);3868emit_int8((unsigned char)(0xC0 | encode));3869}38703871// Carry-Less Multiplication Quadword3872void Assembler::pclmulqdq(XMMRegister dst, XMMRegister src, int mask) {3873assert(VM_Version::supports_clmul(), "");3874int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A);3875emit_int8(0x44);3876emit_int8((unsigned char)(0xC0 | encode));3877emit_int8((unsigned char)mask);3878}38793880// Carry-Less Multiplication Quadword3881void Assembler::vpclmulqdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int mask) {3882assert(VM_Version::supports_avx() && VM_Version::supports_clmul(), "");3883bool vector256 = false;3884int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_3A);3885emit_int8(0x44);3886emit_int8((unsigned char)(0xC0 | encode));3887emit_int8((unsigned char)mask);3888}38893890void Assembler::vzeroupper() {3891assert(VM_Version::supports_avx(), "");3892(void)vex_prefix_and_encode(xmm0, xmm0, xmm0, VEX_SIMD_NONE);3893emit_int8(0x77);3894}389538963897#ifndef _LP643898// 32bit only pieces of the assembler38993900void Assembler::cmp_literal32(Register src1, int32_t imm32, RelocationHolder const& rspec) {3901// NO PREFIX AS NEVER 64BIT3902InstructionMark im(this);3903emit_int8((unsigned char)0x81);3904emit_int8((unsigned char)(0xF8 | src1->encoding()));3905emit_data(imm32, rspec, 0);3906}39073908void Assembler::cmp_literal32(Address src1, int32_t imm32, RelocationHolder const& rspec) {3909// NO PREFIX AS NEVER 64BIT (not even 32bit versions of 64bit regs3910InstructionMark im(this);3911emit_int8((unsigned char)0x81);3912emit_operand(rdi, src1);3913emit_data(imm32, rspec, 0);3914}39153916// The 64-bit (32bit platform) cmpxchg compares the value at adr with the contents of rdx:rax,3917// and stores rcx:rbx into adr if so; otherwise, the value at adr is loaded3918// into rdx:rax. The ZF is set if the compared values were equal, and cleared otherwise.3919void Assembler::cmpxchg8(Address adr) {3920InstructionMark im(this);3921emit_int8(0x0F);3922emit_int8((unsigned char)0xC7);3923emit_operand(rcx, adr);3924}39253926void Assembler::decl(Register dst) {3927// Don't use it directly. Use MacroAssembler::decrementl() instead.3928emit_int8(0x48 | dst->encoding());3929}39303931#endif // _LP6439323933// 64bit typically doesn't use the x87 but needs to for the trig funcs39343935void Assembler::fabs() {3936emit_int8((unsigned char)0xD9);3937emit_int8((unsigned char)0xE1);3938}39393940void Assembler::fadd(int i) {3941emit_farith(0xD8, 0xC0, i);3942}39433944void Assembler::fadd_d(Address src) {3945InstructionMark im(this);3946emit_int8((unsigned char)0xDC);3947emit_operand32(rax, src);3948}39493950void Assembler::fadd_s(Address src) {3951InstructionMark im(this);3952emit_int8((unsigned char)0xD8);3953emit_operand32(rax, src);3954}39553956void Assembler::fadda(int i) {3957emit_farith(0xDC, 0xC0, i);3958}39593960void Assembler::faddp(int i) {3961emit_farith(0xDE, 0xC0, i);3962}39633964void Assembler::fchs() {3965emit_int8((unsigned char)0xD9);3966emit_int8((unsigned char)0xE0);3967}39683969void Assembler::fcom(int i) {3970emit_farith(0xD8, 0xD0, i);3971}39723973void Assembler::fcomp(int i) {3974emit_farith(0xD8, 0xD8, i);3975}39763977void Assembler::fcomp_d(Address src) {3978InstructionMark im(this);3979emit_int8((unsigned char)0xDC);3980emit_operand32(rbx, src);3981}39823983void Assembler::fcomp_s(Address src) {3984InstructionMark im(this);3985emit_int8((unsigned char)0xD8);3986emit_operand32(rbx, src);3987}39883989void Assembler::fcompp() {3990emit_int8((unsigned char)0xDE);3991emit_int8((unsigned char)0xD9);3992}39933994void Assembler::fcos() {3995emit_int8((unsigned char)0xD9);3996emit_int8((unsigned char)0xFF);3997}39983999void Assembler::fdecstp() {4000emit_int8((unsigned char)0xD9);4001emit_int8((unsigned char)0xF6);4002}40034004void Assembler::fdiv(int i) {4005emit_farith(0xD8, 0xF0, i);4006}40074008void Assembler::fdiv_d(Address src) {4009InstructionMark im(this);4010emit_int8((unsigned char)0xDC);4011emit_operand32(rsi, src);4012}40134014void Assembler::fdiv_s(Address src) {4015InstructionMark im(this);4016emit_int8((unsigned char)0xD8);4017emit_operand32(rsi, src);4018}40194020void Assembler::fdiva(int i) {4021emit_farith(0xDC, 0xF8, i);4022}40234024// Note: The Intel manual (Pentium Processor User's Manual, Vol.3, 1994)4025// is erroneous for some of the floating-point instructions below.40264027void Assembler::fdivp(int i) {4028emit_farith(0xDE, 0xF8, i); // ST(0) <- ST(0) / ST(1) and pop (Intel manual wrong)4029}40304031void Assembler::fdivr(int i) {4032emit_farith(0xD8, 0xF8, i);4033}40344035void Assembler::fdivr_d(Address src) {4036InstructionMark im(this);4037emit_int8((unsigned char)0xDC);4038emit_operand32(rdi, src);4039}40404041void Assembler::fdivr_s(Address src) {4042InstructionMark im(this);4043emit_int8((unsigned char)0xD8);4044emit_operand32(rdi, src);4045}40464047void Assembler::fdivra(int i) {4048emit_farith(0xDC, 0xF0, i);4049}40504051void Assembler::fdivrp(int i) {4052emit_farith(0xDE, 0xF0, i); // ST(0) <- ST(1) / ST(0) and pop (Intel manual wrong)4053}40544055void Assembler::ffree(int i) {4056emit_farith(0xDD, 0xC0, i);4057}40584059void Assembler::fild_d(Address adr) {4060InstructionMark im(this);4061emit_int8((unsigned char)0xDF);4062emit_operand32(rbp, adr);4063}40644065void Assembler::fild_s(Address adr) {4066InstructionMark im(this);4067emit_int8((unsigned char)0xDB);4068emit_operand32(rax, adr);4069}40704071void Assembler::fincstp() {4072emit_int8((unsigned char)0xD9);4073emit_int8((unsigned char)0xF7);4074}40754076void Assembler::finit() {4077emit_int8((unsigned char)0x9B);4078emit_int8((unsigned char)0xDB);4079emit_int8((unsigned char)0xE3);4080}40814082void Assembler::fist_s(Address adr) {4083InstructionMark im(this);4084emit_int8((unsigned char)0xDB);4085emit_operand32(rdx, adr);4086}40874088void Assembler::fistp_d(Address adr) {4089InstructionMark im(this);4090emit_int8((unsigned char)0xDF);4091emit_operand32(rdi, adr);4092}40934094void Assembler::fistp_s(Address adr) {4095InstructionMark im(this);4096emit_int8((unsigned char)0xDB);4097emit_operand32(rbx, adr);4098}40994100void Assembler::fld1() {4101emit_int8((unsigned char)0xD9);4102emit_int8((unsigned char)0xE8);4103}41044105void Assembler::fld_d(Address adr) {4106InstructionMark im(this);4107emit_int8((unsigned char)0xDD);4108emit_operand32(rax, adr);4109}41104111void Assembler::fld_s(Address adr) {4112InstructionMark im(this);4113emit_int8((unsigned char)0xD9);4114emit_operand32(rax, adr);4115}411641174118void Assembler::fld_s(int index) {4119emit_farith(0xD9, 0xC0, index);4120}41214122void Assembler::fld_x(Address adr) {4123InstructionMark im(this);4124emit_int8((unsigned char)0xDB);4125emit_operand32(rbp, adr);4126}41274128void Assembler::fldcw(Address src) {4129InstructionMark im(this);4130emit_int8((unsigned char)0xD9);4131emit_operand32(rbp, src);4132}41334134void Assembler::fldenv(Address src) {4135InstructionMark im(this);4136emit_int8((unsigned char)0xD9);4137emit_operand32(rsp, src);4138}41394140void Assembler::fldlg2() {4141emit_int8((unsigned char)0xD9);4142emit_int8((unsigned char)0xEC);4143}41444145void Assembler::fldln2() {4146emit_int8((unsigned char)0xD9);4147emit_int8((unsigned char)0xED);4148}41494150void Assembler::fldz() {4151emit_int8((unsigned char)0xD9);4152emit_int8((unsigned char)0xEE);4153}41544155void Assembler::flog() {4156fldln2();4157fxch();4158fyl2x();4159}41604161void Assembler::flog10() {4162fldlg2();4163fxch();4164fyl2x();4165}41664167void Assembler::fmul(int i) {4168emit_farith(0xD8, 0xC8, i);4169}41704171void Assembler::fmul_d(Address src) {4172InstructionMark im(this);4173emit_int8((unsigned char)0xDC);4174emit_operand32(rcx, src);4175}41764177void Assembler::fmul_s(Address src) {4178InstructionMark im(this);4179emit_int8((unsigned char)0xD8);4180emit_operand32(rcx, src);4181}41824183void Assembler::fmula(int i) {4184emit_farith(0xDC, 0xC8, i);4185}41864187void Assembler::fmulp(int i) {4188emit_farith(0xDE, 0xC8, i);4189}41904191void Assembler::fnsave(Address dst) {4192InstructionMark im(this);4193emit_int8((unsigned char)0xDD);4194emit_operand32(rsi, dst);4195}41964197void Assembler::fnstcw(Address src) {4198InstructionMark im(this);4199emit_int8((unsigned char)0x9B);4200emit_int8((unsigned char)0xD9);4201emit_operand32(rdi, src);4202}42034204void Assembler::fnstsw_ax() {4205emit_int8((unsigned char)0xDF);4206emit_int8((unsigned char)0xE0);4207}42084209void Assembler::fprem() {4210emit_int8((unsigned char)0xD9);4211emit_int8((unsigned char)0xF8);4212}42134214void Assembler::fprem1() {4215emit_int8((unsigned char)0xD9);4216emit_int8((unsigned char)0xF5);4217}42184219void Assembler::frstor(Address src) {4220InstructionMark im(this);4221emit_int8((unsigned char)0xDD);4222emit_operand32(rsp, src);4223}42244225void Assembler::fsin() {4226emit_int8((unsigned char)0xD9);4227emit_int8((unsigned char)0xFE);4228}42294230void Assembler::fsqrt() {4231emit_int8((unsigned char)0xD9);4232emit_int8((unsigned char)0xFA);4233}42344235void Assembler::fst_d(Address adr) {4236InstructionMark im(this);4237emit_int8((unsigned char)0xDD);4238emit_operand32(rdx, adr);4239}42404241void Assembler::fst_s(Address adr) {4242InstructionMark im(this);4243emit_int8((unsigned char)0xD9);4244emit_operand32(rdx, adr);4245}42464247void Assembler::fstp_d(Address adr) {4248InstructionMark im(this);4249emit_int8((unsigned char)0xDD);4250emit_operand32(rbx, adr);4251}42524253void Assembler::fstp_d(int index) {4254emit_farith(0xDD, 0xD8, index);4255}42564257void Assembler::fstp_s(Address adr) {4258InstructionMark im(this);4259emit_int8((unsigned char)0xD9);4260emit_operand32(rbx, adr);4261}42624263void Assembler::fstp_x(Address adr) {4264InstructionMark im(this);4265emit_int8((unsigned char)0xDB);4266emit_operand32(rdi, adr);4267}42684269void Assembler::fsub(int i) {4270emit_farith(0xD8, 0xE0, i);4271}42724273void Assembler::fsub_d(Address src) {4274InstructionMark im(this);4275emit_int8((unsigned char)0xDC);4276emit_operand32(rsp, src);4277}42784279void Assembler::fsub_s(Address src) {4280InstructionMark im(this);4281emit_int8((unsigned char)0xD8);4282emit_operand32(rsp, src);4283}42844285void Assembler::fsuba(int i) {4286emit_farith(0xDC, 0xE8, i);4287}42884289void Assembler::fsubp(int i) {4290emit_farith(0xDE, 0xE8, i); // ST(0) <- ST(0) - ST(1) and pop (Intel manual wrong)4291}42924293void Assembler::fsubr(int i) {4294emit_farith(0xD8, 0xE8, i);4295}42964297void Assembler::fsubr_d(Address src) {4298InstructionMark im(this);4299emit_int8((unsigned char)0xDC);4300emit_operand32(rbp, src);4301}43024303void Assembler::fsubr_s(Address src) {4304InstructionMark im(this);4305emit_int8((unsigned char)0xD8);4306emit_operand32(rbp, src);4307}43084309void Assembler::fsubra(int i) {4310emit_farith(0xDC, 0xE0, i);4311}43124313void Assembler::fsubrp(int i) {4314emit_farith(0xDE, 0xE0, i); // ST(0) <- ST(1) - ST(0) and pop (Intel manual wrong)4315}43164317void Assembler::ftan() {4318emit_int8((unsigned char)0xD9);4319emit_int8((unsigned char)0xF2);4320emit_int8((unsigned char)0xDD);4321emit_int8((unsigned char)0xD8);4322}43234324void Assembler::ftst() {4325emit_int8((unsigned char)0xD9);4326emit_int8((unsigned char)0xE4);4327}43284329void Assembler::fucomi(int i) {4330// make sure the instruction is supported (introduced for P6, together with cmov)4331guarantee(VM_Version::supports_cmov(), "illegal instruction");4332emit_farith(0xDB, 0xE8, i);4333}43344335void Assembler::fucomip(int i) {4336// make sure the instruction is supported (introduced for P6, together with cmov)4337guarantee(VM_Version::supports_cmov(), "illegal instruction");4338emit_farith(0xDF, 0xE8, i);4339}43404341void Assembler::fwait() {4342emit_int8((unsigned char)0x9B);4343}43444345void Assembler::fxch(int i) {4346emit_farith(0xD9, 0xC8, i);4347}43484349void Assembler::fyl2x() {4350emit_int8((unsigned char)0xD9);4351emit_int8((unsigned char)0xF1);4352}43534354void Assembler::frndint() {4355emit_int8((unsigned char)0xD9);4356emit_int8((unsigned char)0xFC);4357}43584359void Assembler::f2xm1() {4360emit_int8((unsigned char)0xD9);4361emit_int8((unsigned char)0xF0);4362}43634364void Assembler::fldl2e() {4365emit_int8((unsigned char)0xD9);4366emit_int8((unsigned char)0xEA);4367}43684369// SSE SIMD prefix byte values corresponding to VexSimdPrefix encoding.4370static int simd_pre[4] = { 0, 0x66, 0xF3, 0xF2 };4371// SSE opcode second byte values (first is 0x0F) corresponding to VexOpcode encoding.4372static int simd_opc[4] = { 0, 0, 0x38, 0x3A };43734374// Generate SSE legacy REX prefix and SIMD opcode based on VEX encoding.4375void Assembler::rex_prefix(Address adr, XMMRegister xreg, VexSimdPrefix pre, VexOpcode opc, bool rex_w) {4376if (pre > 0) {4377emit_int8(simd_pre[pre]);4378}4379if (rex_w) {4380prefixq(adr, xreg);4381} else {4382prefix(adr, xreg);4383}4384if (opc > 0) {4385emit_int8(0x0F);4386int opc2 = simd_opc[opc];4387if (opc2 > 0) {4388emit_int8(opc2);4389}4390}4391}43924393int Assembler::rex_prefix_and_encode(int dst_enc, int src_enc, VexSimdPrefix pre, VexOpcode opc, bool rex_w) {4394if (pre > 0) {4395emit_int8(simd_pre[pre]);4396}4397int encode = (rex_w) ? prefixq_and_encode(dst_enc, src_enc) :4398prefix_and_encode(dst_enc, src_enc);4399if (opc > 0) {4400emit_int8(0x0F);4401int opc2 = simd_opc[opc];4402if (opc2 > 0) {4403emit_int8(opc2);4404}4405}4406return encode;4407}440844094410void Assembler::vex_prefix(bool vex_r, bool vex_b, bool vex_x, bool vex_w, int nds_enc, VexSimdPrefix pre, VexOpcode opc, bool vector256) {4411if (vex_b || vex_x || vex_w || (opc == VEX_OPCODE_0F_38) || (opc == VEX_OPCODE_0F_3A)) {4412prefix(VEX_3bytes);44134414int byte1 = (vex_r ? VEX_R : 0) | (vex_x ? VEX_X : 0) | (vex_b ? VEX_B : 0);4415byte1 = (~byte1) & 0xE0;4416byte1 |= opc;4417emit_int8(byte1);44184419int byte2 = ((~nds_enc) & 0xf) << 3;4420byte2 |= (vex_w ? VEX_W : 0) | (vector256 ? 4 : 0) | pre;4421emit_int8(byte2);4422} else {4423prefix(VEX_2bytes);44244425int byte1 = vex_r ? VEX_R : 0;4426byte1 = (~byte1) & 0x80;4427byte1 |= ((~nds_enc) & 0xf) << 3;4428byte1 |= (vector256 ? 4 : 0) | pre;4429emit_int8(byte1);4430}4431}44324433void Assembler::vex_prefix(Address adr, int nds_enc, int xreg_enc, VexSimdPrefix pre, VexOpcode opc, bool vex_w, bool vector256){4434bool vex_r = (xreg_enc >= 8);4435bool vex_b = adr.base_needs_rex();4436bool vex_x = adr.index_needs_rex();4437vex_prefix(vex_r, vex_b, vex_x, vex_w, nds_enc, pre, opc, vector256);4438}44394440int Assembler::vex_prefix_and_encode(int dst_enc, int nds_enc, int src_enc, VexSimdPrefix pre, VexOpcode opc, bool vex_w, bool vector256) {4441bool vex_r = (dst_enc >= 8);4442bool vex_b = (src_enc >= 8);4443bool vex_x = false;4444vex_prefix(vex_r, vex_b, vex_x, vex_w, nds_enc, pre, opc, vector256);4445return (((dst_enc & 7) << 3) | (src_enc & 7));4446}444744484449void Assembler::simd_prefix(XMMRegister xreg, XMMRegister nds, Address adr, VexSimdPrefix pre, VexOpcode opc, bool rex_w, bool vector256) {4450if (UseAVX > 0) {4451int xreg_enc = xreg->encoding();4452int nds_enc = nds->is_valid() ? nds->encoding() : 0;4453vex_prefix(adr, nds_enc, xreg_enc, pre, opc, rex_w, vector256);4454} else {4455assert((nds == xreg) || (nds == xnoreg), "wrong sse encoding");4456rex_prefix(adr, xreg, pre, opc, rex_w);4457}4458}44594460int Assembler::simd_prefix_and_encode(XMMRegister dst, XMMRegister nds, XMMRegister src, VexSimdPrefix pre, VexOpcode opc, bool rex_w, bool vector256) {4461int dst_enc = dst->encoding();4462int src_enc = src->encoding();4463if (UseAVX > 0) {4464int nds_enc = nds->is_valid() ? nds->encoding() : 0;4465return vex_prefix_and_encode(dst_enc, nds_enc, src_enc, pre, opc, rex_w, vector256);4466} else {4467assert((nds == dst) || (nds == src) || (nds == xnoreg), "wrong sse encoding");4468return rex_prefix_and_encode(dst_enc, src_enc, pre, opc, rex_w);4469}4470}44714472void Assembler::emit_simd_arith(int opcode, XMMRegister dst, Address src, VexSimdPrefix pre) {4473InstructionMark im(this);4474simd_prefix(dst, dst, src, pre);4475emit_int8(opcode);4476emit_operand(dst, src);4477}44784479void Assembler::emit_simd_arith(int opcode, XMMRegister dst, XMMRegister src, VexSimdPrefix pre) {4480int encode = simd_prefix_and_encode(dst, dst, src, pre);4481emit_int8(opcode);4482emit_int8((unsigned char)(0xC0 | encode));4483}44844485// Versions with no second source register (non-destructive source).4486void Assembler::emit_simd_arith_nonds(int opcode, XMMRegister dst, Address src, VexSimdPrefix pre) {4487InstructionMark im(this);4488simd_prefix(dst, xnoreg, src, pre);4489emit_int8(opcode);4490emit_operand(dst, src);4491}44924493void Assembler::emit_simd_arith_nonds(int opcode, XMMRegister dst, XMMRegister src, VexSimdPrefix pre) {4494int encode = simd_prefix_and_encode(dst, xnoreg, src, pre);4495emit_int8(opcode);4496emit_int8((unsigned char)(0xC0 | encode));4497}44984499// 3-operands AVX instructions4500void Assembler::emit_vex_arith(int opcode, XMMRegister dst, XMMRegister nds,4501Address src, VexSimdPrefix pre, bool vector256) {4502InstructionMark im(this);4503vex_prefix(dst, nds, src, pre, vector256);4504emit_int8(opcode);4505emit_operand(dst, src);4506}45074508void Assembler::emit_vex_arith(int opcode, XMMRegister dst, XMMRegister nds,4509XMMRegister src, VexSimdPrefix pre, bool vector256) {4510int encode = vex_prefix_and_encode(dst, nds, src, pre, vector256);4511emit_int8(opcode);4512emit_int8((unsigned char)(0xC0 | encode));4513}45144515#ifndef _LP6445164517void Assembler::incl(Register dst) {4518// Don't use it directly. Use MacroAssembler::incrementl() instead.4519emit_int8(0x40 | dst->encoding());4520}45214522void Assembler::lea(Register dst, Address src) {4523leal(dst, src);4524}45254526void Assembler::mov_literal32(Address dst, int32_t imm32, RelocationHolder const& rspec) {4527InstructionMark im(this);4528emit_int8((unsigned char)0xC7);4529emit_operand(rax, dst);4530emit_data((int)imm32, rspec, 0);4531}45324533void Assembler::mov_literal32(Register dst, int32_t imm32, RelocationHolder const& rspec) {4534InstructionMark im(this);4535int encode = prefix_and_encode(dst->encoding());4536emit_int8((unsigned char)(0xB8 | encode));4537emit_data((int)imm32, rspec, 0);4538}45394540void Assembler::popa() { // 32bit4541emit_int8(0x61);4542}45434544void Assembler::push_literal32(int32_t imm32, RelocationHolder const& rspec) {4545InstructionMark im(this);4546emit_int8(0x68);4547emit_data(imm32, rspec, 0);4548}45494550void Assembler::pusha() { // 32bit4551emit_int8(0x60);4552}45534554void Assembler::set_byte_if_not_zero(Register dst) {4555emit_int8(0x0F);4556emit_int8((unsigned char)0x95);4557emit_int8((unsigned char)(0xE0 | dst->encoding()));4558}45594560void Assembler::shldl(Register dst, Register src) {4561emit_int8(0x0F);4562emit_int8((unsigned char)0xA5);4563emit_int8((unsigned char)(0xC0 | src->encoding() << 3 | dst->encoding()));4564}45654566void Assembler::shrdl(Register dst, Register src) {4567emit_int8(0x0F);4568emit_int8((unsigned char)0xAD);4569emit_int8((unsigned char)(0xC0 | src->encoding() << 3 | dst->encoding()));4570}45714572#else // LP6445734574void Assembler::set_byte_if_not_zero(Register dst) {4575int enc = prefix_and_encode(dst->encoding(), true);4576emit_int8(0x0F);4577emit_int8((unsigned char)0x95);4578emit_int8((unsigned char)(0xE0 | enc));4579}45804581// 64bit only pieces of the assembler4582// This should only be used by 64bit instructions that can use rip-relative4583// it cannot be used by instructions that want an immediate value.45844585bool Assembler::reachable(AddressLiteral adr) {4586int64_t disp;4587// None will force a 64bit literal to the code stream. Likely a placeholder4588// for something that will be patched later and we need to certain it will4589// always be reachable.4590if (adr.reloc() == relocInfo::none) {4591return false;4592}4593if (adr.reloc() == relocInfo::internal_word_type) {4594// This should be rip relative and easily reachable.4595return true;4596}4597if (adr.reloc() == relocInfo::virtual_call_type ||4598adr.reloc() == relocInfo::opt_virtual_call_type ||4599adr.reloc() == relocInfo::static_call_type ||4600adr.reloc() == relocInfo::static_stub_type ) {4601// This should be rip relative within the code cache and easily4602// reachable until we get huge code caches. (At which point4603// ic code is going to have issues).4604return true;4605}4606if (adr.reloc() != relocInfo::external_word_type &&4607adr.reloc() != relocInfo::poll_return_type && // these are really external_word but need special4608adr.reloc() != relocInfo::poll_type && // relocs to identify them4609adr.reloc() != relocInfo::runtime_call_type ) {4610return false;4611}46124613// Stress the correction code4614if (ForceUnreachable) {4615// Must be runtimecall reloc, see if it is in the codecache4616// Flipping stuff in the codecache to be unreachable causes issues4617// with things like inline caches where the additional instructions4618// are not handled.4619if (CodeCache::find_blob(adr._target) == NULL) {4620return false;4621}4622}4623// For external_word_type/runtime_call_type if it is reachable from where we4624// are now (possibly a temp buffer) and where we might end up4625// anywhere in the codeCache then we are always reachable.4626// This would have to change if we ever save/restore shared code4627// to be more pessimistic.4628disp = (int64_t)adr._target - ((int64_t)CodeCache::low_bound() + sizeof(int));4629if (!is_simm32(disp)) return false;4630disp = (int64_t)adr._target - ((int64_t)CodeCache::high_bound() + sizeof(int));4631if (!is_simm32(disp)) return false;46324633disp = (int64_t)adr._target - ((int64_t)pc() + sizeof(int));46344635// Because rip relative is a disp + address_of_next_instruction and we4636// don't know the value of address_of_next_instruction we apply a fudge factor4637// to make sure we will be ok no matter the size of the instruction we get placed into.4638// We don't have to fudge the checks above here because they are already worst case.46394640// 12 == override/rex byte, opcode byte, rm byte, sib byte, a 4-byte disp , 4-byte literal4641// + 4 because better safe than sorry.4642const int fudge = 12 + 4;4643if (disp < 0) {4644disp -= fudge;4645} else {4646disp += fudge;4647}4648return is_simm32(disp);4649}46504651// Check if the polling page is not reachable from the code cache using rip-relative4652// addressing.4653bool Assembler::is_polling_page_far() {4654intptr_t addr = (intptr_t)os::get_polling_page();4655return ForceUnreachable ||4656!is_simm32(addr - (intptr_t)CodeCache::low_bound()) ||4657!is_simm32(addr - (intptr_t)CodeCache::high_bound());4658}46594660void Assembler::emit_data64(jlong data,4661relocInfo::relocType rtype,4662int format) {4663if (rtype == relocInfo::none) {4664emit_int64(data);4665} else {4666emit_data64(data, Relocation::spec_simple(rtype), format);4667}4668}46694670void Assembler::emit_data64(jlong data,4671RelocationHolder const& rspec,4672int format) {4673assert(imm_operand == 0, "default format must be immediate in this file");4674assert(imm_operand == format, "must be immediate");4675assert(inst_mark() != NULL, "must be inside InstructionMark");4676// Do not use AbstractAssembler::relocate, which is not intended for4677// embedded words. Instead, relocate to the enclosing instruction.4678code_section()->relocate(inst_mark(), rspec, format);4679#ifdef ASSERT4680check_relocation(rspec, format);4681#endif4682emit_int64(data);4683}46844685int Assembler::prefix_and_encode(int reg_enc, bool byteinst) {4686if (reg_enc >= 8) {4687prefix(REX_B);4688reg_enc -= 8;4689} else if (byteinst && reg_enc >= 4) {4690prefix(REX);4691}4692return reg_enc;4693}46944695int Assembler::prefixq_and_encode(int reg_enc) {4696if (reg_enc < 8) {4697prefix(REX_W);4698} else {4699prefix(REX_WB);4700reg_enc -= 8;4701}4702return reg_enc;4703}47044705int Assembler::prefix_and_encode(int dst_enc, int src_enc, bool byteinst) {4706if (dst_enc < 8) {4707if (src_enc >= 8) {4708prefix(REX_B);4709src_enc -= 8;4710} else if (byteinst && src_enc >= 4) {4711prefix(REX);4712}4713} else {4714if (src_enc < 8) {4715prefix(REX_R);4716} else {4717prefix(REX_RB);4718src_enc -= 8;4719}4720dst_enc -= 8;4721}4722return dst_enc << 3 | src_enc;4723}47244725int Assembler::prefixq_and_encode(int dst_enc, int src_enc) {4726if (dst_enc < 8) {4727if (src_enc < 8) {4728prefix(REX_W);4729} else {4730prefix(REX_WB);4731src_enc -= 8;4732}4733} else {4734if (src_enc < 8) {4735prefix(REX_WR);4736} else {4737prefix(REX_WRB);4738src_enc -= 8;4739}4740dst_enc -= 8;4741}4742return dst_enc << 3 | src_enc;4743}47444745void Assembler::prefix(Register reg) {4746if (reg->encoding() >= 8) {4747prefix(REX_B);4748}4749}47504751void Assembler::prefix(Address adr) {4752if (adr.base_needs_rex()) {4753if (adr.index_needs_rex()) {4754prefix(REX_XB);4755} else {4756prefix(REX_B);4757}4758} else {4759if (adr.index_needs_rex()) {4760prefix(REX_X);4761}4762}4763}47644765void Assembler::prefixq(Address adr) {4766if (adr.base_needs_rex()) {4767if (adr.index_needs_rex()) {4768prefix(REX_WXB);4769} else {4770prefix(REX_WB);4771}4772} else {4773if (adr.index_needs_rex()) {4774prefix(REX_WX);4775} else {4776prefix(REX_W);4777}4778}4779}478047814782void Assembler::prefix(Address adr, Register reg, bool byteinst) {4783if (reg->encoding() < 8) {4784if (adr.base_needs_rex()) {4785if (adr.index_needs_rex()) {4786prefix(REX_XB);4787} else {4788prefix(REX_B);4789}4790} else {4791if (adr.index_needs_rex()) {4792prefix(REX_X);4793} else if (byteinst && reg->encoding() >= 4 ) {4794prefix(REX);4795}4796}4797} else {4798if (adr.base_needs_rex()) {4799if (adr.index_needs_rex()) {4800prefix(REX_RXB);4801} else {4802prefix(REX_RB);4803}4804} else {4805if (adr.index_needs_rex()) {4806prefix(REX_RX);4807} else {4808prefix(REX_R);4809}4810}4811}4812}48134814void Assembler::prefixq(Address adr, Register src) {4815if (src->encoding() < 8) {4816if (adr.base_needs_rex()) {4817if (adr.index_needs_rex()) {4818prefix(REX_WXB);4819} else {4820prefix(REX_WB);4821}4822} else {4823if (adr.index_needs_rex()) {4824prefix(REX_WX);4825} else {4826prefix(REX_W);4827}4828}4829} else {4830if (adr.base_needs_rex()) {4831if (adr.index_needs_rex()) {4832prefix(REX_WRXB);4833} else {4834prefix(REX_WRB);4835}4836} else {4837if (adr.index_needs_rex()) {4838prefix(REX_WRX);4839} else {4840prefix(REX_WR);4841}4842}4843}4844}48454846void Assembler::prefix(Address adr, XMMRegister reg) {4847if (reg->encoding() < 8) {4848if (adr.base_needs_rex()) {4849if (adr.index_needs_rex()) {4850prefix(REX_XB);4851} else {4852prefix(REX_B);4853}4854} else {4855if (adr.index_needs_rex()) {4856prefix(REX_X);4857}4858}4859} else {4860if (adr.base_needs_rex()) {4861if (adr.index_needs_rex()) {4862prefix(REX_RXB);4863} else {4864prefix(REX_RB);4865}4866} else {4867if (adr.index_needs_rex()) {4868prefix(REX_RX);4869} else {4870prefix(REX_R);4871}4872}4873}4874}48754876void Assembler::prefixq(Address adr, XMMRegister src) {4877if (src->encoding() < 8) {4878if (adr.base_needs_rex()) {4879if (adr.index_needs_rex()) {4880prefix(REX_WXB);4881} else {4882prefix(REX_WB);4883}4884} else {4885if (adr.index_needs_rex()) {4886prefix(REX_WX);4887} else {4888prefix(REX_W);4889}4890}4891} else {4892if (adr.base_needs_rex()) {4893if (adr.index_needs_rex()) {4894prefix(REX_WRXB);4895} else {4896prefix(REX_WRB);4897}4898} else {4899if (adr.index_needs_rex()) {4900prefix(REX_WRX);4901} else {4902prefix(REX_WR);4903}4904}4905}4906}49074908void Assembler::adcq(Register dst, int32_t imm32) {4909(void) prefixq_and_encode(dst->encoding());4910emit_arith(0x81, 0xD0, dst, imm32);4911}49124913void Assembler::adcq(Register dst, Address src) {4914InstructionMark im(this);4915prefixq(src, dst);4916emit_int8(0x13);4917emit_operand(dst, src);4918}49194920void Assembler::adcq(Register dst, Register src) {4921(void) prefixq_and_encode(dst->encoding(), src->encoding());4922emit_arith(0x13, 0xC0, dst, src);4923}49244925void Assembler::addq(Address dst, int32_t imm32) {4926InstructionMark im(this);4927prefixq(dst);4928emit_arith_operand(0x81, rax, dst,imm32);4929}49304931void Assembler::addq(Address dst, Register src) {4932InstructionMark im(this);4933prefixq(dst, src);4934emit_int8(0x01);4935emit_operand(src, dst);4936}49374938void Assembler::addq(Register dst, int32_t imm32) {4939(void) prefixq_and_encode(dst->encoding());4940emit_arith(0x81, 0xC0, dst, imm32);4941}49424943void Assembler::addq(Register dst, Address src) {4944InstructionMark im(this);4945prefixq(src, dst);4946emit_int8(0x03);4947emit_operand(dst, src);4948}49494950void Assembler::addq(Register dst, Register src) {4951(void) prefixq_and_encode(dst->encoding(), src->encoding());4952emit_arith(0x03, 0xC0, dst, src);4953}49544955void Assembler::adcxq(Register dst, Register src) {4956//assert(VM_Version::supports_adx(), "adx instructions not supported");4957emit_int8((unsigned char)0x66);4958int encode = prefixq_and_encode(dst->encoding(), src->encoding());4959emit_int8(0x0F);4960emit_int8(0x38);4961emit_int8((unsigned char)0xF6);4962emit_int8((unsigned char)(0xC0 | encode));4963}49644965void Assembler::adoxq(Register dst, Register src) {4966//assert(VM_Version::supports_adx(), "adx instructions not supported");4967emit_int8((unsigned char)0xF3);4968int encode = prefixq_and_encode(dst->encoding(), src->encoding());4969emit_int8(0x0F);4970emit_int8(0x38);4971emit_int8((unsigned char)0xF6);4972emit_int8((unsigned char)(0xC0 | encode));4973}49744975void Assembler::andq(Address dst, int32_t imm32) {4976InstructionMark im(this);4977prefixq(dst);4978emit_int8((unsigned char)0x81);4979emit_operand(rsp, dst, 4);4980emit_int32(imm32);4981}49824983void Assembler::andq(Register dst, int32_t imm32) {4984(void) prefixq_and_encode(dst->encoding());4985emit_arith(0x81, 0xE0, dst, imm32);4986}49874988void Assembler::andq(Register dst, Address src) {4989InstructionMark im(this);4990prefixq(src, dst);4991emit_int8(0x23);4992emit_operand(dst, src);4993}49944995void Assembler::andq(Register dst, Register src) {4996(void) prefixq_and_encode(dst->encoding(), src->encoding());4997emit_arith(0x23, 0xC0, dst, src);4998}49995000void Assembler::andnq(Register dst, Register src1, Register src2) {5001assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");5002int encode = vex_prefix_0F38_and_encode_q(dst, src1, src2);5003emit_int8((unsigned char)0xF2);5004emit_int8((unsigned char)(0xC0 | encode));5005}50065007void Assembler::andnq(Register dst, Register src1, Address src2) {5008InstructionMark im(this);5009assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");5010vex_prefix_0F38_q(dst, src1, src2);5011emit_int8((unsigned char)0xF2);5012emit_operand(dst, src2);5013}50145015void Assembler::bsfq(Register dst, Register src) {5016int encode = prefixq_and_encode(dst->encoding(), src->encoding());5017emit_int8(0x0F);5018emit_int8((unsigned char)0xBC);5019emit_int8((unsigned char)(0xC0 | encode));5020}50215022void Assembler::bsrq(Register dst, Register src) {5023int encode = prefixq_and_encode(dst->encoding(), src->encoding());5024emit_int8(0x0F);5025emit_int8((unsigned char)0xBD);5026emit_int8((unsigned char)(0xC0 | encode));5027}50285029void Assembler::bswapq(Register reg) {5030int encode = prefixq_and_encode(reg->encoding());5031emit_int8(0x0F);5032emit_int8((unsigned char)(0xC8 | encode));5033}50345035void Assembler::blsiq(Register dst, Register src) {5036assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");5037int encode = vex_prefix_0F38_and_encode_q(rbx, dst, src);5038emit_int8((unsigned char)0xF3);5039emit_int8((unsigned char)(0xC0 | encode));5040}50415042void Assembler::blsiq(Register dst, Address src) {5043InstructionMark im(this);5044assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");5045vex_prefix_0F38_q(rbx, dst, src);5046emit_int8((unsigned char)0xF3);5047emit_operand(rbx, src);5048}50495050void Assembler::blsmskq(Register dst, Register src) {5051assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");5052int encode = vex_prefix_0F38_and_encode_q(rdx, dst, src);5053emit_int8((unsigned char)0xF3);5054emit_int8((unsigned char)(0xC0 | encode));5055}50565057void Assembler::blsmskq(Register dst, Address src) {5058InstructionMark im(this);5059assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");5060vex_prefix_0F38_q(rdx, dst, src);5061emit_int8((unsigned char)0xF3);5062emit_operand(rdx, src);5063}50645065void Assembler::blsrq(Register dst, Register src) {5066assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");5067int encode = vex_prefix_0F38_and_encode_q(rcx, dst, src);5068emit_int8((unsigned char)0xF3);5069emit_int8((unsigned char)(0xC0 | encode));5070}50715072void Assembler::blsrq(Register dst, Address src) {5073InstructionMark im(this);5074assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");5075vex_prefix_0F38_q(rcx, dst, src);5076emit_int8((unsigned char)0xF3);5077emit_operand(rcx, src);5078}50795080void Assembler::cdqq() {5081prefix(REX_W);5082emit_int8((unsigned char)0x99);5083}50845085void Assembler::clflush(Address adr) {5086prefix(adr);5087emit_int8(0x0F);5088emit_int8((unsigned char)0xAE);5089emit_operand(rdi, adr);5090}50915092void Assembler::cmovq(Condition cc, Register dst, Register src) {5093int encode = prefixq_and_encode(dst->encoding(), src->encoding());5094emit_int8(0x0F);5095emit_int8(0x40 | cc);5096emit_int8((unsigned char)(0xC0 | encode));5097}50985099void Assembler::cmovq(Condition cc, Register dst, Address src) {5100InstructionMark im(this);5101prefixq(src, dst);5102emit_int8(0x0F);5103emit_int8(0x40 | cc);5104emit_operand(dst, src);5105}51065107void Assembler::cmpq(Address dst, int32_t imm32) {5108InstructionMark im(this);5109prefixq(dst);5110emit_int8((unsigned char)0x81);5111emit_operand(rdi, dst, 4);5112emit_int32(imm32);5113}51145115void Assembler::cmpq(Register dst, int32_t imm32) {5116(void) prefixq_and_encode(dst->encoding());5117emit_arith(0x81, 0xF8, dst, imm32);5118}51195120void Assembler::cmpq(Address dst, Register src) {5121InstructionMark im(this);5122prefixq(dst, src);5123emit_int8(0x3B);5124emit_operand(src, dst);5125}51265127void Assembler::cmpq(Register dst, Register src) {5128(void) prefixq_and_encode(dst->encoding(), src->encoding());5129emit_arith(0x3B, 0xC0, dst, src);5130}51315132void Assembler::cmpq(Register dst, Address src) {5133InstructionMark im(this);5134prefixq(src, dst);5135emit_int8(0x3B);5136emit_operand(dst, src);5137}51385139void Assembler::cmpxchgq(Register reg, Address adr) {5140InstructionMark im(this);5141prefixq(adr, reg);5142emit_int8(0x0F);5143emit_int8((unsigned char)0xB1);5144emit_operand(reg, adr);5145}51465147void Assembler::cvtsi2sdq(XMMRegister dst, Register src) {5148NOT_LP64(assert(VM_Version::supports_sse2(), ""));5149int encode = simd_prefix_and_encode_q(dst, dst, src, VEX_SIMD_F2);5150emit_int8(0x2A);5151emit_int8((unsigned char)(0xC0 | encode));5152}51535154void Assembler::cvtsi2sdq(XMMRegister dst, Address src) {5155NOT_LP64(assert(VM_Version::supports_sse2(), ""));5156InstructionMark im(this);5157simd_prefix_q(dst, dst, src, VEX_SIMD_F2);5158emit_int8(0x2A);5159emit_operand(dst, src);5160}51615162void Assembler::cvtsi2ssq(XMMRegister dst, Register src) {5163NOT_LP64(assert(VM_Version::supports_sse(), ""));5164int encode = simd_prefix_and_encode_q(dst, dst, src, VEX_SIMD_F3);5165emit_int8(0x2A);5166emit_int8((unsigned char)(0xC0 | encode));5167}51685169void Assembler::cvtsi2ssq(XMMRegister dst, Address src) {5170NOT_LP64(assert(VM_Version::supports_sse(), ""));5171InstructionMark im(this);5172simd_prefix_q(dst, dst, src, VEX_SIMD_F3);5173emit_int8(0x2A);5174emit_operand(dst, src);5175}51765177void Assembler::cvttsd2siq(Register dst, XMMRegister src) {5178NOT_LP64(assert(VM_Version::supports_sse2(), ""));5179int encode = simd_prefix_and_encode_q(dst, src, VEX_SIMD_F2);5180emit_int8(0x2C);5181emit_int8((unsigned char)(0xC0 | encode));5182}51835184void Assembler::cvttss2siq(Register dst, XMMRegister src) {5185NOT_LP64(assert(VM_Version::supports_sse(), ""));5186int encode = simd_prefix_and_encode_q(dst, src, VEX_SIMD_F3);5187emit_int8(0x2C);5188emit_int8((unsigned char)(0xC0 | encode));5189}51905191void Assembler::decl(Register dst) {5192// Don't use it directly. Use MacroAssembler::decrementl() instead.5193// Use two-byte form (one-byte form is a REX prefix in 64-bit mode)5194int encode = prefix_and_encode(dst->encoding());5195emit_int8((unsigned char)0xFF);5196emit_int8((unsigned char)(0xC8 | encode));5197}51985199void Assembler::decq(Register dst) {5200// Don't use it directly. Use MacroAssembler::decrementq() instead.5201// Use two-byte form (one-byte from is a REX prefix in 64-bit mode)5202int encode = prefixq_and_encode(dst->encoding());5203emit_int8((unsigned char)0xFF);5204emit_int8(0xC8 | encode);5205}52065207void Assembler::decq(Address dst) {5208// Don't use it directly. Use MacroAssembler::decrementq() instead.5209InstructionMark im(this);5210prefixq(dst);5211emit_int8((unsigned char)0xFF);5212emit_operand(rcx, dst);5213}52145215void Assembler::fxrstor(Address src) {5216prefixq(src);5217emit_int8(0x0F);5218emit_int8((unsigned char)0xAE);5219emit_operand(as_Register(1), src);5220}52215222void Assembler::fxsave(Address dst) {5223prefixq(dst);5224emit_int8(0x0F);5225emit_int8((unsigned char)0xAE);5226emit_operand(as_Register(0), dst);5227}52285229void Assembler::idivq(Register src) {5230int encode = prefixq_and_encode(src->encoding());5231emit_int8((unsigned char)0xF7);5232emit_int8((unsigned char)(0xF8 | encode));5233}52345235void Assembler::imulq(Register dst, Register src) {5236int encode = prefixq_and_encode(dst->encoding(), src->encoding());5237emit_int8(0x0F);5238emit_int8((unsigned char)0xAF);5239emit_int8((unsigned char)(0xC0 | encode));5240}52415242void Assembler::imulq(Register dst, Register src, int value) {5243int encode = prefixq_and_encode(dst->encoding(), src->encoding());5244if (is8bit(value)) {5245emit_int8(0x6B);5246emit_int8((unsigned char)(0xC0 | encode));5247emit_int8(value & 0xFF);5248} else {5249emit_int8(0x69);5250emit_int8((unsigned char)(0xC0 | encode));5251emit_int32(value);5252}5253}52545255void Assembler::imulq(Register dst, Address src) {5256InstructionMark im(this);5257prefixq(src, dst);5258emit_int8(0x0F);5259emit_int8((unsigned char) 0xAF);5260emit_operand(dst, src);5261}52625263void Assembler::incl(Register dst) {5264// Don't use it directly. Use MacroAssembler::incrementl() instead.5265// Use two-byte form (one-byte from is a REX prefix in 64-bit mode)5266int encode = prefix_and_encode(dst->encoding());5267emit_int8((unsigned char)0xFF);5268emit_int8((unsigned char)(0xC0 | encode));5269}52705271void Assembler::incq(Register dst) {5272// Don't use it directly. Use MacroAssembler::incrementq() instead.5273// Use two-byte form (one-byte from is a REX prefix in 64-bit mode)5274int encode = prefixq_and_encode(dst->encoding());5275emit_int8((unsigned char)0xFF);5276emit_int8((unsigned char)(0xC0 | encode));5277}52785279void Assembler::incq(Address dst) {5280// Don't use it directly. Use MacroAssembler::incrementq() instead.5281InstructionMark im(this);5282prefixq(dst);5283emit_int8((unsigned char)0xFF);5284emit_operand(rax, dst);5285}52865287void Assembler::lea(Register dst, Address src) {5288leaq(dst, src);5289}52905291void Assembler::leaq(Register dst, Address src) {5292InstructionMark im(this);5293prefixq(src, dst);5294emit_int8((unsigned char)0x8D);5295emit_operand(dst, src);5296}52975298void Assembler::mov64(Register dst, int64_t imm64) {5299InstructionMark im(this);5300int encode = prefixq_and_encode(dst->encoding());5301emit_int8((unsigned char)(0xB8 | encode));5302emit_int64(imm64);5303}53045305void Assembler::mov_literal64(Register dst, intptr_t imm64, RelocationHolder const& rspec) {5306InstructionMark im(this);5307int encode = prefixq_and_encode(dst->encoding());5308emit_int8(0xB8 | encode);5309emit_data64(imm64, rspec);5310}53115312void Assembler::mov_narrow_oop(Register dst, int32_t imm32, RelocationHolder const& rspec) {5313InstructionMark im(this);5314int encode = prefix_and_encode(dst->encoding());5315emit_int8((unsigned char)(0xB8 | encode));5316emit_data((int)imm32, rspec, narrow_oop_operand);5317}53185319void Assembler::mov_narrow_oop(Address dst, int32_t imm32, RelocationHolder const& rspec) {5320InstructionMark im(this);5321prefix(dst);5322emit_int8((unsigned char)0xC7);5323emit_operand(rax, dst, 4);5324emit_data((int)imm32, rspec, narrow_oop_operand);5325}53265327void Assembler::cmp_narrow_oop(Register src1, int32_t imm32, RelocationHolder const& rspec) {5328InstructionMark im(this);5329int encode = prefix_and_encode(src1->encoding());5330emit_int8((unsigned char)0x81);5331emit_int8((unsigned char)(0xF8 | encode));5332emit_data((int)imm32, rspec, narrow_oop_operand);5333}53345335void Assembler::cmp_narrow_oop(Address src1, int32_t imm32, RelocationHolder const& rspec) {5336InstructionMark im(this);5337prefix(src1);5338emit_int8((unsigned char)0x81);5339emit_operand(rax, src1, 4);5340emit_data((int)imm32, rspec, narrow_oop_operand);5341}53425343void Assembler::lzcntq(Register dst, Register src) {5344assert(VM_Version::supports_lzcnt(), "encoding is treated as BSR");5345emit_int8((unsigned char)0xF3);5346int encode = prefixq_and_encode(dst->encoding(), src->encoding());5347emit_int8(0x0F);5348emit_int8((unsigned char)0xBD);5349emit_int8((unsigned char)(0xC0 | encode));5350}53515352void Assembler::movdq(XMMRegister dst, Register src) {5353// table D-1 says MMX/SSE25354NOT_LP64(assert(VM_Version::supports_sse2(), ""));5355int encode = simd_prefix_and_encode_q(dst, src, VEX_SIMD_66);5356emit_int8(0x6E);5357emit_int8((unsigned char)(0xC0 | encode));5358}53595360void Assembler::movdq(Register dst, XMMRegister src) {5361// table D-1 says MMX/SSE25362NOT_LP64(assert(VM_Version::supports_sse2(), ""));5363// swap src/dst to get correct prefix5364int encode = simd_prefix_and_encode_q(src, dst, VEX_SIMD_66);5365emit_int8(0x7E);5366emit_int8((unsigned char)(0xC0 | encode));5367}53685369void Assembler::movq(Register dst, Register src) {5370int encode = prefixq_and_encode(dst->encoding(), src->encoding());5371emit_int8((unsigned char)0x8B);5372emit_int8((unsigned char)(0xC0 | encode));5373}53745375void Assembler::movq(Register dst, Address src) {5376InstructionMark im(this);5377prefixq(src, dst);5378emit_int8((unsigned char)0x8B);5379emit_operand(dst, src);5380}53815382void Assembler::movq(Address dst, Register src) {5383InstructionMark im(this);5384prefixq(dst, src);5385emit_int8((unsigned char)0x89);5386emit_operand(src, dst);5387}53885389void Assembler::movsbq(Register dst, Address src) {5390InstructionMark im(this);5391prefixq(src, dst);5392emit_int8(0x0F);5393emit_int8((unsigned char)0xBE);5394emit_operand(dst, src);5395}53965397void Assembler::movsbq(Register dst, Register src) {5398int encode = prefixq_and_encode(dst->encoding(), src->encoding());5399emit_int8(0x0F);5400emit_int8((unsigned char)0xBE);5401emit_int8((unsigned char)(0xC0 | encode));5402}54035404void Assembler::movslq(Register dst, int32_t imm32) {5405// dbx shows movslq(rcx, 3) as movq $0x0000000049000000,(%rbx)5406// and movslq(r8, 3); as movl $0x0000000048000000,(%rbx)5407// as a result we shouldn't use until tested at runtime...5408ShouldNotReachHere();5409InstructionMark im(this);5410int encode = prefixq_and_encode(dst->encoding());5411emit_int8((unsigned char)(0xC7 | encode));5412emit_int32(imm32);5413}54145415void Assembler::movslq(Address dst, int32_t imm32) {5416assert(is_simm32(imm32), "lost bits");5417InstructionMark im(this);5418prefixq(dst);5419emit_int8((unsigned char)0xC7);5420emit_operand(rax, dst, 4);5421emit_int32(imm32);5422}54235424void Assembler::movslq(Register dst, Address src) {5425InstructionMark im(this);5426prefixq(src, dst);5427emit_int8(0x63);5428emit_operand(dst, src);5429}54305431void Assembler::movslq(Register dst, Register src) {5432int encode = prefixq_and_encode(dst->encoding(), src->encoding());5433emit_int8(0x63);5434emit_int8((unsigned char)(0xC0 | encode));5435}54365437void Assembler::movswq(Register dst, Address src) {5438InstructionMark im(this);5439prefixq(src, dst);5440emit_int8(0x0F);5441emit_int8((unsigned char)0xBF);5442emit_operand(dst, src);5443}54445445void Assembler::movswq(Register dst, Register src) {5446int encode = prefixq_and_encode(dst->encoding(), src->encoding());5447emit_int8((unsigned char)0x0F);5448emit_int8((unsigned char)0xBF);5449emit_int8((unsigned char)(0xC0 | encode));5450}54515452void Assembler::movzbq(Register dst, Address src) {5453InstructionMark im(this);5454prefixq(src, dst);5455emit_int8((unsigned char)0x0F);5456emit_int8((unsigned char)0xB6);5457emit_operand(dst, src);5458}54595460void Assembler::movzbq(Register dst, Register src) {5461int encode = prefixq_and_encode(dst->encoding(), src->encoding());5462emit_int8(0x0F);5463emit_int8((unsigned char)0xB6);5464emit_int8(0xC0 | encode);5465}54665467void Assembler::movzwq(Register dst, Address src) {5468InstructionMark im(this);5469prefixq(src, dst);5470emit_int8((unsigned char)0x0F);5471emit_int8((unsigned char)0xB7);5472emit_operand(dst, src);5473}54745475void Assembler::movzwq(Register dst, Register src) {5476int encode = prefixq_and_encode(dst->encoding(), src->encoding());5477emit_int8((unsigned char)0x0F);5478emit_int8((unsigned char)0xB7);5479emit_int8((unsigned char)(0xC0 | encode));5480}54815482void Assembler::mulq(Address src) {5483InstructionMark im(this);5484prefixq(src);5485emit_int8((unsigned char)0xF7);5486emit_operand(rsp, src);5487}54885489void Assembler::mulq(Register src) {5490int encode = prefixq_and_encode(src->encoding());5491emit_int8((unsigned char)0xF7);5492emit_int8((unsigned char)(0xE0 | encode));5493}54945495void Assembler::mulxq(Register dst1, Register dst2, Register src) {5496assert(VM_Version::supports_bmi2(), "bit manipulation instructions not supported");5497int encode = vex_prefix_and_encode(dst1->encoding(), dst2->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F_38, true, false);5498emit_int8((unsigned char)0xF6);5499emit_int8((unsigned char)(0xC0 | encode));5500}55015502void Assembler::negq(Register dst) {5503int encode = prefixq_and_encode(dst->encoding());5504emit_int8((unsigned char)0xF7);5505emit_int8((unsigned char)(0xD8 | encode));5506}55075508void Assembler::notq(Register dst) {5509int encode = prefixq_and_encode(dst->encoding());5510emit_int8((unsigned char)0xF7);5511emit_int8((unsigned char)(0xD0 | encode));5512}55135514void Assembler::orq(Address dst, int32_t imm32) {5515InstructionMark im(this);5516prefixq(dst);5517emit_int8((unsigned char)0x81);5518emit_operand(rcx, dst, 4);5519emit_int32(imm32);5520}55215522void Assembler::orq(Register dst, int32_t imm32) {5523(void) prefixq_and_encode(dst->encoding());5524emit_arith(0x81, 0xC8, dst, imm32);5525}55265527void Assembler::orq(Register dst, Address src) {5528InstructionMark im(this);5529prefixq(src, dst);5530emit_int8(0x0B);5531emit_operand(dst, src);5532}55335534void Assembler::orq(Register dst, Register src) {5535(void) prefixq_and_encode(dst->encoding(), src->encoding());5536emit_arith(0x0B, 0xC0, dst, src);5537}55385539void Assembler::popa() { // 64bit5540movq(r15, Address(rsp, 0));5541movq(r14, Address(rsp, wordSize));5542movq(r13, Address(rsp, 2 * wordSize));5543movq(r12, Address(rsp, 3 * wordSize));5544movq(r11, Address(rsp, 4 * wordSize));5545movq(r10, Address(rsp, 5 * wordSize));5546movq(r9, Address(rsp, 6 * wordSize));5547movq(r8, Address(rsp, 7 * wordSize));5548movq(rdi, Address(rsp, 8 * wordSize));5549movq(rsi, Address(rsp, 9 * wordSize));5550movq(rbp, Address(rsp, 10 * wordSize));5551// skip rsp5552movq(rbx, Address(rsp, 12 * wordSize));5553movq(rdx, Address(rsp, 13 * wordSize));5554movq(rcx, Address(rsp, 14 * wordSize));5555movq(rax, Address(rsp, 15 * wordSize));55565557addq(rsp, 16 * wordSize);5558}55595560void Assembler::popcntq(Register dst, Address src) {5561assert(VM_Version::supports_popcnt(), "must support");5562InstructionMark im(this);5563emit_int8((unsigned char)0xF3);5564prefixq(src, dst);5565emit_int8((unsigned char)0x0F);5566emit_int8((unsigned char)0xB8);5567emit_operand(dst, src);5568}55695570void Assembler::popcntq(Register dst, Register src) {5571assert(VM_Version::supports_popcnt(), "must support");5572emit_int8((unsigned char)0xF3);5573int encode = prefixq_and_encode(dst->encoding(), src->encoding());5574emit_int8((unsigned char)0x0F);5575emit_int8((unsigned char)0xB8);5576emit_int8((unsigned char)(0xC0 | encode));5577}55785579void Assembler::popq(Address dst) {5580InstructionMark im(this);5581prefixq(dst);5582emit_int8((unsigned char)0x8F);5583emit_operand(rax, dst);5584}55855586void Assembler::pusha() { // 64bit5587// we have to store original rsp. ABI says that 128 bytes5588// below rsp are local scratch.5589movq(Address(rsp, -5 * wordSize), rsp);55905591subq(rsp, 16 * wordSize);55925593movq(Address(rsp, 15 * wordSize), rax);5594movq(Address(rsp, 14 * wordSize), rcx);5595movq(Address(rsp, 13 * wordSize), rdx);5596movq(Address(rsp, 12 * wordSize), rbx);5597// skip rsp5598movq(Address(rsp, 10 * wordSize), rbp);5599movq(Address(rsp, 9 * wordSize), rsi);5600movq(Address(rsp, 8 * wordSize), rdi);5601movq(Address(rsp, 7 * wordSize), r8);5602movq(Address(rsp, 6 * wordSize), r9);5603movq(Address(rsp, 5 * wordSize), r10);5604movq(Address(rsp, 4 * wordSize), r11);5605movq(Address(rsp, 3 * wordSize), r12);5606movq(Address(rsp, 2 * wordSize), r13);5607movq(Address(rsp, wordSize), r14);5608movq(Address(rsp, 0), r15);5609}56105611void Assembler::pushq(Address src) {5612InstructionMark im(this);5613prefixq(src);5614emit_int8((unsigned char)0xFF);5615emit_operand(rsi, src);5616}56175618void Assembler::rclq(Register dst, int imm8) {5619assert(isShiftCount(imm8 >> 1), "illegal shift count");5620int encode = prefixq_and_encode(dst->encoding());5621if (imm8 == 1) {5622emit_int8((unsigned char)0xD1);5623emit_int8((unsigned char)(0xD0 | encode));5624} else {5625emit_int8((unsigned char)0xC1);5626emit_int8((unsigned char)(0xD0 | encode));5627emit_int8(imm8);5628}5629}56305631void Assembler::rcrq(Register dst, int imm8) {5632assert(isShiftCount(imm8 >> 1), "illegal shift count");5633int encode = prefixq_and_encode(dst->encoding());5634if (imm8 == 1) {5635emit_int8((unsigned char)0xD1);5636emit_int8((unsigned char)(0xD8 | encode));5637} else {5638emit_int8((unsigned char)0xC1);5639emit_int8((unsigned char)(0xD8 | encode));5640emit_int8(imm8);5641}5642}56435644void Assembler::rorq(Register dst, int imm8) {5645assert(isShiftCount(imm8 >> 1), "illegal shift count");5646int encode = prefixq_and_encode(dst->encoding());5647if (imm8 == 1) {5648emit_int8((unsigned char)0xD1);5649emit_int8((unsigned char)(0xC8 | encode));5650} else {5651emit_int8((unsigned char)0xC1);5652emit_int8((unsigned char)(0xc8 | encode));5653emit_int8(imm8);5654}5655}56565657void Assembler::rorxq(Register dst, Register src, int imm8) {5658assert(VM_Version::supports_bmi2(), "bit manipulation instructions not supported");5659int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F_3A, true, false);5660emit_int8((unsigned char)0xF0);5661emit_int8((unsigned char)(0xC0 | encode));5662emit_int8(imm8);5663}56645665void Assembler::sarq(Register dst, int imm8) {5666assert(isShiftCount(imm8 >> 1), "illegal shift count");5667int encode = prefixq_and_encode(dst->encoding());5668if (imm8 == 1) {5669emit_int8((unsigned char)0xD1);5670emit_int8((unsigned char)(0xF8 | encode));5671} else {5672emit_int8((unsigned char)0xC1);5673emit_int8((unsigned char)(0xF8 | encode));5674emit_int8(imm8);5675}5676}56775678void Assembler::sarq(Register dst) {5679int encode = prefixq_and_encode(dst->encoding());5680emit_int8((unsigned char)0xD3);5681emit_int8((unsigned char)(0xF8 | encode));5682}56835684void Assembler::sbbq(Address dst, int32_t imm32) {5685InstructionMark im(this);5686prefixq(dst);5687emit_arith_operand(0x81, rbx, dst, imm32);5688}56895690void Assembler::sbbq(Register dst, int32_t imm32) {5691(void) prefixq_and_encode(dst->encoding());5692emit_arith(0x81, 0xD8, dst, imm32);5693}56945695void Assembler::sbbq(Register dst, Address src) {5696InstructionMark im(this);5697prefixq(src, dst);5698emit_int8(0x1B);5699emit_operand(dst, src);5700}57015702void Assembler::sbbq(Register dst, Register src) {5703(void) prefixq_and_encode(dst->encoding(), src->encoding());5704emit_arith(0x1B, 0xC0, dst, src);5705}57065707void Assembler::shlq(Register dst, int imm8) {5708assert(isShiftCount(imm8 >> 1), "illegal shift count");5709int encode = prefixq_and_encode(dst->encoding());5710if (imm8 == 1) {5711emit_int8((unsigned char)0xD1);5712emit_int8((unsigned char)(0xE0 | encode));5713} else {5714emit_int8((unsigned char)0xC1);5715emit_int8((unsigned char)(0xE0 | encode));5716emit_int8(imm8);5717}5718}57195720void Assembler::shlq(Register dst) {5721int encode = prefixq_and_encode(dst->encoding());5722emit_int8((unsigned char)0xD3);5723emit_int8((unsigned char)(0xE0 | encode));5724}57255726void Assembler::shrq(Register dst, int imm8) {5727assert(isShiftCount(imm8 >> 1), "illegal shift count");5728int encode = prefixq_and_encode(dst->encoding());5729emit_int8((unsigned char)0xC1);5730emit_int8((unsigned char)(0xE8 | encode));5731emit_int8(imm8);5732}57335734void Assembler::shrq(Register dst) {5735int encode = prefixq_and_encode(dst->encoding());5736emit_int8((unsigned char)0xD3);5737emit_int8(0xE8 | encode);5738}57395740void Assembler::subq(Address dst, int32_t imm32) {5741InstructionMark im(this);5742prefixq(dst);5743emit_arith_operand(0x81, rbp, dst, imm32);5744}57455746void Assembler::subq(Address dst, Register src) {5747InstructionMark im(this);5748prefixq(dst, src);5749emit_int8(0x29);5750emit_operand(src, dst);5751}57525753void Assembler::subq(Register dst, int32_t imm32) {5754(void) prefixq_and_encode(dst->encoding());5755emit_arith(0x81, 0xE8, dst, imm32);5756}57575758// Force generation of a 4 byte immediate value even if it fits into 8bit5759void Assembler::subq_imm32(Register dst, int32_t imm32) {5760(void) prefixq_and_encode(dst->encoding());5761emit_arith_imm32(0x81, 0xE8, dst, imm32);5762}57635764void Assembler::subq(Register dst, Address src) {5765InstructionMark im(this);5766prefixq(src, dst);5767emit_int8(0x2B);5768emit_operand(dst, src);5769}57705771void Assembler::subq(Register dst, Register src) {5772(void) prefixq_and_encode(dst->encoding(), src->encoding());5773emit_arith(0x2B, 0xC0, dst, src);5774}57755776void Assembler::testq(Register dst, int32_t imm32) {5777// not using emit_arith because test5778// doesn't support sign-extension of5779// 8bit operands5780int encode = dst->encoding();5781if (encode == 0) {5782prefix(REX_W);5783emit_int8((unsigned char)0xA9);5784} else {5785encode = prefixq_and_encode(encode);5786emit_int8((unsigned char)0xF7);5787emit_int8((unsigned char)(0xC0 | encode));5788}5789emit_int32(imm32);5790}57915792void Assembler::testq(Register dst, Register src) {5793(void) prefixq_and_encode(dst->encoding(), src->encoding());5794emit_arith(0x85, 0xC0, dst, src);5795}57965797void Assembler::xaddq(Address dst, Register src) {5798InstructionMark im(this);5799prefixq(dst, src);5800emit_int8(0x0F);5801emit_int8((unsigned char)0xC1);5802emit_operand(src, dst);5803}58045805void Assembler::xchgq(Register dst, Address src) {5806InstructionMark im(this);5807prefixq(src, dst);5808emit_int8((unsigned char)0x87);5809emit_operand(dst, src);5810}58115812void Assembler::xchgq(Register dst, Register src) {5813int encode = prefixq_and_encode(dst->encoding(), src->encoding());5814emit_int8((unsigned char)0x87);5815emit_int8((unsigned char)(0xc0 | encode));5816}58175818void Assembler::xorq(Register dst, Register src) {5819(void) prefixq_and_encode(dst->encoding(), src->encoding());5820emit_arith(0x33, 0xC0, dst, src);5821}58225823void Assembler::xorq(Register dst, Address src) {5824InstructionMark im(this);5825prefixq(src, dst);5826emit_int8(0x33);5827emit_operand(dst, src);5828}58295830#endif // !LP64583158325833