Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/cpu/x86/vm/assembler_x86.cpp
32285 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::testb(Address dst, int imm8) {2939InstructionMark im(this);2940prefix(dst);2941emit_int8((unsigned char)0xF6);2942emit_operand(rax, dst, 1);2943emit_int8(imm8);2944}29452946void Assembler::testl(Register dst, int32_t imm32) {2947// not using emit_arith because test2948// doesn't support sign-extension of2949// 8bit operands2950int encode = dst->encoding();2951if (encode == 0) {2952emit_int8((unsigned char)0xA9);2953} else {2954encode = prefix_and_encode(encode);2955emit_int8((unsigned char)0xF7);2956emit_int8((unsigned char)(0xC0 | encode));2957}2958emit_int32(imm32);2959}29602961void Assembler::testl(Register dst, Register src) {2962(void) prefix_and_encode(dst->encoding(), src->encoding());2963emit_arith(0x85, 0xC0, dst, src);2964}29652966void Assembler::testl(Register dst, Address src) {2967InstructionMark im(this);2968prefix(src, dst);2969emit_int8((unsigned char)0x85);2970emit_operand(dst, src);2971}29722973void Assembler::tzcntl(Register dst, Register src) {2974assert(VM_Version::supports_bmi1(), "tzcnt instruction not supported");2975emit_int8((unsigned char)0xF3);2976int encode = prefix_and_encode(dst->encoding(), src->encoding());2977emit_int8(0x0F);2978emit_int8((unsigned char)0xBC);2979emit_int8((unsigned char)0xC0 | encode);2980}29812982void Assembler::tzcntq(Register dst, Register src) {2983assert(VM_Version::supports_bmi1(), "tzcnt instruction not supported");2984emit_int8((unsigned char)0xF3);2985int encode = prefixq_and_encode(dst->encoding(), src->encoding());2986emit_int8(0x0F);2987emit_int8((unsigned char)0xBC);2988emit_int8((unsigned char)(0xC0 | encode));2989}29902991void Assembler::ucomisd(XMMRegister dst, Address src) {2992NOT_LP64(assert(VM_Version::supports_sse2(), ""));2993emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_66);2994}29952996void Assembler::ucomisd(XMMRegister dst, XMMRegister src) {2997NOT_LP64(assert(VM_Version::supports_sse2(), ""));2998emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_66);2999}30003001void Assembler::ucomiss(XMMRegister dst, Address src) {3002NOT_LP64(assert(VM_Version::supports_sse(), ""));3003emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_NONE);3004}30053006void Assembler::ucomiss(XMMRegister dst, XMMRegister src) {3007NOT_LP64(assert(VM_Version::supports_sse(), ""));3008emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_NONE);3009}30103011void Assembler::xabort(int8_t imm8) {3012emit_int8((unsigned char)0xC6);3013emit_int8((unsigned char)0xF8);3014emit_int8((unsigned char)(imm8 & 0xFF));3015}30163017void Assembler::xaddl(Address dst, Register src) {3018InstructionMark im(this);3019prefix(dst, src);3020emit_int8(0x0F);3021emit_int8((unsigned char)0xC1);3022emit_operand(src, dst);3023}30243025void Assembler::xbegin(Label& abort, relocInfo::relocType rtype) {3026InstructionMark im(this);3027relocate(rtype);3028if (abort.is_bound()) {3029address entry = target(abort);3030assert(entry != NULL, "abort entry NULL");3031intptr_t offset = entry - pc();3032emit_int8((unsigned char)0xC7);3033emit_int8((unsigned char)0xF8);3034emit_int32(offset - 6); // 2 opcode + 4 address3035} else {3036abort.add_patch_at(code(), locator());3037emit_int8((unsigned char)0xC7);3038emit_int8((unsigned char)0xF8);3039emit_int32(0);3040}3041}30423043void Assembler::xchgl(Register dst, Address src) { // xchg3044InstructionMark im(this);3045prefix(src, dst);3046emit_int8((unsigned char)0x87);3047emit_operand(dst, src);3048}30493050void Assembler::xchgl(Register dst, Register src) {3051int encode = prefix_and_encode(dst->encoding(), src->encoding());3052emit_int8((unsigned char)0x87);3053emit_int8((unsigned char)(0xC0 | encode));3054}30553056void Assembler::xend() {3057emit_int8((unsigned char)0x0F);3058emit_int8((unsigned char)0x01);3059emit_int8((unsigned char)0xD5);3060}30613062void Assembler::xgetbv() {3063emit_int8(0x0F);3064emit_int8(0x01);3065emit_int8((unsigned char)0xD0);3066}30673068void Assembler::xorl(Register dst, int32_t imm32) {3069prefix(dst);3070emit_arith(0x81, 0xF0, dst, imm32);3071}30723073void Assembler::xorl(Register dst, Address src) {3074InstructionMark im(this);3075prefix(src, dst);3076emit_int8(0x33);3077emit_operand(dst, src);3078}30793080void Assembler::xorl(Register dst, Register src) {3081(void) prefix_and_encode(dst->encoding(), src->encoding());3082emit_arith(0x33, 0xC0, dst, src);3083}308430853086// AVX 3-operands scalar float-point arithmetic instructions30873088void Assembler::vaddsd(XMMRegister dst, XMMRegister nds, Address src) {3089assert(VM_Version::supports_avx(), "");3090emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_F2, /* vector256 */ false);3091}30923093void Assembler::vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {3094assert(VM_Version::supports_avx(), "");3095emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_F2, /* vector256 */ false);3096}30973098void Assembler::vaddss(XMMRegister dst, XMMRegister nds, Address src) {3099assert(VM_Version::supports_avx(), "");3100emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_F3, /* vector256 */ false);3101}31023103void Assembler::vaddss(XMMRegister dst, XMMRegister nds, XMMRegister src) {3104assert(VM_Version::supports_avx(), "");3105emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_F3, /* vector256 */ false);3106}31073108void Assembler::vdivsd(XMMRegister dst, XMMRegister nds, Address src) {3109assert(VM_Version::supports_avx(), "");3110emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_F2, /* vector256 */ false);3111}31123113void Assembler::vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {3114assert(VM_Version::supports_avx(), "");3115emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_F2, /* vector256 */ false);3116}31173118void Assembler::vdivss(XMMRegister dst, XMMRegister nds, Address src) {3119assert(VM_Version::supports_avx(), "");3120emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_F3, /* vector256 */ false);3121}31223123void Assembler::vdivss(XMMRegister dst, XMMRegister nds, XMMRegister src) {3124assert(VM_Version::supports_avx(), "");3125emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_F3, /* vector256 */ false);3126}31273128void Assembler::vmulsd(XMMRegister dst, XMMRegister nds, Address src) {3129assert(VM_Version::supports_avx(), "");3130emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_F2, /* vector256 */ false);3131}31323133void Assembler::vmulsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {3134assert(VM_Version::supports_avx(), "");3135emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_F2, /* vector256 */ false);3136}31373138void Assembler::vmulss(XMMRegister dst, XMMRegister nds, Address src) {3139assert(VM_Version::supports_avx(), "");3140emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_F3, /* vector256 */ false);3141}31423143void Assembler::vmulss(XMMRegister dst, XMMRegister nds, XMMRegister src) {3144assert(VM_Version::supports_avx(), "");3145emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_F3, /* vector256 */ false);3146}31473148void Assembler::vsubsd(XMMRegister dst, XMMRegister nds, Address src) {3149assert(VM_Version::supports_avx(), "");3150emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_F2, /* vector256 */ false);3151}31523153void Assembler::vsubsd(XMMRegister dst, XMMRegister nds, XMMRegister src) {3154assert(VM_Version::supports_avx(), "");3155emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_F2, /* vector256 */ false);3156}31573158void Assembler::vsubss(XMMRegister dst, XMMRegister nds, Address src) {3159assert(VM_Version::supports_avx(), "");3160emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_F3, /* vector256 */ false);3161}31623163void Assembler::vsubss(XMMRegister dst, XMMRegister nds, XMMRegister src) {3164assert(VM_Version::supports_avx(), "");3165emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_F3, /* vector256 */ false);3166}31673168//====================VECTOR ARITHMETIC=====================================31693170// Float-point vector arithmetic31713172void Assembler::addpd(XMMRegister dst, XMMRegister src) {3173NOT_LP64(assert(VM_Version::supports_sse2(), ""));3174emit_simd_arith(0x58, dst, src, VEX_SIMD_66);3175}31763177void Assembler::addps(XMMRegister dst, XMMRegister src) {3178NOT_LP64(assert(VM_Version::supports_sse2(), ""));3179emit_simd_arith(0x58, dst, src, VEX_SIMD_NONE);3180}31813182void Assembler::vaddpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3183assert(VM_Version::supports_avx(), "");3184emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_66, vector256);3185}31863187void Assembler::vaddps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3188assert(VM_Version::supports_avx(), "");3189emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_NONE, vector256);3190}31913192void Assembler::vaddpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3193assert(VM_Version::supports_avx(), "");3194emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_66, vector256);3195}31963197void Assembler::vaddps(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3198assert(VM_Version::supports_avx(), "");3199emit_vex_arith(0x58, dst, nds, src, VEX_SIMD_NONE, vector256);3200}32013202void Assembler::subpd(XMMRegister dst, XMMRegister src) {3203NOT_LP64(assert(VM_Version::supports_sse2(), ""));3204emit_simd_arith(0x5C, dst, src, VEX_SIMD_66);3205}32063207void Assembler::subps(XMMRegister dst, XMMRegister src) {3208NOT_LP64(assert(VM_Version::supports_sse2(), ""));3209emit_simd_arith(0x5C, dst, src, VEX_SIMD_NONE);3210}32113212void Assembler::vsubpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3213assert(VM_Version::supports_avx(), "");3214emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_66, vector256);3215}32163217void Assembler::vsubps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3218assert(VM_Version::supports_avx(), "");3219emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_NONE, vector256);3220}32213222void Assembler::vsubpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3223assert(VM_Version::supports_avx(), "");3224emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_66, vector256);3225}32263227void Assembler::vsubps(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3228assert(VM_Version::supports_avx(), "");3229emit_vex_arith(0x5C, dst, nds, src, VEX_SIMD_NONE, vector256);3230}32313232void Assembler::mulpd(XMMRegister dst, XMMRegister src) {3233NOT_LP64(assert(VM_Version::supports_sse2(), ""));3234emit_simd_arith(0x59, dst, src, VEX_SIMD_66);3235}32363237void Assembler::mulps(XMMRegister dst, XMMRegister src) {3238NOT_LP64(assert(VM_Version::supports_sse2(), ""));3239emit_simd_arith(0x59, dst, src, VEX_SIMD_NONE);3240}32413242void Assembler::vmulpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3243assert(VM_Version::supports_avx(), "");3244emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_66, vector256);3245}32463247void Assembler::vmulps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3248assert(VM_Version::supports_avx(), "");3249emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_NONE, vector256);3250}32513252void Assembler::vmulpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3253assert(VM_Version::supports_avx(), "");3254emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_66, vector256);3255}32563257void Assembler::vmulps(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3258assert(VM_Version::supports_avx(), "");3259emit_vex_arith(0x59, dst, nds, src, VEX_SIMD_NONE, vector256);3260}32613262void Assembler::divpd(XMMRegister dst, XMMRegister src) {3263NOT_LP64(assert(VM_Version::supports_sse2(), ""));3264emit_simd_arith(0x5E, dst, src, VEX_SIMD_66);3265}32663267void Assembler::divps(XMMRegister dst, XMMRegister src) {3268NOT_LP64(assert(VM_Version::supports_sse2(), ""));3269emit_simd_arith(0x5E, dst, src, VEX_SIMD_NONE);3270}32713272void Assembler::vdivpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3273assert(VM_Version::supports_avx(), "");3274emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_66, vector256);3275}32763277void Assembler::vdivps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3278assert(VM_Version::supports_avx(), "");3279emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_NONE, vector256);3280}32813282void Assembler::vdivpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3283assert(VM_Version::supports_avx(), "");3284emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_66, vector256);3285}32863287void Assembler::vdivps(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3288assert(VM_Version::supports_avx(), "");3289emit_vex_arith(0x5E, dst, nds, src, VEX_SIMD_NONE, vector256);3290}32913292void Assembler::andpd(XMMRegister dst, XMMRegister src) {3293NOT_LP64(assert(VM_Version::supports_sse2(), ""));3294emit_simd_arith(0x54, dst, src, VEX_SIMD_66);3295}32963297void Assembler::andps(XMMRegister dst, XMMRegister src) {3298NOT_LP64(assert(VM_Version::supports_sse(), ""));3299emit_simd_arith(0x54, dst, src, VEX_SIMD_NONE);3300}33013302void Assembler::andps(XMMRegister dst, Address src) {3303NOT_LP64(assert(VM_Version::supports_sse(), ""));3304emit_simd_arith(0x54, dst, src, VEX_SIMD_NONE);3305}33063307void Assembler::andpd(XMMRegister dst, Address src) {3308NOT_LP64(assert(VM_Version::supports_sse2(), ""));3309emit_simd_arith(0x54, dst, src, VEX_SIMD_66);3310}33113312void Assembler::vandpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3313assert(VM_Version::supports_avx(), "");3314emit_vex_arith(0x54, dst, nds, src, VEX_SIMD_66, vector256);3315}33163317void Assembler::vandps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3318assert(VM_Version::supports_avx(), "");3319emit_vex_arith(0x54, dst, nds, src, VEX_SIMD_NONE, vector256);3320}33213322void Assembler::vandpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3323assert(VM_Version::supports_avx(), "");3324emit_vex_arith(0x54, dst, nds, src, VEX_SIMD_66, vector256);3325}33263327void Assembler::vandps(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3328assert(VM_Version::supports_avx(), "");3329emit_vex_arith(0x54, dst, nds, src, VEX_SIMD_NONE, vector256);3330}33313332void Assembler::xorpd(XMMRegister dst, XMMRegister src) {3333NOT_LP64(assert(VM_Version::supports_sse2(), ""));3334emit_simd_arith(0x57, dst, src, VEX_SIMD_66);3335}33363337void Assembler::xorps(XMMRegister dst, XMMRegister src) {3338NOT_LP64(assert(VM_Version::supports_sse(), ""));3339emit_simd_arith(0x57, dst, src, VEX_SIMD_NONE);3340}33413342void Assembler::xorpd(XMMRegister dst, Address src) {3343NOT_LP64(assert(VM_Version::supports_sse2(), ""));3344emit_simd_arith(0x57, dst, src, VEX_SIMD_66);3345}33463347void Assembler::xorps(XMMRegister dst, Address src) {3348NOT_LP64(assert(VM_Version::supports_sse(), ""));3349emit_simd_arith(0x57, dst, src, VEX_SIMD_NONE);3350}33513352void Assembler::vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3353assert(VM_Version::supports_avx(), "");3354emit_vex_arith(0x57, dst, nds, src, VEX_SIMD_66, vector256);3355}33563357void Assembler::vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3358assert(VM_Version::supports_avx(), "");3359emit_vex_arith(0x57, dst, nds, src, VEX_SIMD_NONE, vector256);3360}33613362void Assembler::vxorpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3363assert(VM_Version::supports_avx(), "");3364emit_vex_arith(0x57, dst, nds, src, VEX_SIMD_66, vector256);3365}33663367void Assembler::vxorps(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3368assert(VM_Version::supports_avx(), "");3369emit_vex_arith(0x57, dst, nds, src, VEX_SIMD_NONE, vector256);3370}337133723373// Integer vector arithmetic3374void Assembler::paddb(XMMRegister dst, XMMRegister src) {3375NOT_LP64(assert(VM_Version::supports_sse2(), ""));3376emit_simd_arith(0xFC, dst, src, VEX_SIMD_66);3377}33783379void Assembler::paddw(XMMRegister dst, XMMRegister src) {3380NOT_LP64(assert(VM_Version::supports_sse2(), ""));3381emit_simd_arith(0xFD, dst, src, VEX_SIMD_66);3382}33833384void Assembler::paddd(XMMRegister dst, XMMRegister src) {3385NOT_LP64(assert(VM_Version::supports_sse2(), ""));3386emit_simd_arith(0xFE, dst, src, VEX_SIMD_66);3387}33883389void Assembler::paddq(XMMRegister dst, XMMRegister src) {3390NOT_LP64(assert(VM_Version::supports_sse2(), ""));3391emit_simd_arith(0xD4, dst, src, VEX_SIMD_66);3392}33933394void Assembler::vpaddb(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3395assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3396emit_vex_arith(0xFC, dst, nds, src, VEX_SIMD_66, vector256);3397}33983399void Assembler::vpaddw(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3400assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3401emit_vex_arith(0xFD, dst, nds, src, VEX_SIMD_66, vector256);3402}34033404void Assembler::vpaddd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3405assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3406emit_vex_arith(0xFE, dst, nds, src, VEX_SIMD_66, vector256);3407}34083409void Assembler::vpaddq(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3410assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3411emit_vex_arith(0xD4, dst, nds, src, VEX_SIMD_66, vector256);3412}34133414void Assembler::vpaddb(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3415assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3416emit_vex_arith(0xFC, dst, nds, src, VEX_SIMD_66, vector256);3417}34183419void Assembler::vpaddw(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3420assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3421emit_vex_arith(0xFD, dst, nds, src, VEX_SIMD_66, vector256);3422}34233424void Assembler::vpaddd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3425assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3426emit_vex_arith(0xFE, dst, nds, src, VEX_SIMD_66, vector256);3427}34283429void Assembler::vpaddq(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3430assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3431emit_vex_arith(0xD4, dst, nds, src, VEX_SIMD_66, vector256);3432}34333434void Assembler::psubb(XMMRegister dst, XMMRegister src) {3435NOT_LP64(assert(VM_Version::supports_sse2(), ""));3436emit_simd_arith(0xF8, dst, src, VEX_SIMD_66);3437}34383439void Assembler::psubw(XMMRegister dst, XMMRegister src) {3440NOT_LP64(assert(VM_Version::supports_sse2(), ""));3441emit_simd_arith(0xF9, dst, src, VEX_SIMD_66);3442}34433444void Assembler::psubd(XMMRegister dst, XMMRegister src) {3445NOT_LP64(assert(VM_Version::supports_sse2(), ""));3446emit_simd_arith(0xFA, dst, src, VEX_SIMD_66);3447}34483449void Assembler::psubq(XMMRegister dst, XMMRegister src) {3450NOT_LP64(assert(VM_Version::supports_sse2(), ""));3451emit_simd_arith(0xFB, dst, src, VEX_SIMD_66);3452}34533454void Assembler::vpsubb(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3455assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3456emit_vex_arith(0xF8, dst, nds, src, VEX_SIMD_66, vector256);3457}34583459void Assembler::vpsubw(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3460assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3461emit_vex_arith(0xF9, dst, nds, src, VEX_SIMD_66, vector256);3462}34633464void Assembler::vpsubd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3465assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3466emit_vex_arith(0xFA, dst, nds, src, VEX_SIMD_66, vector256);3467}34683469void Assembler::vpsubq(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3470assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3471emit_vex_arith(0xFB, dst, nds, src, VEX_SIMD_66, vector256);3472}34733474void Assembler::vpsubb(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3475assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3476emit_vex_arith(0xF8, dst, nds, src, VEX_SIMD_66, vector256);3477}34783479void Assembler::vpsubw(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3480assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3481emit_vex_arith(0xF9, dst, nds, src, VEX_SIMD_66, vector256);3482}34833484void Assembler::vpsubd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3485assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3486emit_vex_arith(0xFA, dst, nds, src, VEX_SIMD_66, vector256);3487}34883489void Assembler::vpsubq(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3490assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3491emit_vex_arith(0xFB, dst, nds, src, VEX_SIMD_66, vector256);3492}34933494void Assembler::pmullw(XMMRegister dst, XMMRegister src) {3495NOT_LP64(assert(VM_Version::supports_sse2(), ""));3496emit_simd_arith(0xD5, dst, src, VEX_SIMD_66);3497}34983499void Assembler::pmulld(XMMRegister dst, XMMRegister src) {3500assert(VM_Version::supports_sse4_1(), "");3501int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38);3502emit_int8(0x40);3503emit_int8((unsigned char)(0xC0 | encode));3504}35053506void Assembler::vpmullw(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3507assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3508emit_vex_arith(0xD5, dst, nds, src, VEX_SIMD_66, vector256);3509}35103511void Assembler::vpmulld(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3512assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3513int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_38);3514emit_int8(0x40);3515emit_int8((unsigned char)(0xC0 | encode));3516}35173518void Assembler::vpmullw(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3519assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3520emit_vex_arith(0xD5, dst, nds, src, VEX_SIMD_66, vector256);3521}35223523void Assembler::vpmulld(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3524assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3525InstructionMark im(this);3526int dst_enc = dst->encoding();3527int nds_enc = nds->is_valid() ? nds->encoding() : 0;3528vex_prefix(src, nds_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, false, vector256);3529emit_int8(0x40);3530emit_operand(dst, src);3531}35323533// Shift packed integers left by specified number of bits.3534void Assembler::psllw(XMMRegister dst, int shift) {3535NOT_LP64(assert(VM_Version::supports_sse2(), ""));3536// XMM6 is for /6 encoding: 66 0F 71 /6 ib3537int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66);3538emit_int8(0x71);3539emit_int8((unsigned char)(0xC0 | encode));3540emit_int8(shift & 0xFF);3541}35423543void Assembler::pslld(XMMRegister dst, int shift) {3544NOT_LP64(assert(VM_Version::supports_sse2(), ""));3545// XMM6 is for /6 encoding: 66 0F 72 /6 ib3546int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66);3547emit_int8(0x72);3548emit_int8((unsigned char)(0xC0 | encode));3549emit_int8(shift & 0xFF);3550}35513552void Assembler::psllq(XMMRegister dst, int shift) {3553NOT_LP64(assert(VM_Version::supports_sse2(), ""));3554// XMM6 is for /6 encoding: 66 0F 73 /6 ib3555int encode = simd_prefix_and_encode(xmm6, dst, dst, VEX_SIMD_66);3556emit_int8(0x73);3557emit_int8((unsigned char)(0xC0 | encode));3558emit_int8(shift & 0xFF);3559}35603561void Assembler::psllw(XMMRegister dst, XMMRegister shift) {3562NOT_LP64(assert(VM_Version::supports_sse2(), ""));3563emit_simd_arith(0xF1, dst, shift, VEX_SIMD_66);3564}35653566void Assembler::pslld(XMMRegister dst, XMMRegister shift) {3567NOT_LP64(assert(VM_Version::supports_sse2(), ""));3568emit_simd_arith(0xF2, dst, shift, VEX_SIMD_66);3569}35703571void Assembler::psllq(XMMRegister dst, XMMRegister shift) {3572NOT_LP64(assert(VM_Version::supports_sse2(), ""));3573emit_simd_arith(0xF3, dst, shift, VEX_SIMD_66);3574}35753576void Assembler::vpsllw(XMMRegister dst, XMMRegister src, int shift, bool vector256) {3577assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3578// XMM6 is for /6 encoding: 66 0F 71 /6 ib3579emit_vex_arith(0x71, xmm6, dst, src, VEX_SIMD_66, vector256);3580emit_int8(shift & 0xFF);3581}35823583void Assembler::vpslld(XMMRegister dst, XMMRegister src, int shift, bool vector256) {3584assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3585// XMM6 is for /6 encoding: 66 0F 72 /6 ib3586emit_vex_arith(0x72, xmm6, dst, src, VEX_SIMD_66, vector256);3587emit_int8(shift & 0xFF);3588}35893590void Assembler::vpsllq(XMMRegister dst, XMMRegister src, int shift, bool vector256) {3591assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3592// XMM6 is for /6 encoding: 66 0F 73 /6 ib3593emit_vex_arith(0x73, xmm6, dst, src, VEX_SIMD_66, vector256);3594emit_int8(shift & 0xFF);3595}35963597void Assembler::vpsllw(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256) {3598assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3599emit_vex_arith(0xF1, dst, src, shift, VEX_SIMD_66, vector256);3600}36013602void Assembler::vpslld(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256) {3603assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3604emit_vex_arith(0xF2, dst, src, shift, VEX_SIMD_66, vector256);3605}36063607void Assembler::vpsllq(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256) {3608assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3609emit_vex_arith(0xF3, dst, src, shift, VEX_SIMD_66, vector256);3610}36113612// Shift packed integers logically right by specified number of bits.3613void Assembler::psrlw(XMMRegister dst, int shift) {3614NOT_LP64(assert(VM_Version::supports_sse2(), ""));3615// XMM2 is for /2 encoding: 66 0F 71 /2 ib3616int encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66);3617emit_int8(0x71);3618emit_int8((unsigned char)(0xC0 | encode));3619emit_int8(shift & 0xFF);3620}36213622void Assembler::psrld(XMMRegister dst, int shift) {3623NOT_LP64(assert(VM_Version::supports_sse2(), ""));3624// XMM2 is for /2 encoding: 66 0F 72 /2 ib3625int encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66);3626emit_int8(0x72);3627emit_int8((unsigned char)(0xC0 | encode));3628emit_int8(shift & 0xFF);3629}36303631void Assembler::psrlq(XMMRegister dst, int shift) {3632// Do not confuse it with psrldq SSE2 instruction which3633// shifts 128 bit value in xmm register by number of bytes.3634NOT_LP64(assert(VM_Version::supports_sse2(), ""));3635// XMM2 is for /2 encoding: 66 0F 73 /2 ib3636int encode = simd_prefix_and_encode(xmm2, dst, dst, VEX_SIMD_66);3637emit_int8(0x73);3638emit_int8((unsigned char)(0xC0 | encode));3639emit_int8(shift & 0xFF);3640}36413642void Assembler::psrlw(XMMRegister dst, XMMRegister shift) {3643NOT_LP64(assert(VM_Version::supports_sse2(), ""));3644emit_simd_arith(0xD1, dst, shift, VEX_SIMD_66);3645}36463647void Assembler::psrld(XMMRegister dst, XMMRegister shift) {3648NOT_LP64(assert(VM_Version::supports_sse2(), ""));3649emit_simd_arith(0xD2, dst, shift, VEX_SIMD_66);3650}36513652void Assembler::psrlq(XMMRegister dst, XMMRegister shift) {3653NOT_LP64(assert(VM_Version::supports_sse2(), ""));3654emit_simd_arith(0xD3, dst, shift, VEX_SIMD_66);3655}36563657void Assembler::vpsrlw(XMMRegister dst, XMMRegister src, int shift, bool vector256) {3658assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3659// XMM2 is for /2 encoding: 66 0F 73 /2 ib3660emit_vex_arith(0x71, xmm2, dst, src, VEX_SIMD_66, vector256);3661emit_int8(shift & 0xFF);3662}36633664void Assembler::vpsrld(XMMRegister dst, XMMRegister src, int shift, bool vector256) {3665assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3666// XMM2 is for /2 encoding: 66 0F 73 /2 ib3667emit_vex_arith(0x72, xmm2, dst, src, VEX_SIMD_66, vector256);3668emit_int8(shift & 0xFF);3669}36703671void Assembler::vpsrlq(XMMRegister dst, XMMRegister src, int shift, bool vector256) {3672assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3673// XMM2 is for /2 encoding: 66 0F 73 /2 ib3674emit_vex_arith(0x73, xmm2, dst, src, VEX_SIMD_66, vector256);3675emit_int8(shift & 0xFF);3676}36773678void Assembler::vpsrlw(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256) {3679assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3680emit_vex_arith(0xD1, dst, src, shift, VEX_SIMD_66, vector256);3681}36823683void Assembler::vpsrld(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256) {3684assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3685emit_vex_arith(0xD2, dst, src, shift, VEX_SIMD_66, vector256);3686}36873688void Assembler::vpsrlq(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256) {3689assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3690emit_vex_arith(0xD3, dst, src, shift, VEX_SIMD_66, vector256);3691}36923693// Shift packed integers arithmetically right by specified number of bits.3694void Assembler::psraw(XMMRegister dst, int shift) {3695NOT_LP64(assert(VM_Version::supports_sse2(), ""));3696// XMM4 is for /4 encoding: 66 0F 71 /4 ib3697int encode = simd_prefix_and_encode(xmm4, dst, dst, VEX_SIMD_66);3698emit_int8(0x71);3699emit_int8((unsigned char)(0xC0 | encode));3700emit_int8(shift & 0xFF);3701}37023703void Assembler::psrad(XMMRegister dst, int shift) {3704NOT_LP64(assert(VM_Version::supports_sse2(), ""));3705// XMM4 is for /4 encoding: 66 0F 72 /4 ib3706int encode = simd_prefix_and_encode(xmm4, dst, dst, VEX_SIMD_66);3707emit_int8(0x72);3708emit_int8((unsigned char)(0xC0 | encode));3709emit_int8(shift & 0xFF);3710}37113712void Assembler::psraw(XMMRegister dst, XMMRegister shift) {3713NOT_LP64(assert(VM_Version::supports_sse2(), ""));3714emit_simd_arith(0xE1, dst, shift, VEX_SIMD_66);3715}37163717void Assembler::psrad(XMMRegister dst, XMMRegister shift) {3718NOT_LP64(assert(VM_Version::supports_sse2(), ""));3719emit_simd_arith(0xE2, dst, shift, VEX_SIMD_66);3720}37213722void Assembler::vpsraw(XMMRegister dst, XMMRegister src, int shift, bool vector256) {3723assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3724// XMM4 is for /4 encoding: 66 0F 71 /4 ib3725emit_vex_arith(0x71, xmm4, dst, src, VEX_SIMD_66, vector256);3726emit_int8(shift & 0xFF);3727}37283729void Assembler::vpsrad(XMMRegister dst, XMMRegister src, int shift, bool vector256) {3730assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3731// XMM4 is for /4 encoding: 66 0F 71 /4 ib3732emit_vex_arith(0x72, xmm4, dst, src, VEX_SIMD_66, vector256);3733emit_int8(shift & 0xFF);3734}37353736void Assembler::vpsraw(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256) {3737assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3738emit_vex_arith(0xE1, dst, src, shift, VEX_SIMD_66, vector256);3739}37403741void Assembler::vpsrad(XMMRegister dst, XMMRegister src, XMMRegister shift, bool vector256) {3742assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3743emit_vex_arith(0xE2, dst, src, shift, VEX_SIMD_66, vector256);3744}374537463747// AND packed integers3748void Assembler::pand(XMMRegister dst, XMMRegister src) {3749NOT_LP64(assert(VM_Version::supports_sse2(), ""));3750emit_simd_arith(0xDB, dst, src, VEX_SIMD_66);3751}37523753void Assembler::vpand(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3754assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3755emit_vex_arith(0xDB, dst, nds, src, VEX_SIMD_66, vector256);3756}37573758void Assembler::vpand(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3759assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3760emit_vex_arith(0xDB, dst, nds, src, VEX_SIMD_66, vector256);3761}37623763void Assembler::por(XMMRegister dst, XMMRegister src) {3764NOT_LP64(assert(VM_Version::supports_sse2(), ""));3765emit_simd_arith(0xEB, dst, src, VEX_SIMD_66);3766}37673768void Assembler::vpor(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3769assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3770emit_vex_arith(0xEB, dst, nds, src, VEX_SIMD_66, vector256);3771}37723773void Assembler::vpor(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3774assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3775emit_vex_arith(0xEB, dst, nds, src, VEX_SIMD_66, vector256);3776}37773778void Assembler::pxor(XMMRegister dst, XMMRegister src) {3779NOT_LP64(assert(VM_Version::supports_sse2(), ""));3780emit_simd_arith(0xEF, dst, src, VEX_SIMD_66);3781}37823783void Assembler::vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {3784assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3785emit_vex_arith(0xEF, dst, nds, src, VEX_SIMD_66, vector256);3786}37873788void Assembler::vpxor(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {3789assert(VM_Version::supports_avx() && !vector256 || VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");3790emit_vex_arith(0xEF, dst, nds, src, VEX_SIMD_66, vector256);3791}379237933794void Assembler::vinsertf128h(XMMRegister dst, XMMRegister nds, XMMRegister src) {3795assert(VM_Version::supports_avx(), "");3796bool vector256 = true;3797int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_3A);3798emit_int8(0x18);3799emit_int8((unsigned char)(0xC0 | encode));3800// 0x00 - insert into lower 128 bits3801// 0x01 - insert into upper 128 bits3802emit_int8(0x01);3803}38043805void Assembler::vinsertf128h(XMMRegister dst, Address src) {3806assert(VM_Version::supports_avx(), "");3807InstructionMark im(this);3808bool vector256 = true;3809assert(dst != xnoreg, "sanity");3810int dst_enc = dst->encoding();3811// swap src<->dst for encoding3812vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, false, vector256);3813emit_int8(0x18);3814emit_operand(dst, src);3815// 0x01 - insert into upper 128 bits3816emit_int8(0x01);3817}38183819void Assembler::vextractf128h(Address dst, XMMRegister src) {3820assert(VM_Version::supports_avx(), "");3821InstructionMark im(this);3822bool vector256 = true;3823assert(src != xnoreg, "sanity");3824int src_enc = src->encoding();3825vex_prefix(dst, 0, src_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, false, vector256);3826emit_int8(0x19);3827emit_operand(src, dst);3828// 0x01 - extract from upper 128 bits3829emit_int8(0x01);3830}38313832void Assembler::vinserti128h(XMMRegister dst, XMMRegister nds, XMMRegister src) {3833assert(VM_Version::supports_avx2(), "");3834bool vector256 = true;3835int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_3A);3836emit_int8(0x38);3837emit_int8((unsigned char)(0xC0 | encode));3838// 0x00 - insert into lower 128 bits3839// 0x01 - insert into upper 128 bits3840emit_int8(0x01);3841}38423843void Assembler::vinserti128h(XMMRegister dst, Address src) {3844assert(VM_Version::supports_avx2(), "");3845InstructionMark im(this);3846bool vector256 = true;3847assert(dst != xnoreg, "sanity");3848int dst_enc = dst->encoding();3849// swap src<->dst for encoding3850vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, false, vector256);3851emit_int8(0x38);3852emit_operand(dst, src);3853// 0x01 - insert into upper 128 bits3854emit_int8(0x01);3855}38563857void Assembler::vextracti128h(Address dst, XMMRegister src) {3858assert(VM_Version::supports_avx2(), "");3859InstructionMark im(this);3860bool vector256 = true;3861assert(src != xnoreg, "sanity");3862int src_enc = src->encoding();3863vex_prefix(dst, 0, src_enc, VEX_SIMD_66, VEX_OPCODE_0F_3A, false, vector256);3864emit_int8(0x39);3865emit_operand(src, dst);3866// 0x01 - extract from upper 128 bits3867emit_int8(0x01);3868}38693870// duplicate 4-bytes integer data from src into 8 locations in dest3871void Assembler::vpbroadcastd(XMMRegister dst, XMMRegister src) {3872assert(VM_Version::supports_avx2(), "");3873bool vector256 = true;3874int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_38);3875emit_int8(0x58);3876emit_int8((unsigned char)(0xC0 | encode));3877}38783879// Carry-Less Multiplication Quadword3880void Assembler::pclmulqdq(XMMRegister dst, XMMRegister src, int mask) {3881assert(VM_Version::supports_clmul(), "");3882int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A);3883emit_int8(0x44);3884emit_int8((unsigned char)(0xC0 | encode));3885emit_int8((unsigned char)mask);3886}38873888// Carry-Less Multiplication Quadword3889void Assembler::vpclmulqdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int mask) {3890assert(VM_Version::supports_avx() && VM_Version::supports_clmul(), "");3891bool vector256 = false;3892int encode = vex_prefix_and_encode(dst, nds, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_3A);3893emit_int8(0x44);3894emit_int8((unsigned char)(0xC0 | encode));3895emit_int8((unsigned char)mask);3896}38973898void Assembler::vzeroupper() {3899assert(VM_Version::supports_avx(), "");3900(void)vex_prefix_and_encode(xmm0, xmm0, xmm0, VEX_SIMD_NONE);3901emit_int8(0x77);3902}390339043905#ifndef _LP643906// 32bit only pieces of the assembler39073908void Assembler::cmp_literal32(Register src1, int32_t imm32, RelocationHolder const& rspec) {3909// NO PREFIX AS NEVER 64BIT3910InstructionMark im(this);3911emit_int8((unsigned char)0x81);3912emit_int8((unsigned char)(0xF8 | src1->encoding()));3913emit_data(imm32, rspec, 0);3914}39153916void Assembler::cmp_literal32(Address src1, int32_t imm32, RelocationHolder const& rspec) {3917// NO PREFIX AS NEVER 64BIT (not even 32bit versions of 64bit regs3918InstructionMark im(this);3919emit_int8((unsigned char)0x81);3920emit_operand(rdi, src1);3921emit_data(imm32, rspec, 0);3922}39233924// The 64-bit (32bit platform) cmpxchg compares the value at adr with the contents of rdx:rax,3925// and stores rcx:rbx into adr if so; otherwise, the value at adr is loaded3926// into rdx:rax. The ZF is set if the compared values were equal, and cleared otherwise.3927void Assembler::cmpxchg8(Address adr) {3928InstructionMark im(this);3929emit_int8(0x0F);3930emit_int8((unsigned char)0xC7);3931emit_operand(rcx, adr);3932}39333934void Assembler::decl(Register dst) {3935// Don't use it directly. Use MacroAssembler::decrementl() instead.3936emit_int8(0x48 | dst->encoding());3937}39383939#endif // _LP6439403941// 64bit typically doesn't use the x87 but needs to for the trig funcs39423943void Assembler::fabs() {3944emit_int8((unsigned char)0xD9);3945emit_int8((unsigned char)0xE1);3946}39473948void Assembler::fadd(int i) {3949emit_farith(0xD8, 0xC0, i);3950}39513952void Assembler::fadd_d(Address src) {3953InstructionMark im(this);3954emit_int8((unsigned char)0xDC);3955emit_operand32(rax, src);3956}39573958void Assembler::fadd_s(Address src) {3959InstructionMark im(this);3960emit_int8((unsigned char)0xD8);3961emit_operand32(rax, src);3962}39633964void Assembler::fadda(int i) {3965emit_farith(0xDC, 0xC0, i);3966}39673968void Assembler::faddp(int i) {3969emit_farith(0xDE, 0xC0, i);3970}39713972void Assembler::fchs() {3973emit_int8((unsigned char)0xD9);3974emit_int8((unsigned char)0xE0);3975}39763977void Assembler::fcom(int i) {3978emit_farith(0xD8, 0xD0, i);3979}39803981void Assembler::fcomp(int i) {3982emit_farith(0xD8, 0xD8, i);3983}39843985void Assembler::fcomp_d(Address src) {3986InstructionMark im(this);3987emit_int8((unsigned char)0xDC);3988emit_operand32(rbx, src);3989}39903991void Assembler::fcomp_s(Address src) {3992InstructionMark im(this);3993emit_int8((unsigned char)0xD8);3994emit_operand32(rbx, src);3995}39963997void Assembler::fcompp() {3998emit_int8((unsigned char)0xDE);3999emit_int8((unsigned char)0xD9);4000}40014002void Assembler::fcos() {4003emit_int8((unsigned char)0xD9);4004emit_int8((unsigned char)0xFF);4005}40064007void Assembler::fdecstp() {4008emit_int8((unsigned char)0xD9);4009emit_int8((unsigned char)0xF6);4010}40114012void Assembler::fdiv(int i) {4013emit_farith(0xD8, 0xF0, i);4014}40154016void Assembler::fdiv_d(Address src) {4017InstructionMark im(this);4018emit_int8((unsigned char)0xDC);4019emit_operand32(rsi, src);4020}40214022void Assembler::fdiv_s(Address src) {4023InstructionMark im(this);4024emit_int8((unsigned char)0xD8);4025emit_operand32(rsi, src);4026}40274028void Assembler::fdiva(int i) {4029emit_farith(0xDC, 0xF8, i);4030}40314032// Note: The Intel manual (Pentium Processor User's Manual, Vol.3, 1994)4033// is erroneous for some of the floating-point instructions below.40344035void Assembler::fdivp(int i) {4036emit_farith(0xDE, 0xF8, i); // ST(0) <- ST(0) / ST(1) and pop (Intel manual wrong)4037}40384039void Assembler::fdivr(int i) {4040emit_farith(0xD8, 0xF8, i);4041}40424043void Assembler::fdivr_d(Address src) {4044InstructionMark im(this);4045emit_int8((unsigned char)0xDC);4046emit_operand32(rdi, src);4047}40484049void Assembler::fdivr_s(Address src) {4050InstructionMark im(this);4051emit_int8((unsigned char)0xD8);4052emit_operand32(rdi, src);4053}40544055void Assembler::fdivra(int i) {4056emit_farith(0xDC, 0xF0, i);4057}40584059void Assembler::fdivrp(int i) {4060emit_farith(0xDE, 0xF0, i); // ST(0) <- ST(1) / ST(0) and pop (Intel manual wrong)4061}40624063void Assembler::ffree(int i) {4064emit_farith(0xDD, 0xC0, i);4065}40664067void Assembler::fild_d(Address adr) {4068InstructionMark im(this);4069emit_int8((unsigned char)0xDF);4070emit_operand32(rbp, adr);4071}40724073void Assembler::fild_s(Address adr) {4074InstructionMark im(this);4075emit_int8((unsigned char)0xDB);4076emit_operand32(rax, adr);4077}40784079void Assembler::fincstp() {4080emit_int8((unsigned char)0xD9);4081emit_int8((unsigned char)0xF7);4082}40834084void Assembler::finit() {4085emit_int8((unsigned char)0x9B);4086emit_int8((unsigned char)0xDB);4087emit_int8((unsigned char)0xE3);4088}40894090void Assembler::fist_s(Address adr) {4091InstructionMark im(this);4092emit_int8((unsigned char)0xDB);4093emit_operand32(rdx, adr);4094}40954096void Assembler::fistp_d(Address adr) {4097InstructionMark im(this);4098emit_int8((unsigned char)0xDF);4099emit_operand32(rdi, adr);4100}41014102void Assembler::fistp_s(Address adr) {4103InstructionMark im(this);4104emit_int8((unsigned char)0xDB);4105emit_operand32(rbx, adr);4106}41074108void Assembler::fld1() {4109emit_int8((unsigned char)0xD9);4110emit_int8((unsigned char)0xE8);4111}41124113void Assembler::fld_d(Address adr) {4114InstructionMark im(this);4115emit_int8((unsigned char)0xDD);4116emit_operand32(rax, adr);4117}41184119void Assembler::fld_s(Address adr) {4120InstructionMark im(this);4121emit_int8((unsigned char)0xD9);4122emit_operand32(rax, adr);4123}412441254126void Assembler::fld_s(int index) {4127emit_farith(0xD9, 0xC0, index);4128}41294130void Assembler::fld_x(Address adr) {4131InstructionMark im(this);4132emit_int8((unsigned char)0xDB);4133emit_operand32(rbp, adr);4134}41354136void Assembler::fldcw(Address src) {4137InstructionMark im(this);4138emit_int8((unsigned char)0xD9);4139emit_operand32(rbp, src);4140}41414142void Assembler::fldenv(Address src) {4143InstructionMark im(this);4144emit_int8((unsigned char)0xD9);4145emit_operand32(rsp, src);4146}41474148void Assembler::fldlg2() {4149emit_int8((unsigned char)0xD9);4150emit_int8((unsigned char)0xEC);4151}41524153void Assembler::fldln2() {4154emit_int8((unsigned char)0xD9);4155emit_int8((unsigned char)0xED);4156}41574158void Assembler::fldz() {4159emit_int8((unsigned char)0xD9);4160emit_int8((unsigned char)0xEE);4161}41624163void Assembler::flog() {4164fldln2();4165fxch();4166fyl2x();4167}41684169void Assembler::flog10() {4170fldlg2();4171fxch();4172fyl2x();4173}41744175void Assembler::fmul(int i) {4176emit_farith(0xD8, 0xC8, i);4177}41784179void Assembler::fmul_d(Address src) {4180InstructionMark im(this);4181emit_int8((unsigned char)0xDC);4182emit_operand32(rcx, src);4183}41844185void Assembler::fmul_s(Address src) {4186InstructionMark im(this);4187emit_int8((unsigned char)0xD8);4188emit_operand32(rcx, src);4189}41904191void Assembler::fmula(int i) {4192emit_farith(0xDC, 0xC8, i);4193}41944195void Assembler::fmulp(int i) {4196emit_farith(0xDE, 0xC8, i);4197}41984199void Assembler::fnsave(Address dst) {4200InstructionMark im(this);4201emit_int8((unsigned char)0xDD);4202emit_operand32(rsi, dst);4203}42044205void Assembler::fnstcw(Address src) {4206InstructionMark im(this);4207emit_int8((unsigned char)0x9B);4208emit_int8((unsigned char)0xD9);4209emit_operand32(rdi, src);4210}42114212void Assembler::fnstsw_ax() {4213emit_int8((unsigned char)0xDF);4214emit_int8((unsigned char)0xE0);4215}42164217void Assembler::fprem() {4218emit_int8((unsigned char)0xD9);4219emit_int8((unsigned char)0xF8);4220}42214222void Assembler::fprem1() {4223emit_int8((unsigned char)0xD9);4224emit_int8((unsigned char)0xF5);4225}42264227void Assembler::frstor(Address src) {4228InstructionMark im(this);4229emit_int8((unsigned char)0xDD);4230emit_operand32(rsp, src);4231}42324233void Assembler::fsin() {4234emit_int8((unsigned char)0xD9);4235emit_int8((unsigned char)0xFE);4236}42374238void Assembler::fsqrt() {4239emit_int8((unsigned char)0xD9);4240emit_int8((unsigned char)0xFA);4241}42424243void Assembler::fst_d(Address adr) {4244InstructionMark im(this);4245emit_int8((unsigned char)0xDD);4246emit_operand32(rdx, adr);4247}42484249void Assembler::fst_s(Address adr) {4250InstructionMark im(this);4251emit_int8((unsigned char)0xD9);4252emit_operand32(rdx, adr);4253}42544255void Assembler::fstp_d(Address adr) {4256InstructionMark im(this);4257emit_int8((unsigned char)0xDD);4258emit_operand32(rbx, adr);4259}42604261void Assembler::fstp_d(int index) {4262emit_farith(0xDD, 0xD8, index);4263}42644265void Assembler::fstp_s(Address adr) {4266InstructionMark im(this);4267emit_int8((unsigned char)0xD9);4268emit_operand32(rbx, adr);4269}42704271void Assembler::fstp_x(Address adr) {4272InstructionMark im(this);4273emit_int8((unsigned char)0xDB);4274emit_operand32(rdi, adr);4275}42764277void Assembler::fsub(int i) {4278emit_farith(0xD8, 0xE0, i);4279}42804281void Assembler::fsub_d(Address src) {4282InstructionMark im(this);4283emit_int8((unsigned char)0xDC);4284emit_operand32(rsp, src);4285}42864287void Assembler::fsub_s(Address src) {4288InstructionMark im(this);4289emit_int8((unsigned char)0xD8);4290emit_operand32(rsp, src);4291}42924293void Assembler::fsuba(int i) {4294emit_farith(0xDC, 0xE8, i);4295}42964297void Assembler::fsubp(int i) {4298emit_farith(0xDE, 0xE8, i); // ST(0) <- ST(0) - ST(1) and pop (Intel manual wrong)4299}43004301void Assembler::fsubr(int i) {4302emit_farith(0xD8, 0xE8, i);4303}43044305void Assembler::fsubr_d(Address src) {4306InstructionMark im(this);4307emit_int8((unsigned char)0xDC);4308emit_operand32(rbp, src);4309}43104311void Assembler::fsubr_s(Address src) {4312InstructionMark im(this);4313emit_int8((unsigned char)0xD8);4314emit_operand32(rbp, src);4315}43164317void Assembler::fsubra(int i) {4318emit_farith(0xDC, 0xE0, i);4319}43204321void Assembler::fsubrp(int i) {4322emit_farith(0xDE, 0xE0, i); // ST(0) <- ST(1) - ST(0) and pop (Intel manual wrong)4323}43244325void Assembler::ftan() {4326emit_int8((unsigned char)0xD9);4327emit_int8((unsigned char)0xF2);4328emit_int8((unsigned char)0xDD);4329emit_int8((unsigned char)0xD8);4330}43314332void Assembler::ftst() {4333emit_int8((unsigned char)0xD9);4334emit_int8((unsigned char)0xE4);4335}43364337void Assembler::fucomi(int i) {4338// make sure the instruction is supported (introduced for P6, together with cmov)4339guarantee(VM_Version::supports_cmov(), "illegal instruction");4340emit_farith(0xDB, 0xE8, i);4341}43424343void Assembler::fucomip(int i) {4344// make sure the instruction is supported (introduced for P6, together with cmov)4345guarantee(VM_Version::supports_cmov(), "illegal instruction");4346emit_farith(0xDF, 0xE8, i);4347}43484349void Assembler::fwait() {4350emit_int8((unsigned char)0x9B);4351}43524353void Assembler::fxch(int i) {4354emit_farith(0xD9, 0xC8, i);4355}43564357void Assembler::fyl2x() {4358emit_int8((unsigned char)0xD9);4359emit_int8((unsigned char)0xF1);4360}43614362void Assembler::frndint() {4363emit_int8((unsigned char)0xD9);4364emit_int8((unsigned char)0xFC);4365}43664367void Assembler::f2xm1() {4368emit_int8((unsigned char)0xD9);4369emit_int8((unsigned char)0xF0);4370}43714372void Assembler::fldl2e() {4373emit_int8((unsigned char)0xD9);4374emit_int8((unsigned char)0xEA);4375}43764377// SSE SIMD prefix byte values corresponding to VexSimdPrefix encoding.4378static int simd_pre[4] = { 0, 0x66, 0xF3, 0xF2 };4379// SSE opcode second byte values (first is 0x0F) corresponding to VexOpcode encoding.4380static int simd_opc[4] = { 0, 0, 0x38, 0x3A };43814382// Generate SSE legacy REX prefix and SIMD opcode based on VEX encoding.4383void Assembler::rex_prefix(Address adr, XMMRegister xreg, VexSimdPrefix pre, VexOpcode opc, bool rex_w) {4384if (pre > 0) {4385emit_int8(simd_pre[pre]);4386}4387if (rex_w) {4388prefixq(adr, xreg);4389} else {4390prefix(adr, xreg);4391}4392if (opc > 0) {4393emit_int8(0x0F);4394int opc2 = simd_opc[opc];4395if (opc2 > 0) {4396emit_int8(opc2);4397}4398}4399}44004401int Assembler::rex_prefix_and_encode(int dst_enc, int src_enc, VexSimdPrefix pre, VexOpcode opc, bool rex_w) {4402if (pre > 0) {4403emit_int8(simd_pre[pre]);4404}4405int encode = (rex_w) ? prefixq_and_encode(dst_enc, src_enc) :4406prefix_and_encode(dst_enc, src_enc);4407if (opc > 0) {4408emit_int8(0x0F);4409int opc2 = simd_opc[opc];4410if (opc2 > 0) {4411emit_int8(opc2);4412}4413}4414return encode;4415}441644174418void Assembler::vex_prefix(bool vex_r, bool vex_b, bool vex_x, bool vex_w, int nds_enc, VexSimdPrefix pre, VexOpcode opc, bool vector256) {4419if (vex_b || vex_x || vex_w || (opc == VEX_OPCODE_0F_38) || (opc == VEX_OPCODE_0F_3A)) {4420prefix(VEX_3bytes);44214422int byte1 = (vex_r ? VEX_R : 0) | (vex_x ? VEX_X : 0) | (vex_b ? VEX_B : 0);4423byte1 = (~byte1) & 0xE0;4424byte1 |= opc;4425emit_int8(byte1);44264427int byte2 = ((~nds_enc) & 0xf) << 3;4428byte2 |= (vex_w ? VEX_W : 0) | (vector256 ? 4 : 0) | pre;4429emit_int8(byte2);4430} else {4431prefix(VEX_2bytes);44324433int byte1 = vex_r ? VEX_R : 0;4434byte1 = (~byte1) & 0x80;4435byte1 |= ((~nds_enc) & 0xf) << 3;4436byte1 |= (vector256 ? 4 : 0) | pre;4437emit_int8(byte1);4438}4439}44404441void Assembler::vex_prefix(Address adr, int nds_enc, int xreg_enc, VexSimdPrefix pre, VexOpcode opc, bool vex_w, bool vector256){4442bool vex_r = (xreg_enc >= 8);4443bool vex_b = adr.base_needs_rex();4444bool vex_x = adr.index_needs_rex();4445vex_prefix(vex_r, vex_b, vex_x, vex_w, nds_enc, pre, opc, vector256);4446}44474448int Assembler::vex_prefix_and_encode(int dst_enc, int nds_enc, int src_enc, VexSimdPrefix pre, VexOpcode opc, bool vex_w, bool vector256) {4449bool vex_r = (dst_enc >= 8);4450bool vex_b = (src_enc >= 8);4451bool vex_x = false;4452vex_prefix(vex_r, vex_b, vex_x, vex_w, nds_enc, pre, opc, vector256);4453return (((dst_enc & 7) << 3) | (src_enc & 7));4454}445544564457void Assembler::simd_prefix(XMMRegister xreg, XMMRegister nds, Address adr, VexSimdPrefix pre, VexOpcode opc, bool rex_w, bool vector256) {4458if (UseAVX > 0) {4459int xreg_enc = xreg->encoding();4460int nds_enc = nds->is_valid() ? nds->encoding() : 0;4461vex_prefix(adr, nds_enc, xreg_enc, pre, opc, rex_w, vector256);4462} else {4463assert((nds == xreg) || (nds == xnoreg), "wrong sse encoding");4464rex_prefix(adr, xreg, pre, opc, rex_w);4465}4466}44674468int Assembler::simd_prefix_and_encode(XMMRegister dst, XMMRegister nds, XMMRegister src, VexSimdPrefix pre, VexOpcode opc, bool rex_w, bool vector256) {4469int dst_enc = dst->encoding();4470int src_enc = src->encoding();4471if (UseAVX > 0) {4472int nds_enc = nds->is_valid() ? nds->encoding() : 0;4473return vex_prefix_and_encode(dst_enc, nds_enc, src_enc, pre, opc, rex_w, vector256);4474} else {4475assert((nds == dst) || (nds == src) || (nds == xnoreg), "wrong sse encoding");4476return rex_prefix_and_encode(dst_enc, src_enc, pre, opc, rex_w);4477}4478}44794480void Assembler::emit_simd_arith(int opcode, XMMRegister dst, Address src, VexSimdPrefix pre) {4481InstructionMark im(this);4482simd_prefix(dst, dst, src, pre);4483emit_int8(opcode);4484emit_operand(dst, src);4485}44864487void Assembler::emit_simd_arith(int opcode, XMMRegister dst, XMMRegister src, VexSimdPrefix pre) {4488int encode = simd_prefix_and_encode(dst, dst, src, pre);4489emit_int8(opcode);4490emit_int8((unsigned char)(0xC0 | encode));4491}44924493// Versions with no second source register (non-destructive source).4494void Assembler::emit_simd_arith_nonds(int opcode, XMMRegister dst, Address src, VexSimdPrefix pre) {4495InstructionMark im(this);4496simd_prefix(dst, xnoreg, src, pre);4497emit_int8(opcode);4498emit_operand(dst, src);4499}45004501void Assembler::emit_simd_arith_nonds(int opcode, XMMRegister dst, XMMRegister src, VexSimdPrefix pre) {4502int encode = simd_prefix_and_encode(dst, xnoreg, src, pre);4503emit_int8(opcode);4504emit_int8((unsigned char)(0xC0 | encode));4505}45064507// 3-operands AVX instructions4508void Assembler::emit_vex_arith(int opcode, XMMRegister dst, XMMRegister nds,4509Address src, VexSimdPrefix pre, bool vector256) {4510InstructionMark im(this);4511vex_prefix(dst, nds, src, pre, vector256);4512emit_int8(opcode);4513emit_operand(dst, src);4514}45154516void Assembler::emit_vex_arith(int opcode, XMMRegister dst, XMMRegister nds,4517XMMRegister src, VexSimdPrefix pre, bool vector256) {4518int encode = vex_prefix_and_encode(dst, nds, src, pre, vector256);4519emit_int8(opcode);4520emit_int8((unsigned char)(0xC0 | encode));4521}45224523#ifndef _LP6445244525void Assembler::incl(Register dst) {4526// Don't use it directly. Use MacroAssembler::incrementl() instead.4527emit_int8(0x40 | dst->encoding());4528}45294530void Assembler::lea(Register dst, Address src) {4531leal(dst, src);4532}45334534void Assembler::mov_literal32(Address dst, int32_t imm32, RelocationHolder const& rspec) {4535InstructionMark im(this);4536emit_int8((unsigned char)0xC7);4537emit_operand(rax, dst);4538emit_data((int)imm32, rspec, 0);4539}45404541void Assembler::mov_literal32(Register dst, int32_t imm32, RelocationHolder const& rspec) {4542InstructionMark im(this);4543int encode = prefix_and_encode(dst->encoding());4544emit_int8((unsigned char)(0xB8 | encode));4545emit_data((int)imm32, rspec, 0);4546}45474548void Assembler::popa() { // 32bit4549emit_int8(0x61);4550}45514552void Assembler::push_literal32(int32_t imm32, RelocationHolder const& rspec) {4553InstructionMark im(this);4554emit_int8(0x68);4555emit_data(imm32, rspec, 0);4556}45574558void Assembler::pusha() { // 32bit4559emit_int8(0x60);4560}45614562void Assembler::set_byte_if_not_zero(Register dst) {4563emit_int8(0x0F);4564emit_int8((unsigned char)0x95);4565emit_int8((unsigned char)(0xE0 | dst->encoding()));4566}45674568void Assembler::shldl(Register dst, Register src) {4569emit_int8(0x0F);4570emit_int8((unsigned char)0xA5);4571emit_int8((unsigned char)(0xC0 | src->encoding() << 3 | dst->encoding()));4572}45734574void Assembler::shrdl(Register dst, Register src) {4575emit_int8(0x0F);4576emit_int8((unsigned char)0xAD);4577emit_int8((unsigned char)(0xC0 | src->encoding() << 3 | dst->encoding()));4578}45794580#else // LP6445814582void Assembler::set_byte_if_not_zero(Register dst) {4583int enc = prefix_and_encode(dst->encoding(), true);4584emit_int8(0x0F);4585emit_int8((unsigned char)0x95);4586emit_int8((unsigned char)(0xE0 | enc));4587}45884589// 64bit only pieces of the assembler4590// This should only be used by 64bit instructions that can use rip-relative4591// it cannot be used by instructions that want an immediate value.45924593bool Assembler::reachable(AddressLiteral adr) {4594int64_t disp;4595// None will force a 64bit literal to the code stream. Likely a placeholder4596// for something that will be patched later and we need to certain it will4597// always be reachable.4598if (adr.reloc() == relocInfo::none) {4599return false;4600}4601if (adr.reloc() == relocInfo::internal_word_type) {4602// This should be rip relative and easily reachable.4603return true;4604}4605if (adr.reloc() == relocInfo::virtual_call_type ||4606adr.reloc() == relocInfo::opt_virtual_call_type ||4607adr.reloc() == relocInfo::static_call_type ||4608adr.reloc() == relocInfo::static_stub_type ) {4609// This should be rip relative within the code cache and easily4610// reachable until we get huge code caches. (At which point4611// ic code is going to have issues).4612return true;4613}4614if (adr.reloc() != relocInfo::external_word_type &&4615adr.reloc() != relocInfo::poll_return_type && // these are really external_word but need special4616adr.reloc() != relocInfo::poll_type && // relocs to identify them4617adr.reloc() != relocInfo::runtime_call_type ) {4618return false;4619}46204621// Stress the correction code4622if (ForceUnreachable) {4623// Must be runtimecall reloc, see if it is in the codecache4624// Flipping stuff in the codecache to be unreachable causes issues4625// with things like inline caches where the additional instructions4626// are not handled.4627if (CodeCache::find_blob(adr._target) == NULL) {4628return false;4629}4630}4631// For external_word_type/runtime_call_type if it is reachable from where we4632// are now (possibly a temp buffer) and where we might end up4633// anywhere in the codeCache then we are always reachable.4634// This would have to change if we ever save/restore shared code4635// to be more pessimistic.4636disp = (int64_t)adr._target - ((int64_t)CodeCache::low_bound() + sizeof(int));4637if (!is_simm32(disp)) return false;4638disp = (int64_t)adr._target - ((int64_t)CodeCache::high_bound() + sizeof(int));4639if (!is_simm32(disp)) return false;46404641disp = (int64_t)adr._target - ((int64_t)pc() + sizeof(int));46424643// Because rip relative is a disp + address_of_next_instruction and we4644// don't know the value of address_of_next_instruction we apply a fudge factor4645// to make sure we will be ok no matter the size of the instruction we get placed into.4646// We don't have to fudge the checks above here because they are already worst case.46474648// 12 == override/rex byte, opcode byte, rm byte, sib byte, a 4-byte disp , 4-byte literal4649// + 4 because better safe than sorry.4650const int fudge = 12 + 4;4651if (disp < 0) {4652disp -= fudge;4653} else {4654disp += fudge;4655}4656return is_simm32(disp);4657}46584659// Check if the polling page is not reachable from the code cache using rip-relative4660// addressing.4661bool Assembler::is_polling_page_far() {4662intptr_t addr = (intptr_t)os::get_polling_page();4663return ForceUnreachable ||4664!is_simm32(addr - (intptr_t)CodeCache::low_bound()) ||4665!is_simm32(addr - (intptr_t)CodeCache::high_bound());4666}46674668void Assembler::emit_data64(jlong data,4669relocInfo::relocType rtype,4670int format) {4671if (rtype == relocInfo::none) {4672emit_int64(data);4673} else {4674emit_data64(data, Relocation::spec_simple(rtype), format);4675}4676}46774678void Assembler::emit_data64(jlong data,4679RelocationHolder const& rspec,4680int format) {4681assert(imm_operand == 0, "default format must be immediate in this file");4682assert(imm_operand == format, "must be immediate");4683assert(inst_mark() != NULL, "must be inside InstructionMark");4684// Do not use AbstractAssembler::relocate, which is not intended for4685// embedded words. Instead, relocate to the enclosing instruction.4686code_section()->relocate(inst_mark(), rspec, format);4687#ifdef ASSERT4688check_relocation(rspec, format);4689#endif4690emit_int64(data);4691}46924693int Assembler::prefix_and_encode(int reg_enc, bool byteinst) {4694if (reg_enc >= 8) {4695prefix(REX_B);4696reg_enc -= 8;4697} else if (byteinst && reg_enc >= 4) {4698prefix(REX);4699}4700return reg_enc;4701}47024703int Assembler::prefixq_and_encode(int reg_enc) {4704if (reg_enc < 8) {4705prefix(REX_W);4706} else {4707prefix(REX_WB);4708reg_enc -= 8;4709}4710return reg_enc;4711}47124713int Assembler::prefix_and_encode(int dst_enc, int src_enc, bool byteinst) {4714if (dst_enc < 8) {4715if (src_enc >= 8) {4716prefix(REX_B);4717src_enc -= 8;4718} else if (byteinst && src_enc >= 4) {4719prefix(REX);4720}4721} else {4722if (src_enc < 8) {4723prefix(REX_R);4724} else {4725prefix(REX_RB);4726src_enc -= 8;4727}4728dst_enc -= 8;4729}4730return dst_enc << 3 | src_enc;4731}47324733int Assembler::prefixq_and_encode(int dst_enc, int src_enc) {4734if (dst_enc < 8) {4735if (src_enc < 8) {4736prefix(REX_W);4737} else {4738prefix(REX_WB);4739src_enc -= 8;4740}4741} else {4742if (src_enc < 8) {4743prefix(REX_WR);4744} else {4745prefix(REX_WRB);4746src_enc -= 8;4747}4748dst_enc -= 8;4749}4750return dst_enc << 3 | src_enc;4751}47524753void Assembler::prefix(Register reg) {4754if (reg->encoding() >= 8) {4755prefix(REX_B);4756}4757}47584759void Assembler::prefix(Address adr) {4760if (adr.base_needs_rex()) {4761if (adr.index_needs_rex()) {4762prefix(REX_XB);4763} else {4764prefix(REX_B);4765}4766} else {4767if (adr.index_needs_rex()) {4768prefix(REX_X);4769}4770}4771}47724773void Assembler::prefixq(Address adr) {4774if (adr.base_needs_rex()) {4775if (adr.index_needs_rex()) {4776prefix(REX_WXB);4777} else {4778prefix(REX_WB);4779}4780} else {4781if (adr.index_needs_rex()) {4782prefix(REX_WX);4783} else {4784prefix(REX_W);4785}4786}4787}478847894790void Assembler::prefix(Address adr, Register reg, bool byteinst) {4791if (reg->encoding() < 8) {4792if (adr.base_needs_rex()) {4793if (adr.index_needs_rex()) {4794prefix(REX_XB);4795} else {4796prefix(REX_B);4797}4798} else {4799if (adr.index_needs_rex()) {4800prefix(REX_X);4801} else if (byteinst && reg->encoding() >= 4 ) {4802prefix(REX);4803}4804}4805} else {4806if (adr.base_needs_rex()) {4807if (adr.index_needs_rex()) {4808prefix(REX_RXB);4809} else {4810prefix(REX_RB);4811}4812} else {4813if (adr.index_needs_rex()) {4814prefix(REX_RX);4815} else {4816prefix(REX_R);4817}4818}4819}4820}48214822void Assembler::prefixq(Address adr, Register src) {4823if (src->encoding() < 8) {4824if (adr.base_needs_rex()) {4825if (adr.index_needs_rex()) {4826prefix(REX_WXB);4827} else {4828prefix(REX_WB);4829}4830} else {4831if (adr.index_needs_rex()) {4832prefix(REX_WX);4833} else {4834prefix(REX_W);4835}4836}4837} else {4838if (adr.base_needs_rex()) {4839if (adr.index_needs_rex()) {4840prefix(REX_WRXB);4841} else {4842prefix(REX_WRB);4843}4844} else {4845if (adr.index_needs_rex()) {4846prefix(REX_WRX);4847} else {4848prefix(REX_WR);4849}4850}4851}4852}48534854void Assembler::prefix(Address adr, XMMRegister reg) {4855if (reg->encoding() < 8) {4856if (adr.base_needs_rex()) {4857if (adr.index_needs_rex()) {4858prefix(REX_XB);4859} else {4860prefix(REX_B);4861}4862} else {4863if (adr.index_needs_rex()) {4864prefix(REX_X);4865}4866}4867} else {4868if (adr.base_needs_rex()) {4869if (adr.index_needs_rex()) {4870prefix(REX_RXB);4871} else {4872prefix(REX_RB);4873}4874} else {4875if (adr.index_needs_rex()) {4876prefix(REX_RX);4877} else {4878prefix(REX_R);4879}4880}4881}4882}48834884void Assembler::prefixq(Address adr, XMMRegister src) {4885if (src->encoding() < 8) {4886if (adr.base_needs_rex()) {4887if (adr.index_needs_rex()) {4888prefix(REX_WXB);4889} else {4890prefix(REX_WB);4891}4892} else {4893if (adr.index_needs_rex()) {4894prefix(REX_WX);4895} else {4896prefix(REX_W);4897}4898}4899} else {4900if (adr.base_needs_rex()) {4901if (adr.index_needs_rex()) {4902prefix(REX_WRXB);4903} else {4904prefix(REX_WRB);4905}4906} else {4907if (adr.index_needs_rex()) {4908prefix(REX_WRX);4909} else {4910prefix(REX_WR);4911}4912}4913}4914}49154916void Assembler::adcq(Register dst, int32_t imm32) {4917(void) prefixq_and_encode(dst->encoding());4918emit_arith(0x81, 0xD0, dst, imm32);4919}49204921void Assembler::adcq(Register dst, Address src) {4922InstructionMark im(this);4923prefixq(src, dst);4924emit_int8(0x13);4925emit_operand(dst, src);4926}49274928void Assembler::adcq(Register dst, Register src) {4929(void) prefixq_and_encode(dst->encoding(), src->encoding());4930emit_arith(0x13, 0xC0, dst, src);4931}49324933void Assembler::addq(Address dst, int32_t imm32) {4934InstructionMark im(this);4935prefixq(dst);4936emit_arith_operand(0x81, rax, dst,imm32);4937}49384939void Assembler::addq(Address dst, Register src) {4940InstructionMark im(this);4941prefixq(dst, src);4942emit_int8(0x01);4943emit_operand(src, dst);4944}49454946void Assembler::addq(Register dst, int32_t imm32) {4947(void) prefixq_and_encode(dst->encoding());4948emit_arith(0x81, 0xC0, dst, imm32);4949}49504951void Assembler::addq(Register dst, Address src) {4952InstructionMark im(this);4953prefixq(src, dst);4954emit_int8(0x03);4955emit_operand(dst, src);4956}49574958void Assembler::addq(Register dst, Register src) {4959(void) prefixq_and_encode(dst->encoding(), src->encoding());4960emit_arith(0x03, 0xC0, dst, src);4961}49624963void Assembler::adcxq(Register dst, Register src) {4964//assert(VM_Version::supports_adx(), "adx instructions not supported");4965emit_int8((unsigned char)0x66);4966int encode = prefixq_and_encode(dst->encoding(), src->encoding());4967emit_int8(0x0F);4968emit_int8(0x38);4969emit_int8((unsigned char)0xF6);4970emit_int8((unsigned char)(0xC0 | encode));4971}49724973void Assembler::adoxq(Register dst, Register src) {4974//assert(VM_Version::supports_adx(), "adx instructions not supported");4975emit_int8((unsigned char)0xF3);4976int encode = prefixq_and_encode(dst->encoding(), src->encoding());4977emit_int8(0x0F);4978emit_int8(0x38);4979emit_int8((unsigned char)0xF6);4980emit_int8((unsigned char)(0xC0 | encode));4981}49824983void Assembler::andq(Address dst, int32_t imm32) {4984InstructionMark im(this);4985prefixq(dst);4986emit_int8((unsigned char)0x81);4987emit_operand(rsp, dst, 4);4988emit_int32(imm32);4989}49904991void Assembler::andq(Register dst, int32_t imm32) {4992(void) prefixq_and_encode(dst->encoding());4993emit_arith(0x81, 0xE0, dst, imm32);4994}49954996void Assembler::andq(Register dst, Address src) {4997InstructionMark im(this);4998prefixq(src, dst);4999emit_int8(0x23);5000emit_operand(dst, src);5001}50025003void Assembler::andq(Register dst, Register src) {5004(void) prefixq_and_encode(dst->encoding(), src->encoding());5005emit_arith(0x23, 0xC0, dst, src);5006}50075008void Assembler::andnq(Register dst, Register src1, Register src2) {5009assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");5010int encode = vex_prefix_0F38_and_encode_q(dst, src1, src2);5011emit_int8((unsigned char)0xF2);5012emit_int8((unsigned char)(0xC0 | encode));5013}50145015void Assembler::andnq(Register dst, Register src1, Address src2) {5016InstructionMark im(this);5017assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");5018vex_prefix_0F38_q(dst, src1, src2);5019emit_int8((unsigned char)0xF2);5020emit_operand(dst, src2);5021}50225023void Assembler::bsfq(Register dst, Register src) {5024int encode = prefixq_and_encode(dst->encoding(), src->encoding());5025emit_int8(0x0F);5026emit_int8((unsigned char)0xBC);5027emit_int8((unsigned char)(0xC0 | encode));5028}50295030void Assembler::bsrq(Register dst, Register src) {5031int encode = prefixq_and_encode(dst->encoding(), src->encoding());5032emit_int8(0x0F);5033emit_int8((unsigned char)0xBD);5034emit_int8((unsigned char)(0xC0 | encode));5035}50365037void Assembler::bswapq(Register reg) {5038int encode = prefixq_and_encode(reg->encoding());5039emit_int8(0x0F);5040emit_int8((unsigned char)(0xC8 | encode));5041}50425043void Assembler::blsiq(Register dst, Register src) {5044assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");5045int encode = vex_prefix_0F38_and_encode_q(rbx, dst, src);5046emit_int8((unsigned char)0xF3);5047emit_int8((unsigned char)(0xC0 | encode));5048}50495050void Assembler::blsiq(Register dst, Address src) {5051InstructionMark im(this);5052assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");5053vex_prefix_0F38_q(rbx, dst, src);5054emit_int8((unsigned char)0xF3);5055emit_operand(rbx, src);5056}50575058void Assembler::blsmskq(Register dst, Register src) {5059assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");5060int encode = vex_prefix_0F38_and_encode_q(rdx, dst, src);5061emit_int8((unsigned char)0xF3);5062emit_int8((unsigned char)(0xC0 | encode));5063}50645065void Assembler::blsmskq(Register dst, Address src) {5066InstructionMark im(this);5067assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");5068vex_prefix_0F38_q(rdx, dst, src);5069emit_int8((unsigned char)0xF3);5070emit_operand(rdx, src);5071}50725073void Assembler::blsrq(Register dst, Register src) {5074assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");5075int encode = vex_prefix_0F38_and_encode_q(rcx, dst, src);5076emit_int8((unsigned char)0xF3);5077emit_int8((unsigned char)(0xC0 | encode));5078}50795080void Assembler::blsrq(Register dst, Address src) {5081InstructionMark im(this);5082assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported");5083vex_prefix_0F38_q(rcx, dst, src);5084emit_int8((unsigned char)0xF3);5085emit_operand(rcx, src);5086}50875088void Assembler::cdqq() {5089prefix(REX_W);5090emit_int8((unsigned char)0x99);5091}50925093void Assembler::clflush(Address adr) {5094prefix(adr);5095emit_int8(0x0F);5096emit_int8((unsigned char)0xAE);5097emit_operand(rdi, adr);5098}50995100void Assembler::cmovq(Condition cc, Register dst, Register src) {5101int encode = prefixq_and_encode(dst->encoding(), src->encoding());5102emit_int8(0x0F);5103emit_int8(0x40 | cc);5104emit_int8((unsigned char)(0xC0 | encode));5105}51065107void Assembler::cmovq(Condition cc, Register dst, Address src) {5108InstructionMark im(this);5109prefixq(src, dst);5110emit_int8(0x0F);5111emit_int8(0x40 | cc);5112emit_operand(dst, src);5113}51145115void Assembler::cmpq(Address dst, int32_t imm32) {5116InstructionMark im(this);5117prefixq(dst);5118emit_int8((unsigned char)0x81);5119emit_operand(rdi, dst, 4);5120emit_int32(imm32);5121}51225123void Assembler::cmpq(Register dst, int32_t imm32) {5124(void) prefixq_and_encode(dst->encoding());5125emit_arith(0x81, 0xF8, dst, imm32);5126}51275128void Assembler::cmpq(Address dst, Register src) {5129InstructionMark im(this);5130prefixq(dst, src);5131emit_int8(0x3B);5132emit_operand(src, dst);5133}51345135void Assembler::cmpq(Register dst, Register src) {5136(void) prefixq_and_encode(dst->encoding(), src->encoding());5137emit_arith(0x3B, 0xC0, dst, src);5138}51395140void Assembler::cmpq(Register dst, Address src) {5141InstructionMark im(this);5142prefixq(src, dst);5143emit_int8(0x3B);5144emit_operand(dst, src);5145}51465147void Assembler::cmpxchgq(Register reg, Address adr) {5148InstructionMark im(this);5149prefixq(adr, reg);5150emit_int8(0x0F);5151emit_int8((unsigned char)0xB1);5152emit_operand(reg, adr);5153}51545155void Assembler::cvtsi2sdq(XMMRegister dst, Register src) {5156NOT_LP64(assert(VM_Version::supports_sse2(), ""));5157int encode = simd_prefix_and_encode_q(dst, dst, src, VEX_SIMD_F2);5158emit_int8(0x2A);5159emit_int8((unsigned char)(0xC0 | encode));5160}51615162void Assembler::cvtsi2sdq(XMMRegister dst, Address src) {5163NOT_LP64(assert(VM_Version::supports_sse2(), ""));5164InstructionMark im(this);5165simd_prefix_q(dst, dst, src, VEX_SIMD_F2);5166emit_int8(0x2A);5167emit_operand(dst, src);5168}51695170void Assembler::cvtsi2ssq(XMMRegister dst, Register src) {5171NOT_LP64(assert(VM_Version::supports_sse(), ""));5172int encode = simd_prefix_and_encode_q(dst, dst, src, VEX_SIMD_F3);5173emit_int8(0x2A);5174emit_int8((unsigned char)(0xC0 | encode));5175}51765177void Assembler::cvtsi2ssq(XMMRegister dst, Address src) {5178NOT_LP64(assert(VM_Version::supports_sse(), ""));5179InstructionMark im(this);5180simd_prefix_q(dst, dst, src, VEX_SIMD_F3);5181emit_int8(0x2A);5182emit_operand(dst, src);5183}51845185void Assembler::cvttsd2siq(Register dst, XMMRegister src) {5186NOT_LP64(assert(VM_Version::supports_sse2(), ""));5187int encode = simd_prefix_and_encode_q(dst, src, VEX_SIMD_F2);5188emit_int8(0x2C);5189emit_int8((unsigned char)(0xC0 | encode));5190}51915192void Assembler::cvttss2siq(Register dst, XMMRegister src) {5193NOT_LP64(assert(VM_Version::supports_sse(), ""));5194int encode = simd_prefix_and_encode_q(dst, src, VEX_SIMD_F3);5195emit_int8(0x2C);5196emit_int8((unsigned char)(0xC0 | encode));5197}51985199void Assembler::decl(Register dst) {5200// Don't use it directly. Use MacroAssembler::decrementl() instead.5201// Use two-byte form (one-byte form is a REX prefix in 64-bit mode)5202int encode = prefix_and_encode(dst->encoding());5203emit_int8((unsigned char)0xFF);5204emit_int8((unsigned char)(0xC8 | encode));5205}52065207void Assembler::decq(Register dst) {5208// Don't use it directly. Use MacroAssembler::decrementq() instead.5209// Use two-byte form (one-byte from is a REX prefix in 64-bit mode)5210int encode = prefixq_and_encode(dst->encoding());5211emit_int8((unsigned char)0xFF);5212emit_int8(0xC8 | encode);5213}52145215void Assembler::decq(Address dst) {5216// Don't use it directly. Use MacroAssembler::decrementq() instead.5217InstructionMark im(this);5218prefixq(dst);5219emit_int8((unsigned char)0xFF);5220emit_operand(rcx, dst);5221}52225223void Assembler::fxrstor(Address src) {5224prefixq(src);5225emit_int8(0x0F);5226emit_int8((unsigned char)0xAE);5227emit_operand(as_Register(1), src);5228}52295230void Assembler::fxsave(Address dst) {5231prefixq(dst);5232emit_int8(0x0F);5233emit_int8((unsigned char)0xAE);5234emit_operand(as_Register(0), dst);5235}52365237void Assembler::idivq(Register src) {5238int encode = prefixq_and_encode(src->encoding());5239emit_int8((unsigned char)0xF7);5240emit_int8((unsigned char)(0xF8 | encode));5241}52425243void Assembler::imulq(Register dst, Register src) {5244int encode = prefixq_and_encode(dst->encoding(), src->encoding());5245emit_int8(0x0F);5246emit_int8((unsigned char)0xAF);5247emit_int8((unsigned char)(0xC0 | encode));5248}52495250void Assembler::imulq(Register dst, Register src, int value) {5251int encode = prefixq_and_encode(dst->encoding(), src->encoding());5252if (is8bit(value)) {5253emit_int8(0x6B);5254emit_int8((unsigned char)(0xC0 | encode));5255emit_int8(value & 0xFF);5256} else {5257emit_int8(0x69);5258emit_int8((unsigned char)(0xC0 | encode));5259emit_int32(value);5260}5261}52625263void Assembler::imulq(Register dst, Address src) {5264InstructionMark im(this);5265prefixq(src, dst);5266emit_int8(0x0F);5267emit_int8((unsigned char) 0xAF);5268emit_operand(dst, src);5269}52705271void Assembler::incl(Register dst) {5272// Don't use it directly. Use MacroAssembler::incrementl() instead.5273// Use two-byte form (one-byte from is a REX prefix in 64-bit mode)5274int encode = prefix_and_encode(dst->encoding());5275emit_int8((unsigned char)0xFF);5276emit_int8((unsigned char)(0xC0 | encode));5277}52785279void Assembler::incq(Register dst) {5280// Don't use it directly. Use MacroAssembler::incrementq() instead.5281// Use two-byte form (one-byte from is a REX prefix in 64-bit mode)5282int encode = prefixq_and_encode(dst->encoding());5283emit_int8((unsigned char)0xFF);5284emit_int8((unsigned char)(0xC0 | encode));5285}52865287void Assembler::incq(Address dst) {5288// Don't use it directly. Use MacroAssembler::incrementq() instead.5289InstructionMark im(this);5290prefixq(dst);5291emit_int8((unsigned char)0xFF);5292emit_operand(rax, dst);5293}52945295void Assembler::lea(Register dst, Address src) {5296leaq(dst, src);5297}52985299void Assembler::leaq(Register dst, Address src) {5300InstructionMark im(this);5301prefixq(src, dst);5302emit_int8((unsigned char)0x8D);5303emit_operand(dst, src);5304}53055306void Assembler::mov64(Register dst, int64_t imm64) {5307InstructionMark im(this);5308int encode = prefixq_and_encode(dst->encoding());5309emit_int8((unsigned char)(0xB8 | encode));5310emit_int64(imm64);5311}53125313void Assembler::mov_literal64(Register dst, intptr_t imm64, RelocationHolder const& rspec) {5314InstructionMark im(this);5315int encode = prefixq_and_encode(dst->encoding());5316emit_int8(0xB8 | encode);5317emit_data64(imm64, rspec);5318}53195320void Assembler::mov_narrow_oop(Register dst, int32_t imm32, RelocationHolder const& rspec) {5321InstructionMark im(this);5322int encode = prefix_and_encode(dst->encoding());5323emit_int8((unsigned char)(0xB8 | encode));5324emit_data((int)imm32, rspec, narrow_oop_operand);5325}53265327void Assembler::mov_narrow_oop(Address dst, int32_t imm32, RelocationHolder const& rspec) {5328InstructionMark im(this);5329prefix(dst);5330emit_int8((unsigned char)0xC7);5331emit_operand(rax, dst, 4);5332emit_data((int)imm32, rspec, narrow_oop_operand);5333}53345335void Assembler::cmp_narrow_oop(Register src1, int32_t imm32, RelocationHolder const& rspec) {5336InstructionMark im(this);5337int encode = prefix_and_encode(src1->encoding());5338emit_int8((unsigned char)0x81);5339emit_int8((unsigned char)(0xF8 | encode));5340emit_data((int)imm32, rspec, narrow_oop_operand);5341}53425343void Assembler::cmp_narrow_oop(Address src1, int32_t imm32, RelocationHolder const& rspec) {5344InstructionMark im(this);5345prefix(src1);5346emit_int8((unsigned char)0x81);5347emit_operand(rax, src1, 4);5348emit_data((int)imm32, rspec, narrow_oop_operand);5349}53505351void Assembler::lzcntq(Register dst, Register src) {5352assert(VM_Version::supports_lzcnt(), "encoding is treated as BSR");5353emit_int8((unsigned char)0xF3);5354int encode = prefixq_and_encode(dst->encoding(), src->encoding());5355emit_int8(0x0F);5356emit_int8((unsigned char)0xBD);5357emit_int8((unsigned char)(0xC0 | encode));5358}53595360void Assembler::movdq(XMMRegister dst, Register src) {5361// table D-1 says MMX/SSE25362NOT_LP64(assert(VM_Version::supports_sse2(), ""));5363int encode = simd_prefix_and_encode_q(dst, src, VEX_SIMD_66);5364emit_int8(0x6E);5365emit_int8((unsigned char)(0xC0 | encode));5366}53675368void Assembler::movdq(Register dst, XMMRegister src) {5369// table D-1 says MMX/SSE25370NOT_LP64(assert(VM_Version::supports_sse2(), ""));5371// swap src/dst to get correct prefix5372int encode = simd_prefix_and_encode_q(src, dst, VEX_SIMD_66);5373emit_int8(0x7E);5374emit_int8((unsigned char)(0xC0 | encode));5375}53765377void Assembler::movq(Register dst, Register src) {5378int encode = prefixq_and_encode(dst->encoding(), src->encoding());5379emit_int8((unsigned char)0x8B);5380emit_int8((unsigned char)(0xC0 | encode));5381}53825383void Assembler::movq(Register dst, Address src) {5384InstructionMark im(this);5385prefixq(src, dst);5386emit_int8((unsigned char)0x8B);5387emit_operand(dst, src);5388}53895390void Assembler::movq(Address dst, Register src) {5391InstructionMark im(this);5392prefixq(dst, src);5393emit_int8((unsigned char)0x89);5394emit_operand(src, dst);5395}53965397void Assembler::movsbq(Register dst, Address src) {5398InstructionMark im(this);5399prefixq(src, dst);5400emit_int8(0x0F);5401emit_int8((unsigned char)0xBE);5402emit_operand(dst, src);5403}54045405void Assembler::movsbq(Register dst, Register src) {5406int encode = prefixq_and_encode(dst->encoding(), src->encoding());5407emit_int8(0x0F);5408emit_int8((unsigned char)0xBE);5409emit_int8((unsigned char)(0xC0 | encode));5410}54115412void Assembler::movslq(Register dst, int32_t imm32) {5413// dbx shows movslq(rcx, 3) as movq $0x0000000049000000,(%rbx)5414// and movslq(r8, 3); as movl $0x0000000048000000,(%rbx)5415// as a result we shouldn't use until tested at runtime...5416ShouldNotReachHere();5417InstructionMark im(this);5418int encode = prefixq_and_encode(dst->encoding());5419emit_int8((unsigned char)(0xC7 | encode));5420emit_int32(imm32);5421}54225423void Assembler::movslq(Address dst, int32_t imm32) {5424assert(is_simm32(imm32), "lost bits");5425InstructionMark im(this);5426prefixq(dst);5427emit_int8((unsigned char)0xC7);5428emit_operand(rax, dst, 4);5429emit_int32(imm32);5430}54315432void Assembler::movslq(Register dst, Address src) {5433InstructionMark im(this);5434prefixq(src, dst);5435emit_int8(0x63);5436emit_operand(dst, src);5437}54385439void Assembler::movslq(Register dst, Register src) {5440int encode = prefixq_and_encode(dst->encoding(), src->encoding());5441emit_int8(0x63);5442emit_int8((unsigned char)(0xC0 | encode));5443}54445445void Assembler::movswq(Register dst, Address src) {5446InstructionMark im(this);5447prefixq(src, dst);5448emit_int8(0x0F);5449emit_int8((unsigned char)0xBF);5450emit_operand(dst, src);5451}54525453void Assembler::movswq(Register dst, Register src) {5454int encode = prefixq_and_encode(dst->encoding(), src->encoding());5455emit_int8((unsigned char)0x0F);5456emit_int8((unsigned char)0xBF);5457emit_int8((unsigned char)(0xC0 | encode));5458}54595460void Assembler::movzbq(Register dst, Address src) {5461InstructionMark im(this);5462prefixq(src, dst);5463emit_int8((unsigned char)0x0F);5464emit_int8((unsigned char)0xB6);5465emit_operand(dst, src);5466}54675468void Assembler::movzbq(Register dst, Register src) {5469int encode = prefixq_and_encode(dst->encoding(), src->encoding());5470emit_int8(0x0F);5471emit_int8((unsigned char)0xB6);5472emit_int8(0xC0 | encode);5473}54745475void Assembler::movzwq(Register dst, Address src) {5476InstructionMark im(this);5477prefixq(src, dst);5478emit_int8((unsigned char)0x0F);5479emit_int8((unsigned char)0xB7);5480emit_operand(dst, src);5481}54825483void Assembler::movzwq(Register dst, Register src) {5484int encode = prefixq_and_encode(dst->encoding(), src->encoding());5485emit_int8((unsigned char)0x0F);5486emit_int8((unsigned char)0xB7);5487emit_int8((unsigned char)(0xC0 | encode));5488}54895490void Assembler::mulq(Address src) {5491InstructionMark im(this);5492prefixq(src);5493emit_int8((unsigned char)0xF7);5494emit_operand(rsp, src);5495}54965497void Assembler::mulq(Register src) {5498int encode = prefixq_and_encode(src->encoding());5499emit_int8((unsigned char)0xF7);5500emit_int8((unsigned char)(0xE0 | encode));5501}55025503void Assembler::mulxq(Register dst1, Register dst2, Register src) {5504assert(VM_Version::supports_bmi2(), "bit manipulation instructions not supported");5505int encode = vex_prefix_and_encode(dst1->encoding(), dst2->encoding(), src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F_38, true, false);5506emit_int8((unsigned char)0xF6);5507emit_int8((unsigned char)(0xC0 | encode));5508}55095510void Assembler::negq(Register dst) {5511int encode = prefixq_and_encode(dst->encoding());5512emit_int8((unsigned char)0xF7);5513emit_int8((unsigned char)(0xD8 | encode));5514}55155516void Assembler::notq(Register dst) {5517int encode = prefixq_and_encode(dst->encoding());5518emit_int8((unsigned char)0xF7);5519emit_int8((unsigned char)(0xD0 | encode));5520}55215522void Assembler::orq(Address dst, int32_t imm32) {5523InstructionMark im(this);5524prefixq(dst);5525emit_int8((unsigned char)0x81);5526emit_operand(rcx, dst, 4);5527emit_int32(imm32);5528}55295530void Assembler::orq(Register dst, int32_t imm32) {5531(void) prefixq_and_encode(dst->encoding());5532emit_arith(0x81, 0xC8, dst, imm32);5533}55345535void Assembler::orq(Register dst, Address src) {5536InstructionMark im(this);5537prefixq(src, dst);5538emit_int8(0x0B);5539emit_operand(dst, src);5540}55415542void Assembler::orq(Register dst, Register src) {5543(void) prefixq_and_encode(dst->encoding(), src->encoding());5544emit_arith(0x0B, 0xC0, dst, src);5545}55465547void Assembler::popa() { // 64bit5548movq(r15, Address(rsp, 0));5549movq(r14, Address(rsp, wordSize));5550movq(r13, Address(rsp, 2 * wordSize));5551movq(r12, Address(rsp, 3 * wordSize));5552movq(r11, Address(rsp, 4 * wordSize));5553movq(r10, Address(rsp, 5 * wordSize));5554movq(r9, Address(rsp, 6 * wordSize));5555movq(r8, Address(rsp, 7 * wordSize));5556movq(rdi, Address(rsp, 8 * wordSize));5557movq(rsi, Address(rsp, 9 * wordSize));5558movq(rbp, Address(rsp, 10 * wordSize));5559// skip rsp5560movq(rbx, Address(rsp, 12 * wordSize));5561movq(rdx, Address(rsp, 13 * wordSize));5562movq(rcx, Address(rsp, 14 * wordSize));5563movq(rax, Address(rsp, 15 * wordSize));55645565addq(rsp, 16 * wordSize);5566}55675568void Assembler::popcntq(Register dst, Address src) {5569assert(VM_Version::supports_popcnt(), "must support");5570InstructionMark im(this);5571emit_int8((unsigned char)0xF3);5572prefixq(src, dst);5573emit_int8((unsigned char)0x0F);5574emit_int8((unsigned char)0xB8);5575emit_operand(dst, src);5576}55775578void Assembler::popcntq(Register dst, Register src) {5579assert(VM_Version::supports_popcnt(), "must support");5580emit_int8((unsigned char)0xF3);5581int encode = prefixq_and_encode(dst->encoding(), src->encoding());5582emit_int8((unsigned char)0x0F);5583emit_int8((unsigned char)0xB8);5584emit_int8((unsigned char)(0xC0 | encode));5585}55865587void Assembler::popq(Address dst) {5588InstructionMark im(this);5589prefixq(dst);5590emit_int8((unsigned char)0x8F);5591emit_operand(rax, dst);5592}55935594void Assembler::pusha() { // 64bit5595// we have to store original rsp. ABI says that 128 bytes5596// below rsp are local scratch.5597movq(Address(rsp, -5 * wordSize), rsp);55985599subq(rsp, 16 * wordSize);56005601movq(Address(rsp, 15 * wordSize), rax);5602movq(Address(rsp, 14 * wordSize), rcx);5603movq(Address(rsp, 13 * wordSize), rdx);5604movq(Address(rsp, 12 * wordSize), rbx);5605// skip rsp5606movq(Address(rsp, 10 * wordSize), rbp);5607movq(Address(rsp, 9 * wordSize), rsi);5608movq(Address(rsp, 8 * wordSize), rdi);5609movq(Address(rsp, 7 * wordSize), r8);5610movq(Address(rsp, 6 * wordSize), r9);5611movq(Address(rsp, 5 * wordSize), r10);5612movq(Address(rsp, 4 * wordSize), r11);5613movq(Address(rsp, 3 * wordSize), r12);5614movq(Address(rsp, 2 * wordSize), r13);5615movq(Address(rsp, wordSize), r14);5616movq(Address(rsp, 0), r15);5617}56185619void Assembler::pushq(Address src) {5620InstructionMark im(this);5621prefixq(src);5622emit_int8((unsigned char)0xFF);5623emit_operand(rsi, src);5624}56255626void Assembler::rclq(Register dst, int imm8) {5627assert(isShiftCount(imm8 >> 1), "illegal shift count");5628int encode = prefixq_and_encode(dst->encoding());5629if (imm8 == 1) {5630emit_int8((unsigned char)0xD1);5631emit_int8((unsigned char)(0xD0 | encode));5632} else {5633emit_int8((unsigned char)0xC1);5634emit_int8((unsigned char)(0xD0 | encode));5635emit_int8(imm8);5636}5637}56385639void Assembler::rcrq(Register dst, int imm8) {5640assert(isShiftCount(imm8 >> 1), "illegal shift count");5641int encode = prefixq_and_encode(dst->encoding());5642if (imm8 == 1) {5643emit_int8((unsigned char)0xD1);5644emit_int8((unsigned char)(0xD8 | encode));5645} else {5646emit_int8((unsigned char)0xC1);5647emit_int8((unsigned char)(0xD8 | encode));5648emit_int8(imm8);5649}5650}56515652void Assembler::rorq(Register dst, int imm8) {5653assert(isShiftCount(imm8 >> 1), "illegal shift count");5654int encode = prefixq_and_encode(dst->encoding());5655if (imm8 == 1) {5656emit_int8((unsigned char)0xD1);5657emit_int8((unsigned char)(0xC8 | encode));5658} else {5659emit_int8((unsigned char)0xC1);5660emit_int8((unsigned char)(0xc8 | encode));5661emit_int8(imm8);5662}5663}56645665void Assembler::rorxq(Register dst, Register src, int imm8) {5666assert(VM_Version::supports_bmi2(), "bit manipulation instructions not supported");5667int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_F2, VEX_OPCODE_0F_3A, true, false);5668emit_int8((unsigned char)0xF0);5669emit_int8((unsigned char)(0xC0 | encode));5670emit_int8(imm8);5671}56725673void Assembler::sarq(Register dst, int imm8) {5674assert(isShiftCount(imm8 >> 1), "illegal shift count");5675int encode = prefixq_and_encode(dst->encoding());5676if (imm8 == 1) {5677emit_int8((unsigned char)0xD1);5678emit_int8((unsigned char)(0xF8 | encode));5679} else {5680emit_int8((unsigned char)0xC1);5681emit_int8((unsigned char)(0xF8 | encode));5682emit_int8(imm8);5683}5684}56855686void Assembler::sarq(Register dst) {5687int encode = prefixq_and_encode(dst->encoding());5688emit_int8((unsigned char)0xD3);5689emit_int8((unsigned char)(0xF8 | encode));5690}56915692void Assembler::sbbq(Address dst, int32_t imm32) {5693InstructionMark im(this);5694prefixq(dst);5695emit_arith_operand(0x81, rbx, dst, imm32);5696}56975698void Assembler::sbbq(Register dst, int32_t imm32) {5699(void) prefixq_and_encode(dst->encoding());5700emit_arith(0x81, 0xD8, dst, imm32);5701}57025703void Assembler::sbbq(Register dst, Address src) {5704InstructionMark im(this);5705prefixq(src, dst);5706emit_int8(0x1B);5707emit_operand(dst, src);5708}57095710void Assembler::sbbq(Register dst, Register src) {5711(void) prefixq_and_encode(dst->encoding(), src->encoding());5712emit_arith(0x1B, 0xC0, dst, src);5713}57145715void Assembler::shlq(Register dst, int imm8) {5716assert(isShiftCount(imm8 >> 1), "illegal shift count");5717int encode = prefixq_and_encode(dst->encoding());5718if (imm8 == 1) {5719emit_int8((unsigned char)0xD1);5720emit_int8((unsigned char)(0xE0 | encode));5721} else {5722emit_int8((unsigned char)0xC1);5723emit_int8((unsigned char)(0xE0 | encode));5724emit_int8(imm8);5725}5726}57275728void Assembler::shlq(Register dst) {5729int encode = prefixq_and_encode(dst->encoding());5730emit_int8((unsigned char)0xD3);5731emit_int8((unsigned char)(0xE0 | encode));5732}57335734void Assembler::shrq(Register dst, int imm8) {5735assert(isShiftCount(imm8 >> 1), "illegal shift count");5736int encode = prefixq_and_encode(dst->encoding());5737emit_int8((unsigned char)0xC1);5738emit_int8((unsigned char)(0xE8 | encode));5739emit_int8(imm8);5740}57415742void Assembler::shrq(Register dst) {5743int encode = prefixq_and_encode(dst->encoding());5744emit_int8((unsigned char)0xD3);5745emit_int8(0xE8 | encode);5746}57475748void Assembler::subq(Address dst, int32_t imm32) {5749InstructionMark im(this);5750prefixq(dst);5751emit_arith_operand(0x81, rbp, dst, imm32);5752}57535754void Assembler::subq(Address dst, Register src) {5755InstructionMark im(this);5756prefixq(dst, src);5757emit_int8(0x29);5758emit_operand(src, dst);5759}57605761void Assembler::subq(Register dst, int32_t imm32) {5762(void) prefixq_and_encode(dst->encoding());5763emit_arith(0x81, 0xE8, dst, imm32);5764}57655766// Force generation of a 4 byte immediate value even if it fits into 8bit5767void Assembler::subq_imm32(Register dst, int32_t imm32) {5768(void) prefixq_and_encode(dst->encoding());5769emit_arith_imm32(0x81, 0xE8, dst, imm32);5770}57715772void Assembler::subq(Register dst, Address src) {5773InstructionMark im(this);5774prefixq(src, dst);5775emit_int8(0x2B);5776emit_operand(dst, src);5777}57785779void Assembler::subq(Register dst, Register src) {5780(void) prefixq_and_encode(dst->encoding(), src->encoding());5781emit_arith(0x2B, 0xC0, dst, src);5782}57835784void Assembler::testq(Register dst, int32_t imm32) {5785// not using emit_arith because test5786// doesn't support sign-extension of5787// 8bit operands5788int encode = dst->encoding();5789if (encode == 0) {5790prefix(REX_W);5791emit_int8((unsigned char)0xA9);5792} else {5793encode = prefixq_and_encode(encode);5794emit_int8((unsigned char)0xF7);5795emit_int8((unsigned char)(0xC0 | encode));5796}5797emit_int32(imm32);5798}57995800void Assembler::testq(Register dst, Register src) {5801(void) prefixq_and_encode(dst->encoding(), src->encoding());5802emit_arith(0x85, 0xC0, dst, src);5803}58045805void Assembler::xaddq(Address dst, Register src) {5806InstructionMark im(this);5807prefixq(dst, src);5808emit_int8(0x0F);5809emit_int8((unsigned char)0xC1);5810emit_operand(src, dst);5811}58125813void Assembler::xchgq(Register dst, Address src) {5814InstructionMark im(this);5815prefixq(src, dst);5816emit_int8((unsigned char)0x87);5817emit_operand(dst, src);5818}58195820void Assembler::xchgq(Register dst, Register src) {5821int encode = prefixq_and_encode(dst->encoding(), src->encoding());5822emit_int8((unsigned char)0x87);5823emit_int8((unsigned char)(0xc0 | encode));5824}58255826void Assembler::xorq(Register dst, Register src) {5827(void) prefixq_and_encode(dst->encoding(), src->encoding());5828emit_arith(0x33, 0xC0, dst, src);5829}58305831void Assembler::xorq(Register dst, Address src) {5832InstructionMark im(this);5833prefixq(src, dst);5834emit_int8(0x33);5835emit_operand(dst, src);5836}58375838#endif // !LP64583958405841